Ricerca nel sito web

Configurare Docker Registry su Rocky Linux 8/AlmaLinux 8


Un registro Docker è un sistema di archiviazione e distribuzione dei contenuti che conserva immagini Docker denominate, disponibili in diverse versioni etichettate. Gli utenti che utilizzano Docker interagiscono con un registro usando i comandi docker push e docker pull. A volte ha senso memorizzare le immagini Docker in un registro locale invece di spingerle su Docker Hub. In questa guida configureremo un registro Docker privato su Rocky/AlmaLinux 8 protetto da certificato SSL Let’s Encrypt.

Risparmierai molta larghezza di banda per un grande team e manterrai al sicuro le immagini che non vuoi rendere pubbliche. Creare un registro Docker locale è una questione di pochi passaggi. Per l'installazione di Docker su diverse distribuzioni, consulta Come installare Docker CE sui sistemi Linux.

Installa Docker Engine

Abbiamo bisogno di Docker Engine per eseguire il servizio di registry. Aggiorna il tuo sistema prima di installarlo.

sudo yum -y update

Esegui i comandi qui sotto per installare Docker CE.

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

Quindi installa i pacchetti Docker CE e il plugin Compose.

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

Se desideri utilizzare Docker come utente non root, dovresti ora prendere in considerazione l'aggiunta del tuo utente al gruppo «docker»:

sudo usermod -aG docker $USER
newgrp docker

Esegui il comando qui sotto per vedere la versione di Docker installata.

$ docker --version
Docker version 26.1.3, build b72abbb

Avvia e abilita il servizio Docker:

sudo systemctl enable --now docker

Lo stato dovrebbe essere in esecuzione:

 $ 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 certificati SSL Let’s Encrypt

Come promesso in precedenza, useremo i certificati SSL di Let's Encrypt per proteggere la nostra configurazione del Docker Registry in esecuzione su Rocky/AlmaLinux.

Installa lo strumento certbot che sarà utilizzato per richiedere il certificato di Let's Encrypt.

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

Richiesta di certificato 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

Output previsto della generazione dei certificati:

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

I tuoi certificati saranno salvati in /etc/letsencrypt/live/

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

Dove :

  • fullchain.pem ⇒ file combinato cert.pem e chain.pem
  • chain.pem ⇒ certificato intermedio
  • cert.pem ⇒ Certificato server SSL (include la chiave pubblica)
  • privkey.pem ⇒ file della chiave privata

Esegui il registro Docker su Rocky Linux/AlmaLinux 8

Puoi eseguire il registro Docker con SSL o senza SSL. Ti mostreremo come puoi eseguire il registro Docker utilizzando uno dei due metodi.

Ma prima, crea una directory che conterrà le immagini del registro Docker:

sudo mkdir /var/lib/docker/registry

Eseguire un registro Docker locale senza SSL

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

Eseguire un registro Docker locale con SSL

Crea una directory e posiziona i certificati sull'host:

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

Crea un contenitore 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

Sostituisci registry.domain.com con il nome del sottodominio del tuo registro.

Scaricherà l'immagine docker registry:2 se non esiste e creerà 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

Controlla lo stato del contenitore:

# 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

Per inviare immagini al server del Registro dei Container, impostare come segue:

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

Se hai SELinux abilitato, potresti incontrare un problema nell'utilizzo della porta 5000; considera di disabilitare SELinux o di metterlo in modalità permissiva se riscontri dei problemi.

Se firewalld è abilitato e in esecuzione, consenti la porta sul firewall.

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

Aggiungi registro non sicuro al motore Docker

Per impostazione predefinita, Docker utilizza https per connettersi al registro Docker. Tuttavia, ci possono essere casi in cui è necessario utilizzare un registro insicuro, specialmente se ci si trova in una rete fidata. Questo elimina la necessità di un certificato firmato da CA per uso interno o di fidarsi di un certificato autofirmato in tutti i nodi Docker. Ecco i passaggi per aggiungere un registro insicuro a Docker Engine.

Per Ubuntu Xenial, modifica /etc/docker/daemon.json e aggiorna la chiave «insecure-registries». Ad esempio.

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

Modifica il file /etc/docker/daemon.json, ad esempio.

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

Per Ubuntu Trusty, modifica il file /etc/default/docker e aggiorna DOCKER_OPTS, ad esempio

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

Quindi riavvia il motore Docker

sudo systemctl restart docker

Caricare immagini Docker nel registro locale

Ora che il registro è pronto, puoi iniziare a inviare immagini Docker ad esso. Se non hai un server DNS attivo, usa il file /etc/hosts per mappare il nome host all'indirizzo IP.

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

Scaricherò l'ultima immagine ubuntu da Docker Hub e la spingerò nel mio registro Docker locale.

$ 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

Etichetta l'immagine come registry.domain.com:5000/ubuntu. Questo crea un tag aggiuntivo per l'immagine esistente. Quando la prima parte del tag è un nome host e una porta, Docker interpreta questo come la posizione di un registro durante il push.

docker tag ubuntu $DOMAIN:5000/ubuntu

Invia l'immagine al registro locale in esecuzione su 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

Se il caricamento dell'immagine è riuscito, dovresti ricevere hash sha256 alla fine. Le immagini caricate vengono memorizzate nella directory /var/lib/registry/docker/registry/v2/repositories.

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

Questo è lo stesso metodo che userai per caricare immagini docker personalizzate. Per scaricare immagini docker sul registro locale, usa il comando:

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

Nella mia prossima guida, tratterò di come configurare il proxy nginx per accedere al repository tramite https.

Puoi anche dare un'occhiata a Installa Docker UI manager – Portainer