ตั้งค่า Docker Registry บน Rocky Linux 8/AlmaLinux 8
Docker registry คือระบบจัดเก็บและส่งมอบเนื้อหาที่เก็บ Docker images ที่มีชื่อเรียกและมีเวอร์ชันที่ติดแท็กต่าง ๆ ผู้ใช้ที่ใช้ Docker จะโต้ตอบกับ registry โดยใช้คำสั่ง docker push และ docker pull บางครั้งการจัดเก็บ Docker images บน registry ส่วนตัวในเครื่องจะมีประโยชน์มากกว่าการส่งขึ้น Docker Hub ในคู่มือนี้ เราจะตั้งค่า Private Docker Registry บน Rocky/AlmaLinux 8 พร้อมการรักษาความปลอดภัยด้วยใบรับรอง SSL จาก Let's Encrypt
คุณจะประหยัดแบนด์วิธได้มากสำหรับทีมขนาดใหญ่ และเก็บภาพที่คุณไม่ต้องการให้สาธารณชนเห็นให้ปลอดภัย การสร้างรีจิสทรี Docker ในเครื่องเป็นเรื่องของการทำตามขั้นตอนไม่กี่ขั้นตอน สำหรับการติดตั้ง Docker บนดิสโทรต่างๆ ให้ดูที่ วิธีการติดตั้ง Docker CE บนระบบ Linux
ติดตั้ง Docker Engine
เราจำเป็นต้องใช้ Docker Engine เพื่อรันบริการรีจิสทรี อัปเดตระบบของคุณก่อนติดตั้งมัน
sudo yum -y updateรันคำสั่งด้านล่างเพื่อติดตั้ง Docker CE
sudo curl -o /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo จากนั้นติดตั้งแพ็กเกจ Docker CE และปลั๊กอิน Compose
sudo yum -y install docker-ce docker-ce-cli containerd.io
หากคุณต้องการใช้ Docker ในฐานะผู้ใช้ที่ไม่ใช่ root ตอนนี้คุณควรพิจารณาเพิ่มผู้ใช้ของคุณไปยังกลุ่ม “docker”:
sudo usermod -aG docker $USER
newgrp dockerเรียกใช้คำสั่งด้านล่างเพื่อดูเวอร์ชันของ Docker ที่ติดตั้งอยู่
$ docker --version
Docker version 26.1.3, build b72abbbเริ่มและเปิดใช้งานบริการ Docker:
sudo systemctl enable --now dockerสถานะควรเป็น กำลังทำงาน:
$ 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 ~]#สร้างใบรับรอง SSL ของ Let’s Encrypt
ตามที่สัญญาไว้ก่อนหน้านี้ เราจะใช้ใบรับรอง SSL ของ Let's Encrypt เพื่อรักษาความปลอดภัยการตั้งค่า Docker Registry ของเราที่รันบน Rocky/AlmaLinux
ติดตั้งเครื่องมือ certbot ที่จะใช้ในการขอใบรับรองจาก Let’s Encrypt
sudo yum -y install epel-release
sudo yum -y install certbotคำขอใบรับรอง 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ผลลัพธ์ที่คาดว่าจะได้จากการสร้างใบรับรอง:
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ใบรับรองของคุณจะถูกบันทึกไว้ที่ /etc/letsencrypt/live/
/etc/letsencrypt/live/registry.domain.com/fullchain.pem
/etc/letsencrypt/live/registry.domain.com/privkey.pemสถานที่ :
- fullchain.pem ⇒ ไฟล์รวมของ
cert.pemและchain.pem - chain.pem ⇒ ใบรับรองตัวกลาง
- cert.pem ⇒ ใบรับรองเซิร์ฟเวอร์ SSL (รวมถึงกุญแจสาธารณะ)
- privkey.pem ⇒ ไฟล์กุญแจส่วนตัว
เรียกใช้ Docker registry บน Rocky Linux/AlmaLinux 8
คุณสามารถรัน Docker registry ได้ทั้งแบบมี SSL หรือไม่มี เราจะแสดงวิธีที่คุณสามารถรัน Docker registry ได้ทั้งสองแบบ
แต่ก่อนอื่น สร้างไดเรกทอรีที่จะเก็บภาพ Docker registry:
sudo mkdir /var/lib/docker/registryการรัน Local Docker registry โดยไม่ใช้ SSL
docker run -d -p 5000:5000 \
--name docker-registry \
--restart=always \
-v /var/lib/docker/registry:/var/lib/registry \
registry:2การรัน Docker registry ภายในเครื่องพร้อม SSL
สร้างไดเรกทอรีและวางใบรับรองบนโฮสต์:
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สร้างคอนเทนเนอร์ 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แทนที่ registry.domain.com ด้วยชื่อซับโดเมนของรีจิสทรีของคุณ
มันจะดาวน์โหลดอิมเมจ docker ของ registry:2 ถ้ามันยังไม่มี และสร้างคอนเทนเนอร์
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ตรวจสอบสถานะของคอนเทนเนอร์:
# 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ในการส่งรูปภาพไปยังเซิร์ฟเวอร์ Registry Container ให้ตั้งค่าดังนี้:
$ curl https://$DOMAIN:5000/v2/_catalog
{"repositories":[]}หากคุณเปิดใช้งาน SELinux คุณอาจพบปัญหาในการใช้พอร์ต 5000 พิจารณาปิด SELinux หรือปรับเป็นโหมดอนุญาตหากพบปัญหา
ถ้า firewalld ถูกเปิดใช้งานและกำลังทำงานอยู่ ให้อนุญาตพอร์ตบนไฟร์วอลล์
sudo firewall-cmd --add-port=5000/tcp --permanent
sudo firewall-cmd --reloadเพิ่มรีจิสทรีที่ไม่ปลอดภัยไปยัง Docker Engine
โดยค่าเริ่มต้น Docker ใช้ https ในการเชื่อมต่อกับ Docker Registry แต่ก็อาจมีกรณีที่จำเป็นต้องใช้ registry ที่ไม่ปลอดภัย โดยเฉพาะถ้าคุณอยู่บนเครือข่ายที่เชื่อถือได้ ซึ่งสามารถตัดความจำเป็นในการใช้ใบรับรองที่ออกโดย CA สำหรับการใช้งานภายในหรือการเชื่อถือใบรับรองที่เซ็นด้วยตัวเองในทุกโหนด Docker ได้ นี่คือขั้นตอนในการเพิ่ม Insecure Registry ให้กับ Docker Engine
สำหรับ Ubuntu Xenial แก้ไข /etc/docker/daemon.json และอัปเดตคีย์ “insecure-registries” เช่น
{
"insecure-registries" : ["registry.domain.com:5000"]
}แก้ไขไฟล์ /etc/docker/daemon.json เช่น
{
"insecure-registries" : ["registry.domain.com:5000"]
}สำหรับ Ubuntu trusty แก้ไขไฟล์ /etc/default/docker และอัปเดต DOCKER_OPTS เช่น
DOCKER_OPTS='--insecure-registry registry.domain.com:5000'จากนั้นให้รีสตาร์ทเอนจิ้นของ Docker
sudo systemctl restart dockerการส่งอิมเมจ Docker ไปยังรีจิสตรีท้องถิ่น
ตอนนี้ที่รีจิสตรีพร้อมใช้งานแล้ว คุณสามารถเริ่มส่งอิมเมจ Docker ไปยังมันได้ หากคุณไม่มีเซิร์ฟเวอร์ DNS ที่ใช้งานอยู่ ให้ใช้ไฟล์ /etc/hosts เพื่อแมปชื่อโฮสต์ไปยังที่อยู่ IP
$ sudo vim /etc/hosts
192.168.1.23 registry.domain.comฉันจะดาวน์โหลด ubuntu อิมเมจ Docker เวอร์ชันล่าสุดจาก Docker Hub แล้วส่งไปยังรีจิสทรี Docker ในเครื่องของฉัน
$ 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แท็กภาพเป็น registry.domain.com:5000/ubuntu สิ่งนี้จะสร้างแท็กเพิ่มเติมสำหรับภาพที่มีอยู่ เมื่อส่วนแรกของแท็กเป็นชื่อโฮสต์และพอร์ต Docker จะตีความว่านี่คือที่ตั้งของรีจิสทรีเมื่อทำการ push
docker tag ubuntu $DOMAIN:5000/ubuntuส่งภาพไปยังรีจิสทรีท้องถิ่นที่กำลังทำงานที่ 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หากการอัปโหลดภาพสำเร็จ คุณควรได้รับ sha256 hash ที่ท้ายไฟล์ ภาพที่ถูกผลักขึ้นจะถูกเก็บไว้ในไดเรกทอรี /var/lib/registry/docker/registry/v2/repositories
$ ls /var/lib/docker/registry/docker/registry/v2/repositories/
ubuntuนี่คือวิธีเดียวกับที่คุณจะใช้ในการส่งภาพ Docker แบบกำหนดเอง ในการดาวน์โหลดภาพ Docker จากรีจิสทรีโลคอล ให้ใช้คำสั่ง:
$ docker pull registry-hostname:500/image:tag
#E.g
$ docker pull registry.domain.com:5000/ubuntuในคู่มือต่อไปของผม ผมจะอธิบายเกี่ยวกับการตั้งค่า nginx proxy เพื่อเข้าถึง repository ผ่าน https
คุณยังสามารถดูที่ ติดตั้งตัวจัดการ UI ของ Docker – Portainer ได้ด้วย