Cách thiết lập Private Docker Registry trên Rocky Linux 8

theanh

Administrator
Nhân viên
Nếu bạn đang làm việc cho một tổ chức và muốn giữ hình ảnh docker của mình trong nhà để triển khai nhanh chóng, thì việc lưu trữ kho lưu trữ Docker riêng là hoàn hảo. Việc có sổ đăng ký docker riêng cho phép bạn sở hữu đường ống phân phối hình ảnh của mình và kiểm soát chặt chẽ hơn đối với việc lưu trữ và phân phối hình ảnh. Bạn có thể tích hợp sổ đăng ký của mình với hệ thống CI/CD để cải thiện quy trình làm việc của mình.

Hướng dẫn này sẽ hướng dẫn bạn cách thiết lập và sử dụng sổ đăng ký Docker riêng trên máy chủ chạy Rocky Linux 8 bằng cách sử dụng Amazon S3 làm vị trí lưu trữ.

Điều kiện tiên quyết​

  • Hai máy chủ Linux có Rocky Linux 8. Một máy chủ sẽ hoạt động như máy chủ lưu trữ sổ đăng ký, trong khi máy chủ còn lại sẽ được sử dụng như máy khách để gửi yêu cầu và nhận hình ảnh từ máy chủ.
  • Tên miền đã đăng ký trỏ đến máy chủ lưu trữ. Chúng tôi sẽ sử dụng registry.example.com cho hướng dẫn của mình.
  • Người dùng không phải root có quyền sudo trên cả hai máy.

Bước 1 - Cấu hình Tường lửa​

Bước đầu tiên là cấu hình tường lửa. Rocky Linux sử dụng Tường lửa Firewalld. Kiểm tra trạng thái của tường lửa.
Mã:
$ sudo firewall-cmd --staterunning
Tường lửa hoạt động với các vùng khác nhau và vùng công cộng là vùng mặc định mà chúng tôi sẽ sử dụng. Liệt kê tất cả các dịch vụ và cổng đang hoạt động trên tường lửa.
Mã:
$ sudo firewall-cmd --permanent --list-services
Nó sẽ hiển thị đầu ra sau.
Mã:
cockpit dhcpv6-client ssh
Cho phép các cổng HTTP và HTTPS.
Mã:
$ sudo firewall-cmd --permanent --add-service=http$ sudo firewall-cmd --permanent --add-service=https
Kiểm tra lại trạng thái của tường lửa.
Mã:
$ sudo firewall-cmd --permanent --list-services
Bạn sẽ thấy kết quả tương tự.
Mã:
cockpit dhcpv6-client http https ssh
Tải lại tường lửa để bật các thay đổi.
Mã:
$ sudo firewall-cmd --reload

Bước 2 - Cài đặt Docker và Docker Compose​

Bước này là bắt buộc trên cả máy chủ và máy khách.

Cài đặt kho lưu trữ Docker chính thức.
Mã:
$ sudo dnf install yum-utils$ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
Cài đặt Docker.
Mã:
$ sudo dnf install docker-ce docker-ce-cli containerd.io
Bật và chạy daemon Docker.
Mã:
$ sudo systemctl enable docker --now
Thêm người dùng hệ thống của bạn vào nhóm Docker để tránh sử dụng sudo để chạy lệnh Docker.
Mã:
$ sudo usermod -aG docker $(whoami)
Đăng nhập lại vào máy chủ của bạn sau khi đăng xuất để bật thay đổi.

Tải xuống và cài đặt bản phát hành ổn định mới nhất của Docker Compose.
Mã:
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Áp dụng quyền thực thi cho tệp nhị phân đã tải xuống.
Mã:
$ sudo chmod +x /usr/local/bin/docker-compose
Cài đặt tập lệnh Docker-compose Bash Completion.
Mã:
$ sudo curl \ -L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose \ -o /etc/bash_completion.d/docker-compose
Tải lại cài đặt hồ sơ của bạn để bash-completion hoạt động.
Mã:
$ source ~/.bashrc

Bước 3 - Cấu hình Docker Registry​

Tạo thư mục người dùng​

Tạo thư mục cho cấu hình sổ đăng ký.
Mã:
$ mkdir ~/docker-registry
Chuyển sang thư mục docker-registry.
Mã:
$ cd ~/docker-registry
Tạo một thư mục để lưu trữ mật khẩu xác thực HTTP, các tệp cấu hình Nginx và chứng chỉ SSL.
Mã:
$ mkdir auth
Tạo một thư mục khác để lưu trữ nhật ký Nginx.
Mã:
$ mkdir logs

