Tìm kiếm trang web

Cài đặt Docker Registry trên Rocky Linux 8/AlmaLinux 8


Docker registry là một hệ thống lưu trữ và phân phối nội dung, nơi chứa các hình ảnh Docker có tên, có sẵn ở các phiên bản được gắn nhãn khác nhau. Người dùng sử dụng Docker tương tác với một registry thông qua các lệnh docker push và docker pull. Đôi khi việc lưu trữ các hình ảnh Docker trên một registry nội bộ là hợp lý hơn so với việc đẩy chúng lên Docker Hub. Trong hướng dẫn này, chúng tôi sẽ thiết lập Docker Registry riêng trên Rocky/AlmaLinux 8 được bảo mật bằng Chứng chỉ SSL của Let’s Encrypt.

Bạn sẽ tiết kiệm được nhiều băng thông cho một đội lớn và giữ an toàn cho những hình ảnh mà bạn không muốn công khai với mọi người. Việc tạo một registry Docker cục bộ chỉ là việc làm theo vài bước. Để cài đặt Docker trên các bản phân phối khác nhau, hãy tham khảo Hướng dẫn cài đặt Docker CE trên các hệ thống Linux.

Cài đặt Docker Engine

Chúng ta cần Docker Engine để chạy dịch vụ registry. Hãy cập nhật hệ thống của bạn trước khi cài đặt nó.

sudo yum -y update

Chạy các lệnh dưới đây để cài đặt Docker CE.

sudo curl -o /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo 

Sau đó cài đặt các gói Docker CE và plugin Compose.

sudo yum -y install docker-ce docker-ce-cli containerd.io

Nếu bạn muốn sử dụng Docker như một người dùng không có quyền root, bây giờ bạn nên xem xét thêm người dùng của mình vào nhóm "docker".

sudo usermod -aG docker $USER
newgrp docker

Chạy lệnh dưới đây để xem phiên bản docker đã được cài đặt.

$ docker --version
Docker version 26.1.3, build b72abbb

Khởi động và kích hoạt dịch vụ docker:

sudo systemctl enable --now docker

Trạng thái nên là đang chạy:

 $ systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2024-07-13 19:53:19 UTC; 4s ago
     Docs: https://docs.docker.com
 Main PID: 17832 (dockerd)
    Tasks: 7
   Memory: 30.4M
   CGroup: /system.slice/docker.service
           └─17832 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Jul 13 19:53:19 rocky8.cloudspinx.com systemd[1]: Starting Docker Application Container Engine...
Jul 13 19:53:19 rocky8.cloudspinx.com dockerd[17832]: time="2024-07-13T19:53:19.316260221Z" level=info msg="Starting up"
Jul 13 19:53:19 rocky8.cloudspinx.com dockerd[17832]: time="2024-07-13T19:53:19.340012039Z" level=info msg="Loading containers: start."
Jul 13 19:53:19 rocky8.cloudspinx.com dockerd[17832]: time="2024-07-13T19:53:19.621507107Z" level=info msg="Loading containers: done."
Jul 13 19:53:19 rocky8.cloudspinx.com dockerd[17832]: time="2024-07-13T19:53:19.644692641Z" level=info msg="Docker daemon" commit=8e96db1 containerd-snapshotter=false storage-driver=overlay2 versio>
Jul 13 19:53:19 rocky8.cloudspinx.com dockerd[17832]: time="2024-07-13T19:53:19.644783862Z" level=info msg="Daemon has completed initialization"
Jul 13 19:53:19 rocky8.cloudspinx.com dockerd[17832]: time="2024-07-13T19:53:19.671038318Z" level=info msg="API listen on /run/docker.sock"
Jul 13 19:53:19 rocky8.cloudspinx.com systemd[1]: Started Docker Application Container Engine.
[root@rocky8 ~]#

Tạo Chứng Chỉ SSL Let’s Encrypt

Như đã hứa trước đó, chúng ta sẽ sử dụng Chứng chỉ SSL Let’s Encrypt để bảo mật cài đặt Docker Registry của mình chạy trên Rocky/AlmaLinux.

