Chắc hẳn bạn sử dụng Docker thì cũng đã biết đến Dockerhub, tuy nhiên image của chúng ta sẽ public nên như vậy chúng ta phải cần docker private registry server một nơi lưu trữ những docker image giúp bảo mật hơn và kiểm soát truy cập mình đã sử dụng docker private registry tự ký đơn giản trong Setup Gitlab CICD pipeline private registry và Setup Gitlab nội bộ.
Trong bài viết này chúng ta sẽ làm “chuyên nghiệp” hơn một xíu là sẽ sử dụng domain và một cách triển khai docker private registry server khác cũng rất thịnh hành, chúng ta cùng bắt đầu.
Nội dung
Chuẩn bị
Tài nguyên
- Hosting/Vps/Cloud – mình sử dụng EC2 t2.small (AWS)
- có public static IP
- 2GB RAM 1CPU 8GB Storage (thực tế phải hơn để đáp ứng được công việc)
- Domain – mình sử dụng luôn domain của mình là elroydevops.tech
- một domain bất kỳ, bạn mua cái rẻ 20k -50k cũng có đừng ngại chi tiền cho việc làm hands on nhé
- Email – dùng để xác nhận SSL
Kết quả:
- Docker private registry server có địa chỉ registry.elroydevops.tech (tương ứng với domain của bạn)
- Có giao diện quản lý và cách sử dụng công cụ này
Mình thấy web tenten.vn domain khá rẻ (dành cho làm hands on khá tốt)
Cách 1: Cài đặt sử dụng Docker private registry
Step 1: Tạo EC2
Vì mình luôn muốn những bài viết được chi tiết dễ hiểu nhất nên nếu bạn đã có server thì bỏ qua bước này nhé, xong nếu có bạn thắc mắc “dùng luôn ECR cho rồi” thì nhiều công ty mình thấy họ cũng chưa xài cloud nhiều nên mong rằng bài viết này hữu ích đến bạn.
Cấu hình như dưới đây, mình chọn ubuntu và nhớ allow SSH, HTTP, HTTPS nhé
Tạo key mới tên “registry-server-key” như sau download về lưu trữ lại nhé
Vậy là chúng ta đã có một server tuy nhiên là hiện tại IP vẫn chưa là IP tĩnh
Truy cập Elastic IP address để tạo một IPv4 nhấn Allocate
Chọn Associate Elastic IP address để gắn IP vừa tạo vào EC2
Chọn EC2 và nhấn Associate
Vậy là Server của chúng ta đã có IP Static
Chọn vào EC2 vừa tạo chọn Connect
Copy đoạn sau lại để tiến hành ssh vào server nhé
Bạn hãy truy cập thư mục vừa tải EC2 key về và chạy 2 lệnh sau nếu bạn sử dụng window nhé (macos và linux thì chạy lệnh chmod 400 registry-server-key.pem):
$ icacls registry-server-key.pem /remove "BUILTIN\Users"
xóa quyền truy cập của nhóm “BUILTIN\Users” khỏi tệp tin “registry-server-key.pem”
$ icacls registry-server-key.pem /inheritance:r /grant:r "%USERNAME%":"(R,W)"
gỡ bỏ quyền kế thừa từ thư mục cha và cấp quyền đọc và ghi (read and write) cho người dùng đang đăng nhập vào tệp tin “registry-server-key.pem”
$ ssh -i "registry-server-key.pem" ubuntu@ec2-18-136-88-89.ap-southeast-1.compute.amazonaws.com
tiến hành ssh vào server (chuỗi chúng ta vừa copy ở trên)
Step 2: Cài đặt docker private registry
$ sudo apt update -y
cập nhật các gói cài đặt
$ sudo apt install nginx docker.io docker-compose -y
tải nginx, docker và docker-compose thành công sẽ được
$ mkdir registry
tạo thư mục làm việc registry
$ cd registry
di chuyển đến thư mục
$ sudo vi docker-compose.yml
tạo file docker-compose.yml với nội dung sau
version: '3' services: registry: image: registry:2 restart: always container_name: registry-server ports: - "5000:5000" volumes: - ./datas:/var/lib/registry
$ mkdir datas
tạo thư mục datas để mount dữ liệu
$ sudo docker-compose up -d
chạy dịch vụ để khởi tạo container docker private registry
$ sudo docker ps
hoàn thành được kết quả như sau
Step 3: Reverse proxy cho docker private registry
Vậy là registry đã chạy tuy nhiên chưa thể hoạt động chúng ta tiếp tục dùng Nginx làm reverse proxy cho docker private registry
$ sudo vi /etc/nginx/sites-available/default
mở file và chỉnh sửa tệp sau để đổi port mặc định 80 thành 9999 của nginx như dưới đây (bạn đổi port khác 80 là được nhé)
$ cd /etc/nginx/conf.d/
truy cập thư mục đó để làm việc với các tệp cấu hình Nginx
$ sudo vi registry.elroydevops.tech.conf
tạo file config với cấu hình dưới đây
server { listen 80; server_name registry.elroydevops.tech; location / { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
$ sudo nginx -t && sudo systemctl reload nginx
áp dụng cấu hình Nginx mới
Truy cập http://IP/v2/_catalog tuy nhiên chỉ là http và chưa có tài khoản, mật khẩu xác thực mà docker private registry yêu cầu phải có https nên chúng ta tiến hành cấu hình tiếp
Step 4: Cấu hình domain cho docker private registry
Tiếp tục chúng ta tiến hành cấu hình HTTPS ở đây mình dùng Certbot để chứng thực HTTPS, bạn truy cập vào trang quản trị domain của bạn và cấu hình trỏ đến IP server
Bạn đừng có để ý là bạn sử dụng phần mềm, website nào quản lý domain nhé vì bản chất là như nhau làm việc chúng ta nên nhìn vào gốc dễ không phải cành lá mà cần phải giống giao diện mới làm được nhé
Bạn cấu hình như sau:
- Tên: registry
- Bản Ghi: A
- Giá trị: Trỏ đến IP public server của bạn (ở đây của mình là 18.136.88.89)
- Độ ưu tiên (nếu yêu cầu nhập): 3600
cấu hình này cho phép tên miền “registry” tức registry.<domain của bạn> (ex: registry.elroydevops.tech) trỏ đến địa chỉ IP công cộng của máy chủ (18.136.88.89) thông qua bản ghi A, và thông tin này sẽ được lưu trữ trong bộ nhớ cache của máy chủ DNS (3600 = 1h nhé).
$ sudo apt install apache2-utils certbot python3-certbot-nginx -y
tải apache2-untils dùng để tạo tài khoản mật khẩu đăng nhập vào docker private registry và tải Certbot để chứng thực HTTPS (Let’s Encrypt là một dịch vụ cung cấp chứng chỉ SSL/TLS miễn phí, và Certbot được thiết kế để tương tác với Let’s Encrypt để tạo ra và quản lý các chứng chỉ này)
$ sudo certbot --nginx -d registry.elroydevops.tech
tạo chứng thực https với domain làm theo cấu hình các bước như sau (bạn có thể cấu hình crontab để tự động gia hạn HTTPS nhé vì Certbot chỉ có hạn 90 ngày)
$ sudo htpasswd -Bc /etc/nginx/registry.password elroy
tạo thư mục registry.password và tài khoản tên elroy và nhập mật khẩu
$ sudo vi registry.elroydevops.tech.conf
sửa đổi file conf docker private registry vừa nãy chúng ta tạo và thêm 3 dòng dưới vào trong location như sau
auth_basic "Restricted Content"; auth_basic_user_file /etc/nginx/registry.password; client_max_body_size 16384m;
$ sudo nginx -t && sudo systemctl reload nginx
áp dụng cấu hình mới
Truy cập lại và được kết quả dưới đây đã xác thực HTTPS và xác thực tài khoản mật khẩu thành công
Tiếp theo chúng ta sẽ kiểm tra xem docker private registry đã hoạt động chưa nhé
$ sudo docker pull elroydevops/car-serv
pull một image bất kỳ (image này sample của mình bạn có thể sử dụng nhé)
$ sudo docker tag elroydevops/car-serv:latest registry.elroydevops.tech/car-serv:1.0.0
đổi tên image thành format như sau <registry domain>/<image name>:<image tag>
$ sudo docker images
kiểm tra xem đã đổi tên thành công chưa nhé
$ sudo docker login registry.elroydevops.tech
tiến hành login vào docker private registry chính là tài khoản nãy chúng ta tạo (nãy mình tạo là elroy)
$ sudo docker push registry.elroydevops.tech/car-serv:1.0.0
push lên docker private registry của bạn
$ curl -u usernmae:password -X GET https://registry.elroydevops.tech/v2/_catalog
và kiểm tra dữ liệu trong docker private registry
Dưới đây là các câu lệnh trên được kết quả sau là thành công
Vậy là chúng ta đã thiết lập thành công docker private registry bây giờ bạn có thể push các docker image của bạn lên trên này đảm bảo tính bảo mật của bạn, bạn có thể tích hợp thêm UI quản lý, CDN, các phương pháp chống DDoS,… để đảm bảo tính an toàn hơn nhé.
Cách 2: Cài đặt sử dụng docker private registry harbor
Tiếp theo mình sẽ làm thực hiện tạo docker private registry dễ làm hơn, đơn giản hơn nhưng sẽ chuyên nghiệp hơn có cả giao diện UI cho bạn sử dụng đó là Harbor, Harbor là một nền tảng quản lý và triển khai hệ thống lưu trữ Docker (docker private registry). Nó cung cấp một giải pháp tập trung để quản lý, bảo mật và phân phối các hình ảnh Docker.
Tài liệu chính thức tại: Harbor docs
Vì mình sử dụng luôn server trên để triển khai tiếp nên nếu bạn cũng đang hands on như vậy thì cần stop service nginx nhé và cần một sub domain khác
Step 1: Cài đặt docker private registry harbor
Bạn truy cập lại vào trình quản lý domain của bạn thêm một bản ghi khác giống ở trên và tên là: registry-harbor vậy thành công chúng ta sẽ có registry-harbor.elroydevops.tech
$ sudo lsof -i :80
kiểm tra xem tiến trình nào đang chạy port 80 chắc chắn rồi đó là nginx chúng ta vừa cấu hình ở trên
$ sudo service nginx stop
stop nginx
$ cd
quay lại thư mục gốc
$ mkdir harbor
tạo thư mục làm việc với harbor
$ cd harbor
di chuyển vào thư mục
$ curl -s https://api.github.com/repos/goharbor/harbor/releases/latest | grep browser_download_url | cut -d '"' -f 4 | grep '\.tgz$' | wget -i -
tải về phiên bản mới nhất của Harbor
$ tar xvzf harbor-offline-installer*.tgz
giải nén file vừa tải
$ cd harbor/
di chuyển vào trong thư mục vừa giải nén ra
$ cp harbor.yml.tmpl harbor.yml
copy file cấu hình template ra để sử dụng
$ export DOMAIN="registry-harbor.elroydevops.tech"
thêm biến DOMAIN (bạn thay đổi tương ứng domain của mình nhé)
$ export EMAIL="[email protected]"
thêm biến EMAIL (bạn nhập email của bạn nhé)
$ sudo certbot certonly --standalone -d $DOMAIN --preferred-challenges http --agree-tos -m $EMAIL --keep-until-expiring
yêu cầu và cài đặt chứng chỉ SSL/TLS
$ sudo vi harbor.yml
truy cập file cấu hình và sửa đổi những chỗ dưới đây
hostname: registry-harbor.elroydevops.tech http: port: 80 https: port: 443 certificate: /etc/letsencrypt/live/registry-harbor.elroydevops.tech/fullchain.pem private_key: /etc/letsencrypt/live/registry-harbor.elroydevops.tech/privkey.pem harbor_admin_password: $ElroyDevOpsAdmin12 database: password: $ElroyDevOpsAdmin12 max_idle_conns: 100 max_open_conns: 900 conn_max_lifetime: 5m conn_max_idle_time: 0
$ sudo ./prepare
chạy lệnh và tác vụ để chuẩn bị và cấu hình môi trường cho Harbor
$ sudo ./install.sh
chạy file bash script cài đặt Harbor
$ sudo docker-compose ps
kiểm tra các container đã chạy lên
Chúng ta thử login tương tự như docker private registry được kết quả thành công dưới đây với tài khoản mật khẩu vừa cấu hình
Truy cập website: https://registry-harbor.elroydevops.tech với tài khoản admin và mật khẩu là bạn vừa cấu hình ở trên trong file harbor.yml
Đăng nhập thành công chúng ta vào giao diện chính của docker private registry harbor
Vậy là chúng ta đã cài đặt thành công docker private registry harbor khá đơn giản phải không nào, tuy nhiên phần này có thể bạn chưa sử dụng nên mình sẽ tiếp tục một vài bước cơ bản sử dụng nhé
Step 2: Thao tác cơ bản harbor
Trên giao diện tạo project chọn NEW PROJECT
Tiếp tục truy cập server và tiến hành push image lên docker private registry harbor
$ sudo docker tag elroydevops/car-serv registry-harbor.elroydevops.tech/car-serv-project/car-serv:1.0.0
đổi tên image theo registry
$ sudo docker push registry-harbor.elroydevops.tech/car-serv-project/car-serv:1.0.0
push lên registry
Thành công đươc kết quả như sau
Tạo user trong Harbor
Thêm user vào project như dưới đây
Đương nhiên còn rất nhiều thứ để làm trong phạm vi bài này chúng ta sẽ dừng lại cho những bài viết chi tiết tiếp theo, nếu bạn tạo EC2 giống mình và chưa có nhu cầu sử dụng thì nên terminal nó và xóa Elastic IP nhé không sẽ bị tính phí vì EC2 t2.small và Elastic IP đều tính phí (Elastic IP nếu đang được gắn cho EC2 thì không tính phí).
Vậy là trong bài viết này mình đã triển khai docker private registry bằng 2 cách tùy thuộc vào mong muốn, nhu cầu của bạn mà triển khai nâng cấp hơn nhé. Mình sẽ làm nhiều hướng dẫn hơn về các kỹ năng các tool khác để giúp bạn tối ưu được những tác vụ cũng như tiết kiệm những chi phí khi phát triển phần mềm. Thanks.
Mọi thắc mắc bạn có thể liên hệ:
Email: [email protected]