Tạo Amazon S3 Bucket​

Bạn có thể lưu trữ dữ liệu sổ đăng ký và hình ảnh trên máy chủ của mình hoặc sử dụng dịch vụ lưu trữ đám mây. Đối với hướng dẫn của chúng tôi, chúng tôi sẽ sử dụng dịch vụ đám mây Amazon S3.

Bước tiếp theo là thiết lập tệp cấu hình với một vài cài đặt quan trọng. Những cài đặt này cũng có thể được xác định trong tệp docker-compose.yml, nhưng có một tệp riêng sẽ tốt hơn nhiều.

Tạo một bucket với các cài đặt sau.
  • ACL phải bị vô hiệu hóa.
  • Quyền truy cập công khai vào bucket phải bị vô hiệu hóa.
  • Phiên bản bucket phải bị vô hiệu hóa.
  • Bật mã hóa Bucket bằng khóa do Amazon S3 quản lý. (SSE-S3)
  • Khóa đối tượng phải bị vô hiệu hóa.
Tạo người dùng IAM với chính sách sau.
Mã:
{ "Phiên bản": "17-10-2012", "Câu lệnh": [ { "Hiệu ứng": "Cho phép", "Hành động": [ "s3:ListBucket", "s3:GetBucketLocation", "s3:ListBucketMultipartUploads" ], "Tài nguyên": "arn:aws:s3:::S3_BUCKET_NAME" }, { "Hiệu ứng": "Cho phép", "Hành động": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject", "s3:ListMultipartUploadParts", "s3:AbortMultipartUpload" ], "Tài nguyên": "arn:aws:s3:::S3_BUCKET_NAME/*" } ]}
Thay thế S3_BUCKET_NAME bằng tên thùng S3 của bạn.

Ghi lại khóa bí mật, giá trị bí mật và vùng thùng của thùng để sử dụng sau.

Tạo tệp Docker Compose​

Tạo tệp docker-compose.yml và mở tệp đó để chỉnh sửa.
Mã:
$ nano docker-compose.yml
Dán mã sau vào đó.
Mã:
version: '3.3'services: registry: image: registry:2 restart: always environment: - REGISTRY_STORAGE=s3 - REGISTRY_STORAGE_S3_REGION=us-west-2 - REGISTRY_STORAGE_S3_BUCKET=hf-docker-registry - REGISTRY_STORAGE_S3_ENCRYPT=true - REGISTRY_STORAGE_S3_CHUNKSIZE=5242880 - REGISTRY_STORAGE_S3_SECURE=true - REGISTRY_STORAGE_S3_ACCESSKEY=AKIA3FIG4NVFCJ6STMUA - REGISTRY_STORAGE_S3_SECRETKEY=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 - REGISTRY_STORAGE_S3_V4AUTH=true - REGISTRY_STORAGE_S3_ROOTDIRECTORY=/image-registry - REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR=inmemory - REGISTRY_HEALTH_STORAGEDRIVER_ENABLED=false nginx: image: "nginx:alpine" ports: - 443:443 links: - registry:registry volumes: - ./auth:/etc/nginx/conf.d - ./auth/nginx.conf:/etc/nginx/nginx.conf:ro - ./logs:/var/log/nginx - /etc/letsencrypt:/etc/letsencrypt
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Chúng ta hãy xem qua những gì chúng ta đã thiết lập trong tệp compose của mình.

  1. Bước đầu tiên là lấy hình ảnh mới nhất của phiên bản 2 của sổ đăng ký Docker từ hub. Chúng tôi không sử dụng thẻ mới nhất vì nó có thể gây ra sự cố trong trường hợp nâng cấp phiên bản lớn. Đặt thành 2 cho phép bạn lấy tất cả các bản cập nhật 2.x trong khi ngăn chặn việc tự động nâng cấp lên phiên bản chính tiếp theo, điều này có thể gây ra những thay đổi đột ngột.

  2. Bộ chứa sổ đăng ký được đặt để luôn khởi động lại trong trường hợp xảy ra lỗi hoặc tắt máy đột ngột.

  3. Chúng tôi đã đặt nhiều biến môi trường khác nhau cho bộ lưu trữ Amazon S3. Chúng ta hãy xem qua chúng một cách nhanh chóng.
  • REGISTRY_STORAGE đặt loại bộ lưu trữ. Chúng tôi đã chọn s3 vì chúng tôi đang sử dụng Amazon S3.
  • REGISTRY_STORAGE_S3_REGION thiết lập vùng của thùng S3 của bạn.
  • REGISTRY_STORAGE_S3_BUCKET thiết lập tên của thùng S3 của bạn.
  • REGISTRY_STORAGE_S3_ENCRYPT- đặt thành true nếu bạn đã bật mã hóa Thùng.
  • REGISTRY_STORAGE_S3_CHUNKSIZE thiết lập kích thước của các khối tải lên. Kích thước phải lớn hơn 5MB (5 * 1024 * 1024).
  • REGISTRY_STORAGE_S3_SECURE- đặt thành true nếu bạn định sử dụng HTTPS.
  • REGISTRY_STORAGE_S3_ACCESSKEYREGISTRY_STORAGE_S3_SECRETKEY - Thông tin xác thực người dùng bạn đã lấy sau khi tạo người dùng IAM.
  • REGISTRY_STORAGE_S3_V4AUTH - đặt thành true nếu bạn sử dụng xác thực AWS v4. Nếu bạn gặp lỗi liên quan đến đăng nhập S3, hãy đặt thành false.
  • REGISTRY_STORAGE_S3_ROOTDIRECTORY - đặt thư mục gốc trong thùng của bạn, nơi dữ liệu sổ đăng ký của bạn sẽ được lưu trữ.
  • REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR - đặt vị trí cho Bộ nhớ đệm. Trong trường hợp của chúng tôi, chúng tôi đang lưu trữ nó trong bộ nhớ. Bạn cũng có thể đặt nó để sử dụng Redis.
  • REGISTRY_HEALTH_STORAGEDRIVER_ENABLED - Đặt thành false để tắt dịch vụ kiểm tra tình trạng lưu trữ của Sổ đăng ký. Có một lỗi với Registry có thể gây ra sự cố nếu bạn không đặt thành false.
[*]
Docker registry giao tiếp qua cổng 5000, đây là cổng mà chúng tôi đã đưa ra trong máy chủ của mình với docker.

[*]
./auth:/etc/nginx/conf.d ánh xạ đảm bảo rằng tất cả các thiết lập của Nginx đều có sẵn trong vùng chứa.

[*]
./auth/nginx.conf:/etc/nginx/nginx.conf:ro ánh xạ tệp thiết lập Nginx từ hệ thống sang một tệp trong vùng chứa ở chế độ chỉ đọc.

[*]
./logs:/var/log/nginx cho phép truy cập vào nhật ký của Nginx trên hệ thống bằng cách ánh xạ đến thư mục nhật ký Nginx trong vùng chứa.

[*]
Thiết lập của sổ đăng ký Docker được lưu trữ trong tệp /etc/docker/registry/config.yml trong vùng chứa và chúng tôi đã ánh xạ nó tới tệp config.yml trong thư mục hiện tại, tệp mà chúng tôi sẽ tạo ở bước tiếp theo.

Thiết lập Xác thực​

Để thiết lập xác thực HTTP, bạn cần cài đặt gói httpd-tools.
Mã:
$ sudo dnf install httpd-tools
Tạo tệp mật khẩu trong thư mục ~/docker-registry/auth.
Mã:
$ htpasswd -Bc ~/docker-registry/auth/nginx.htpasswd user1Mật khẩu mới:Nhập lại mật khẩu mới:Đang thêm mật khẩu cho người dùng user1
Cờ -c hướng dẫn lệnh tạo một tệp mới và cờ -B dùng để sử dụng thuật toán bcrypt được Docker hỗ trợ. Thay thế user1 bằng tên người dùng bạn chọn.

Nếu bạn muốn thêm nhiều người dùng hơn, hãy chạy lại lệnh nhưng không có cờ -c.
Mã:
$ htpasswd -B ~/docker-registry/auth/registry.password user2
Bây giờ, tệp sẽ được ánh xạ tới vùng chứa sổ đăng ký để xác thực.

Bước 4 - Cài đặt SSL​

Để cài đặt chứng chỉ SSL bằng Let's Encrypt, chúng ta cần tải xuống công cụ Certbot, có sẵn trong kho lưu trữ Epel.

Cài đặt kho lưu trữ EPEL và Certbot.
Mã:
$ sudo dnf install epel-release$ sudo dnf install certbot
Tạo chứng chỉ SSL.
Mã:
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [emailprotected] -d registry.example.com
Lệnh trên sẽ tải xuống chứng chỉ vào thư mục /etc/letsencrypt/live/registry.example.com trên máy chủ của bạn.

Tạo chứng chỉ nhóm Diffie-Hellman.
Mã:
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
Kiểm tra việc gia hạn chứng chỉ.
Mã:
$ sudo certbot renew --dry-run
Nếu chạy thử thành công, điều đó có nghĩa là chứng chỉ của bạn sẽ được tự động gia hạn.

Sao chép tệp Dhparam vào container​

Sao chép chứng chỉ nhóm Diffie-Hellman vào thư mục ~/docker-registry/auth, thư mục này sẽ được ánh xạ tới container.
Mã:
$ sudo cp /etc/ssl/certs/dhparam.pem ~/docker-registry/auth

Bước 5 - Cấu hình Nginx​

Bước tiếp theo bao gồm cấu hình máy chủ Nginx làm proxy giao diện người dùng cho máy chủ đăng ký Docker. Docker registry đi kèm với một máy chủ tích hợp hoạt động ở cổng 5000. Chúng ta sẽ đặt nó sau Nginx.

Tạo và mở tệp ~/docker-registry/auth/nginx.conf để chỉnh sửa.
Mã:
$ sudo nano ~/docker-registry/auth/nginx.conf
Dán mã sau vào đó.
Mã:
events { worker_connections 1024;}http { upstream docker-registry { server registry:5000; } ## Đặt một biến để giúp chúng ta quyết định xem chúng ta có cần thêm tiêu đề ## 'Docker-Distribution-Api-Version' hay không. ## Registry luôn đặt tiêu đề này. ## Trong trường hợp nginx thực hiện xác thực, tiêu đề sẽ không được đặt ## vì nginx đang xác thực trước khi ủy quyền. bản đồ $upstream_http_docker_distribution_api_version $docker_distribution_api_version { '' 'registry/2.0'; } máy chủ { lắng nghe 443 ssl http2; tên máy chủ registry.example.com; # Chứng chỉ SSL ssl /etc/letsencrypt/live/registry.example.com/fullchain.pem; khóa chứng chỉ ssl /etc/letsencrypt/live/registry.example.com/privkey.pem; chứng chỉ ssl đáng tin cậy /etc/letsencrypt/live/registry.example.com/chain.pem; nhật ký truy cập /var/log/nginx/registry.access.log; nhật ký lỗi /var/log/nginx/registry.error.log; # Khuyến nghị từ https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers bật; ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1; ssl_session_cache shared:SSL:10m; ssl_dhparam /etc/nginx.d/conf.d/dhparam.pem; resolver 8.8.8.8; # vô hiệu hóa mọi giới hạn để tránh HTTP 413 khi tải lên hình ảnh lớn client_max_body_size 0; # bắt buộc để tránh HTTP 411: xem Sự cố #1486 (https://github.com/moby/moby/issues/1486) chunked_transfer_encoding bật; location /v2/ { # Không cho phép kết nối từ docker 1.5 và các phiên bản trước đó # docker pre-1.6.0 không thiết lập đúng tác nhân người dùng trên ping, hãy bắt "Go *" tác nhân người dùng nếu ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) { return 404; } # Để thêm xác thực cơ bản vào v2, hãy sử dụng cài đặt auth_basic. auth_basic "Registry realm"; auth_basic_user_file /etc/nginx/conf.d/nginx.htpasswd; ## Nếu $docker_distribution_api_version trống, tiêu đề sẽ không được thêm vào. ## Xem chỉ thị map ở trên, trong đó biến này được định nghĩa. add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always; proxy_pass http://docker-registry; proxy_set_header Host $http_host; # bắt buộc vì lợi ích của máy khách docker proxy_set_header X-Real-IP $remote_addr; # truyền IP thực của máy khách proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 900; } }}
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc sau khi hoàn tất.

Cấu hình SELinux để cho phép kết nối mạng cho Private Docker Registry.
Mã:
$ sudo setsebool -P httpd_can_network_connect on

Bước 6 - Khởi chạy Docker Registry​

Chuyển sang thư mục của Docker Registry.
Mã:
$ cd ~/docker-registry
Khởi chạy vùng chứa docker.
Mã:
$ docker-compose up -d
Kiểm tra trạng thái của vùng chứa.
Mã:
$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES88d6addc1687 nginx:alpine "/docker-entrypoint.…" 5 phút trước Đã đăng 5 phút 80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp docker-registry_nginx_12b112edc1c72 registry:2 "/entrypoint.sh /etc…" 5 phút trước Đã đăng 5 phút 5000/tcp docker-registry_registry_1
Đăng nhập vào sổ đăng ký Docker.
Mã:
$ docker login -u=testuser -p=testpassword https://registry.example.com
Bạn cũng có thể mở URL https://registry.example.com/v2/ trong trình duyệt của mình và nó sẽ yêu cầu tên người dùng và mật khẩu. Bạn sẽ thấy một trang trống có {} trên đó.

Bạn có thể kiểm tra URL trên thiết bị đầu cuối bằng cách sử dụng curl.
Mã:
$ curl -u testuser -X GET https://registry.nspeaks.xyz/v2/Nhập mật khẩu máy chủ cho người dùng 'testuser':{}
Tải xuống hình ảnh docker Ubuntu mới nhất.
Mã:
$ docker pull ubuntu:latest
Gắn thẻ hình ảnh này cho sổ đăng ký riêng tư.
Mã:
$ docker tag ubuntu:latest registry.example.com/ubuntu2004
Đẩy hình ảnh vào sổ đăng ký.
Mã:
$ docker push registry.example.com/ubuntu2004
Kiểm tra xem việc đẩy có thành công không.
Mã:
$ curl -u testuser -X GET https://registry.nspeaks.xyz/v2/_catalogNhập mật khẩu máy chủ cho người dùng 'testuser':{"repositories":["ubuntu2004"]}
Nhập mật khẩu xác thực Nginx của bạn khi được nhắc và bạn sẽ thấy danh sách các kho lưu trữ có sẵn thông qua sổ đăng ký.

Kiểm tra danh sách các hình ảnh Docker hiện có để sử dụng.
Mã:
$ docker imagesTHẺ KHO LƯU TRỮ ID ẢNH KÍCH THƯỚC ĐÃ TẠOregistry 2 d3241e050fc9 5 ngày trước 24,2MBnginx alpine 53722defe627 5 ngày trước 23,4MBhttpd 2 118b6abfbf55 5 ngày trước 144MBubuntu latest ff0fea8310f3 2 tuần trước 72,8MBregistry.nspeaks.xyz/ubuntu2004 latest ff0fea8310f3 2 tuần trước 72,8MB

Bước 7 - Truy cập và sử dụng sổ đăng ký Docker từ Máy khách​

Đăng nhập vào máy khách-máy chủ của bạn. Ở bước 1, chúng tôi đã cài đặt Docker trên máy khách.

Đăng nhập vào sổ đăng ký Docker riêng từ máy khách.
Mã:
$ docker login -u=testuser -p=testpassword https://registry.example.com
Kéo ảnh Ubuntu từ sổ đăng ký.
Mã:
$ docker pull registry.example.com/ubuntu2004
Liệt kê tất cả ảnh trên máy khách của bạn.
Mã:
$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEregistry.nspeaks.xyz/ubuntu2004 latest ff0fea8310f3 2 tuần trước 72,8MB
Tạo và khởi chạy một vùng chứa bằng ảnh đã tải xuống.
Mã:
$ docker run -it registry.example.com/ubuntu2004 /bin/bash
Bạn sẽ được đăng nhập vào Shell bên trong vùng chứa Ubuntu.
Mã:
root@a2da49fdbea9:
Chạy lệnh sau để kiểm tra phiên bản Linux.
Mã:
root@a2da49fdbea9$ cat /etc/os-releaseNAME="Ubuntu"VERSION="20.04.4 LTS (Focal Fossa)"ID=ubuntuID_LIKE=debianPRETTY_NAME="Ubuntu 20.04.4 LTS"VERSION_ID="20.04"HOME_URL="https://www.ubuntu.com/"SUPPORT_URL="https://help.ubuntu.com/"BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"VERSION_CODENAME=focalUBUNTU_CODENAME=focal
Bây giờ, bạn có thể bắt đầu sử dụng sổ đăng ký Docker từ máy khách của mình.

Kết luận​

Đây là phần kết thúc hướng dẫn của chúng tôi về cách thiết lập sổ đăng ký Docker riêng trên máy chủ chạy Rocky Linux 8 sử dụng Amazon S3 làm bộ lưu trữ. Nếu bạn có bất kỳ câu hỏi nào, hãy đăng chúng trong phần bình luận bên dưới.
 
Back
Bên trên