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 updateChạ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 dockerChạy lệnh dưới đây để xem phiên bản docker đã được cài đặt.
$ docker --version
Docker version 26.1.3, build b72abbbKhởi động và kích hoạt dịch vụ docker:
sudo systemctl enable --now dockerTrạ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 certbotYê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-expiringKế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-leChứ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.pemvà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/registryChạ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:2Chạ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.pemTạ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:2Thay 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
ed960bd27529be26e7ef728027844a62b0731b08bafdbbf63dea328dac46e024Kiể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 --reloadThê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.comTô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:latestGắ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: 943Nế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/ubuntuTrong 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