Configurarea Docker Registry pe Rocky Linux 8/AlmaLinux 8


Un registry Docker este un sistem de stocare și livrare a conținutului care deține imagini Docker denumite, disponibile în diferite versiuni etichetate. Utilizatorii care folosesc Docker interacționează cu un registry utilizând comenzile docker push și docker pull. Uneori are sens să stocați imaginile Docker într-un registry local, în loc să le încărcați pe Docker Hub. În acest ghid vom configura un Registry Docker Privat pe Rocky/AlmaLinux 8, securizat cu un certificat SSL Let's Encrypt.

Veți economisi multă lățime de bandă pentru o echipă mare și veți păstra în siguranță imaginile pe care nu doriți să le expuneți publicului. Crearea unui registru local Docker presupune urmarea câtorva pași. Pentru instalarea Docker pe diferite distribuții, consultați Cum să instalați Docker CE pe sistemele Linux.

Instalează Docker Engine

Avem nevoie de Docker Engine pentru a rula serviciul de registru. Actualizați sistemul înainte de a-l instala.

sudo yum -y update

Rulează comenzile de mai jos pentru a instala Docker CE.

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

Apoi instalează pachetele Docker CE și pluginul Compose.

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

Dacă doriți să utilizați Docker ca utilizator non-root, ar trebui să luați în considerare adăugarea utilizatorului dumneavoastră în grupul „docker”:

sudo usermod -aG docker $USER
newgrp docker

Rulați comanda de mai jos pentru a vedea ce versiune de Docker este instalată.

$ docker --version
Docker version 26.1.3, build b72abbb

Porniți și activați serviciul Docker:

sudo systemctl enable --now docker

Starea ar trebui să fie activă:

 $ 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 ~]#

Generați certificate SSL Let’s Encrypt

Așa cum am promis mai devreme, vom folosi certificate SSL Let's Encrypt pentru a securiza configurația Docker Registry care rulează pe Rocky/AlmaLinux.

Instalați instrumentul certbot care va fi folosit pentru a solicita un certificat Let’s Encrypt.

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

Cerere pentru certificat 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

Rezultatul așteptat al generării certificatelor:

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

Certificatele dvs. vor fi salvate în /etc/letsencrypt/live/

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

Unde :

  • fullchain.pem ⇒ fișier combinat cert.pem și chain.pem
  • chain.pem ⇒ certificat intermediar
  • cert.pem ⇒ Certificat server SSL (include cheia publică)
  • privkey.pem ⇒ fișier de cheie privată

Rulează registrul Docker pe Rocky Linux/AlmaLinux 8

Poți rula registrul Docker fie cu SSL, fie fără. Vom demonstra cum poți rula registrul Docker folosind oricare dintre metode.

Dar mai întâi, creează un director care va păstra imaginile registrului Docker:

sudo mkdir /var/lib/docker/registry

Rularea unui registru Docker local fără SSL

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

Rularea unui registru Docker local cu SSL

Creează un director și plasează certificatele pe gazdă:

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

Creează un 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

Înlocuiți registry.domain.com cu numele subdomeniului registrului dumneavoastră.

Va descărca imaginea docker registry:2 dacă nu există și va crea un 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

Verifică starea containerului:

# 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

Pentru a împinge imagini către serverul Registry Container, configurați astfel:

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

Dacă ai SELinux activat, este posibil să întâmpini probleme folosind portul 5000; ia în considerare dezactivarea SELinux sau trecerea acestuia în modul permissive dacă apar probleme.

Dacă firewalld este activat și rulează, permite portul în firewall.

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

Adaugă registru nesigur la motorul Docker

Implicit, Docker folosește https pentru a se conecta la registrul Docker. Dar pot exista situații în care să fie utilizat un registru nesecurizat, în special dacă vă aflați într-o rețea de încredere. Aceasta elimină necesitatea unui certificat semnat de CA pentru uz intern sau pentru a avea încredere într-un certificat auto-semnat în toate nodurile Docker. Iată pașii pentru a adăuga un Registru Nesecurizat la Docker Engine.

Pentru Ubuntu Xenial, editați /etc/docker/daemon.json și actualizați cheia „insecure-registries”. De exemplu.

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

Editează fișierul /etc/docker/daemon.json, de exemplu.

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

Pentru Ubuntu trusty, editați fișierul /etc/default/docker și actualizați DOCKER_OPTS, de exemplu

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

Apoi repornește motorul Docker

sudo systemctl restart docker

Împingerea imaginilor Docker către registrul local

Acum că registrul este gata, poți începe să trimiți imagini Docker către el. Dacă nu ai un server DNS activ, folosește fișierul /etc/hosts pentru a mapa numele gazdei la adresa IP.

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

Voi descărca cea mai recentă imagine ubuntu de pe Docker Hub și o voi împinge către registrul meu local 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

Etichetează imaginea ca registry.domain.com:5000/ubuntu. Aceasta creează o etichetă suplimentară pentru imaginea existentă. Când prima parte a etichetei este un nume de gazdă și un port, Docker interpretează acest lucru ca locația unui registru atunci când efectuează push.

docker tag ubuntu $DOMAIN:5000/ubuntu

Împinge imaginea către registrul local care rulează la 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

Dacă încărcarea imaginii a fost realizată cu succes, ar trebui să obțineți hash-ul sha256 la final. Imaginile încărcate sunt stocate în directorul /var/lib/registry/docker/registry/v2/repositories.

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

Aceasta este aceeași metodă pe care o vei folosi pentru a încărca imagini Docker personalizate. Pentru a descărca imagini Docker din registrul local, folosește comanda:

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

În următorul meu ghid, voi acoperi configurarea proxy-ului nginx pentru accesarea depozitului prin https.

De asemenea, poți arunca o privire la Instalarea managerului UI Docker – Portainer