kiến thức DevOps thực tế và chi tiết

Cài đặt Docker private registry server (2 cách thực tế)

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 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.

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, dockerdocker-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

docker private registry

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

docker private registry

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

docker private registry harbor

Đăng nhập thành công chúng ta vào giao diện chính của docker private registry harbor

docker private registry harborVậ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.smallElastic 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]