Cài đặt công cụ certbot sẽ được sử dụng để yêu cầu chứng chỉ Let’s Encrypt.

sudo yum -y install epel-release
sudo yum -y install certbot

Yêu cầu cấp chứng chỉ SSL:

export DOMAIN="registry.domain.com"
export EMAIL="[email "
certbot certonly --standalone -d $DOMAIN --preferred-challenges http --agree-tos -n -m $EMAIL --keep-until-expiring

Kết quả dự kiến của việc tạo chứng chỉ:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for registry.computingforgeeks.com
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/registry.computingforgeeks.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/registry.computingforgeeks.com/privkey.pem
   Your cert will expire on 2021-07-28. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Chứng chỉ của bạn sẽ được lưu dưới /etc/letsencrypt/live/

/etc/letsencrypt/live/registry.domain.com/fullchain.pem
/etc/letsencrypt/live/registry.domain.com/privkey.pem

Ở đâu :

  • fullchain.pem ⇒ tệp kết hợp cert.pem và chain.pem
  • chain.pem ⇒ chứng chỉ trung gian
  • cert.pem ⇒ Chứng chỉ SSL máy chủ (bao gồm khóa công khai)
  • privkey.pem ⇒ file khóa riêng

Chạy Docker registry trên Rocky Linux/AlmaLinux 8

Bạn có thể chạy docker registry có SSL hoặc không có SSL. Chúng tôi sẽ hướng dẫn cách bạn có thể chạy Docker registry bằng một trong hai phương pháp này.

Nhưng trước tiên, hãy tạo một thư mục để chứa các hình ảnh Docker registry:

sudo mkdir /var/lib/docker/registry

Chạy Docker registry cục bộ mà không dùng SSL

docker run -d -p 5000:5000 \
--name docker-registry \
--restart=always \
-v /var/lib/docker/registry:/var/lib/registry \
registry:2

Chạy Docker registry cục bộ với SSL

Tạo thư mục và đặt chứng chỉ trên máy chủ:

export DOMAIN="registry.domain.com"
mkdir /certs
sudo cp /etc/letsencrypt/live/$DOMAIN/fullchain.pem /certs/fullchain.pem
sudo cp /etc/letsencrypt/live/$DOMAIN/privkey.pem /certs/privkey.pem
sudo cp /etc/letsencrypt/live/$DOMAIN/cert.pem /certs/cert.pem

Tạo một container Docker Registry:

docker run -d --name docker-registry --restart=always \
-p 5000:5000 \
-e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain.pem  \
-e REGISTRY_HTTP_TLS_KEY=/certs/privkey.pem \
-v /certs:/certs \
-v /var/lib/docker/registry:/var/lib/registry \
registry:2

Thay registry.domain.com bằng tên miền phụ của registry của bạn.

Nó sẽ tải xuống hình ảnh docker registry:2 nếu chưa tồn tại và tạo một container

Unable to find image 'registry:2' locally
2: Pulling from library/registry
ddad3d7c1e96: Pull complete
6eda6749503f: Pull complete
363ab70c2143: Pull complete
5b94580856e6: Pull complete
12008541203a: Pull complete
Digest: sha256:bac2d7050dc4826516650267fe7dc6627e9e11ad653daca0641437abdf18df27
Status: Downloaded newer image for registry:2
ed960bd27529be26e7ef728027844a62b0731b08bafdbbf63dea328dac46e024

Kiểm tra trạng thái container:

# docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS                                       NAMES
ed960bd27529   registry:2   "/entrypoint.sh /etc…"   28 seconds ago   Up 27 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   docker-registry

Để đẩy hình ảnh lên máy chủ Registry Container, hãy thiết lập như sau:

$ curl https://$DOMAIN:5000/v2/_catalog
{"repositories":[]}

Nếu bạn đã bật SELinux, bạn có thể gặp sự cố khi sử dụng cổng 5000, hãy cân nhắc tắt SELinux hoặc đặt nó ở chế độ permissive nếu gặp vấn đề.

