Zoeken op website

Docker Registry instellen op Rocky Linux 8/AlmaLinux 8


Een Docker-registry is een opslag- en contentdistributiesysteem dat benoemde Docker-images bevat, beschikbaar in verschillende getagde versies. Gebruikers die Docker gebruiken, werken met een registry door de commando's docker push en docker pull te gebruiken. Soms is het zinvol om Docker-images op een lokale registry op te slaan in plaats van ze naar Docker Hub te pushen. In deze gids gaan we een Private Docker Registry op Rocky/AlmaLinux 8 opzetten, beveiligd met een Let’s Encrypt SSL-certificaat.

Je bespaart veel bandbreedte voor een groot team en houdt de afbeeldingen die je niet openbaar wilt maken veilig. Het maken van een lokale Docker-register is een kwestie van een paar stappen volgen. Voor de installatie van Docker op verschillende distributies verwijzen we naar Hoe Docker CE op Linux-systemen te installeren.

Installeer Docker Engine

We hebben Docker Engine nodig om de registry-service uit te voeren. Werk uw systeem bij voordat u het installeert.

sudo yum -y update

Voer de onderstaande opdrachten uit om Docker CE te installeren.

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

Installeer vervolgens de Docker CE-pakketten en de Compose-plug-in.

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

Als je Docker als een niet-root gebruiker wilt gebruiken, kun je nu overwegen om je gebruiker toe te voegen aan de groep „docker”:

sudo usermod -aG docker $USER
newgrp docker

Voer het onderstaande commando uit om de geïnstalleerde versie van Docker te zien.

$ docker --version
Docker version 26.1.3, build b72abbb

Start en schakel de Docker-service in:

sudo systemctl enable --now docker

Status moet actief zijn:

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

Genereer Let’s Encrypt SSL-certificaten

Zoals eerder beloofd zullen we Let's Encrypt SSL-certificaten gebruiken om onze Docker Registry-setup op Rocky/AlmaLinux te beveiligen.

Installeer de tool certbot die gebruikt zal worden om een Let’s Encrypt-certificaat aan te vragen.

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

Verzoek om een SSL-certificaat:

export DOMAIN="registry.domain.com"
export EMAIL="[email "
certbot certonly --standalone -d $DOMAIN --preferred-challenges http --agree-tos -n -m $EMAIL --keep-until-expiring

Verwachte uitvoer van het genereren van certificaten:

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

Je certificaten worden opgeslagen onder /etc/letsencrypt/live/

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

Waar :

  • fullchain.pem ⇒ gecombineerd bestand cert.pem en chain.pem
  • chain.pem ⇒ tussenliggend certificaat
  • cert.pem ⇒ SSL-servercertificaat (inclusief publieke sleutel)
  • privkey.pem ⇒ bestand met privésleutel

Docker-register uitvoeren op Rocky Linux/AlmaLinux 8

Je kunt de Docker-registry met SSL of zonder SSL uitvoeren. We zullen laten zien hoe je de Docker-registry met beide methoden kunt draaien.

Maar maak eerst een map aan die de Docker-registryafbeeldingen zal bevatten:

sudo mkdir /var/lib/docker/registry

Een lokale Docker-registry draaien zonder SSL

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

Een lokale Docker-register uitvoeren met SSL

Maak een directory en plaats certificaten op de 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

Maak een Docker Registry-container:

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

Vervang registry.domain.com door de subdomeinnaam van je register.

Het zal de registry:2 docker-afbeelding downloaden als deze niet bestaat en een container aanmaken

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

Controleer de status van de container:

# 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

Om afbeeldingen naar de Registry Container-server te pushen, stel het als volgt in:

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

Als SELinux is ingeschakeld, kunt u een probleem ondervinden bij het gebruik van poort 5000. Overweeg SELinux uit te schakelen of op permissive-modus te zetten als u problemen ondervindt.

Als firewalld is ingeschakeld en actief, sta de poort toe in de firewall.

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

Onveilige register toevoegen aan Docker Engine

Standaard gebruikt Docker https om verbinding te maken met het Docker-register. Maar er kunnen situaties zijn waarin het gebruik van een onveilig register gewenst is, vooral als je op een vertrouwd netwerk zit. Dit elimineert de noodzaak voor een door een CA ondertekend certificaat voor intern gebruik of om een zelfondertekend certificaat op alle Docker-knooppunten te vertrouwen. Hier zijn de stappen om een onveilig register toe te voegen aan de Docker Engine.

Voor Ubuntu Xenial, bewerk /etc/docker/daemon.json en werk de sleutel “insecure-registries” bij. Bijvoorbeeld.

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

Bewerk het bestand /etc/docker/daemon.json, bijvoorbeeld.

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

Voor Ubuntu Trusty, bewerk het bestand /etc/default/docker en werk DOCKER_OPTS bij, bijvoorbeeld

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

Start vervolgens de Docker-engine opnieuw

sudo systemctl restart docker

Docker-afbeeldingen naar de lokale registry pushen

Nu de register klaar is, kun je beginnen met het pushen van docker-images ernaartoe. Als je geen actieve DNS-server hebt, gebruik dan het /etc/hosts-bestand om de hostnaam aan het IP-adres te koppelen.

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

Ik zal de nieuwste ubuntu Docker-image van Docker Hub downloaden en naar mijn lokale Docker-register pushen.

$ 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

Label de afbeelding als registry.domain.com:5000/ubuntu. Dit maakt een extra label voor de bestaande afbeelding. Wanneer het eerste deel van het label een hostnaam en poort is, interpreteert Docker dit als de locatie van een registry bij het pushen.

docker tag ubuntu $DOMAIN:5000/ubuntu

Duw de afbeelding naar de lokale registry die draait op 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

Als het uploaden van de afbeelding succesvol was, zou je aan het einde de sha256-hash moeten krijgen. Gepushte afbeeldingen worden opgeslagen in de directory /var/lib/registry/docker/registry/v2/repositories.

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

Dit is dezelfde methode die je zult gebruiken om aangepaste Docker-images te pushen. Om Docker-images naar het lokale register te downloaden, gebruik je het commando:

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

In mijn volgende gids zal ik het configureren van een nginx-proxy behandelen voor toegang tot de repository via https.

Je kunt ook een kijkje nemen bij Install Docker UI manager – Portainer