ค้นหาเว็บไซต์

ตั้งค่า 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 ได้ด้วย