Nếu firewalld được bật và đang chạy, hãy cho phép cổng trên tường lửa.

sudo firewall-cmd --add-port=5000/tcp --permanent
sudo firewall-cmd --reload

Thêm Registry Không An Toàn vào Docker Engine

Theo mặc định, Docker sử dụng https để kết nối với registry của Docker. Nhưng có những trường hợp cần sử dụng registry không an toàn, đặc biệt nếu bạn đang trong một mạng tin cậy. Điều này loại bỏ nhu cầu sử dụng chứng chỉ được ký bởi CA cho mục đích nội bộ hoặc tin tưởng chứng chỉ tự ký trên tất cả các node Docker. Dưới đây là các bước để thêm Registry không an toàn vào Docker Engine.

Đối với Ubuntu Xenial, chỉnh sửa /etc/docker/daemon.json và cập nhật khóa “insecure-registries”. Ví dụ:

{
 "insecure-registries" : ["registry.domain.com:5000"]
 }

Chỉnh sửa tệp /etc/docker/daemon.json, ví dụ.

{
 "insecure-registries" : ["registry.domain.com:5000"]
 }

Đối với Ubuntu trusty, chỉnh sửa tệp /etc/default/docker và cập nhật DOCKER_OPTS, ví dụ

DOCKER_OPTS='--insecure-registry registry.domain.com:5000'

Sau đó khởi động lại Docker engine

sudo systemctl restart docker

Đẩy các hình ảnh Docker lên kho lưu trữ cục bộ

Bây giờ registry đã sẵn sàng, bạn có thể bắt đầu đẩy các hình ảnh docker lên đó. Nếu bạn không có máy chủ DNS hoạt động, hãy sử dụng tệp /etc/hosts để ánh xạ tên máy chủ với địa chỉ IP.

$ sudo vim /etc/hosts
192.168.1.23 registry.domain.com

Tôi sẽ tải xuống hình ảnh docker ubuntu mới nhất từ Docker Hub và đẩy nó lên registry Docker cục bộ của mình.

$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
345e3491a907: Pull complete
57671312ef6f: Pull complete
5e9250ddb7d0: Pull complete
Digest: sha256:cf31af331f38d1d7158470e095b132acd126a7180a54f263d386da88eb681d93
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

Gắn thẻ hình ảnh là registry.domain.com:5000/ubuntu. Điều này tạo ra một thẻ bổ sung cho hình ảnh hiện có. Khi phần đầu của thẻ là tên máy chủ và cổng, Docker sẽ hiểu đây là vị trí của một registry khi đẩy hình ảnh.

docker tag ubuntu $DOMAIN:5000/ubuntu

Đẩy hình ảnh lên registry địa phương đang chạy tại registry.domain.com:5000/ubuntu

$ docker push $DOMAIN:5000/ubuntu
Using default tag: latest
The push refers to repository [registry.domain.com:5000/ubuntu]
2f140462f3bc: Pushed
63c99163f472: Pushed
ccdbb80308cc: Pushed
latest: digest: sha256:86ac87f73641c920fb42cc9612d4fb57b5626b56ea2a19b894d0673fd5b4f2e9 size: 943

Nếu việc tải hình ảnh lên thành công, bạn sẽ nhận được băm sha256 ở cuối. Các hình ảnh đã đẩy được lưu trữ trong thư mục /var/lib/registry/docker/registry/v2/repositories.

$ ls /var/lib/docker/registry/docker/registry/v2/repositories/
ubuntu

Đây là phương pháp tương tự mà bạn sẽ sử dụng để đẩy các hình ảnh docker tùy chỉnh. Để tải các hình ảnh docker trên registry cục bộ, sử dụng lệnh:

$ docker pull registry-hostname:500/image:tag
#E.g
$ docker pull registry.domain.com:5000/ubuntu

Trong hướng dẫn tiếp theo, tôi sẽ trình bày cách cấu hình nginx proxy để truy cập kho qua https.

Bạn cũng có thể xem qua Cài đặt giao diện quản lý Docker – Portainer