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 updateEsegui 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 dockerEsegui il comando qui sotto per vedere la versione di Docker installata.
$ docker --version
Docker version 26.1.3, build b72abbbAvvia e abilita il servizio Docker:
sudo systemctl enable --now dockerLo 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 certbotRichiesta 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-expiringOutput 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-leI tuoi certificati saranno salvati in /etc/letsencrypt/live/
/etc/letsencrypt/live/registry.domain.com/fullchain.pem
/etc/letsencrypt/live/registry.domain.com/privkey.pemDove :
- fullchain.pem ⇒ file combinato
cert.pemechain.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/registryEseguire 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:2Eseguire 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.pemCrea 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:2Sostituisci 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
ed960bd27529be26e7ef728027844a62b0731b08bafdbbf63dea328dac46e024Controlla 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-registryPer 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 --reloadAggiungi 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 dockerCaricare 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.comScaricherò 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:latestEtichetta 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/ubuntuInvia 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: 943Se 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/
ubuntuQuesto è 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/ubuntuNella 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