Wyszukiwanie w witrynie

Konfiguracja rejestru Docker na Rocky Linux 8/AlmaLinux 8


Rejestr Docker to system przechowywania i dostarczania treści, który przechowuje nazwane obrazy Docker, dostępne w różnych wersjach oznaczonych tagami. Użytkownicy korzystający z Dockera wchodzą w interakcję z rejestrem za pomocą poleceń docker push i docker pull. Czasami sensowne jest przechowywanie obrazów Docker w lokalnym rejestrze zamiast wysyłania ich do Docker Hub. W tym przewodniku skonfigurujemy prywatny rejestr Docker na Rocky/AlmaLinux 8 zabezpieczony certyfikatem SSL Let’s Encrypt.

Zaoszczędzisz dużo przepustowości dla dużego zespołu i zadbasz o bezpieczeństwo obrazów, których nie chcesz udostępniać publicznie. Utworzenie lokalnego rejestru Dockera polega na wykonaniu kilku kroków. Aby zainstalować Dockera na różnych dystrybucjach, odwołaj się do Jak zainstalować Docker CE na systemach Linux.

Zainstaluj Docker Engine

Do uruchomienia usługi rejestru potrzebny jest Docker Engine. Zaktualizuj system przed jego instalacją.

sudo yum -y update

Uruchom poniższe polecenia, aby zainstalować Docker CE.

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

Następnie zainstaluj pakiety Docker CE i wtyczkę Compose.

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

Jeżeli chcesz używać Dockera jako użytkownik niebędący rootem, powinieneś teraz rozważyć dodanie swojego użytkownika do grupy „docker”:

sudo usermod -aG docker $USER
newgrp docker

Uruchom poniższe polecenie, aby zobaczyć zainstalowaną wersję Dockera.

$ docker --version
Docker version 26.1.3, build b72abbb

Uruchom i włącz usługę Docker:

sudo systemctl enable --now docker

Status powinien być uruchomiony:

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

Generuj certyfikaty SSL Let’s Encrypt

Jak obiecano wcześniej, użyjemy certyfikatów SSL Let's Encrypt, aby zabezpieczyć naszą konfigurację rejestru Docker działającą na Rocky/AlmaLinux.

Zainstaluj narzędzie certbot, które będzie używane do uzyskania certyfikatu Let’s Encrypt.

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

Wniosek o certyfikat 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

Oczekiwany wynik generowania certyfikatów:

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

Twoje certyfikaty zostaną zapisane w /etc/letsencrypt/live/

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

Gdzie :

  • fullchain.pem ⇒ połączony plik cert.pem i chain.pem
  • chain.pem ⇒ certyfikat pośredni
  • cert.pem ⇒ Certyfikat serwera SSL (zawiera klucz publiczny)
  • privkey.pem ⇒ plik klucza prywatnego

Uruchom rejestr Docker na Rocky Linux/AlmaLinux 8

Możesz uruchomić rejestr Dockera zarówno z SSL, jak i bez niego. Pokażemy, jak możesz uruchomić rejestr Dockera przy użyciu obu metod.

Ale najpierw utwórz katalog, który będzie przechowywał obrazy rejestru Dockera:

sudo mkdir /var/lib/docker/registry

Uruchamianie lokalnego rejestru Docker bez SSL

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

Uruchamianie lokalnego rejestru Docker z SSL

Utwórz katalog i umieść certyfikaty na hoście:

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

Utwórz kontener 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

Zamień registry.domain.com na nazwę poddomeny swojego rejestru.

Pobierze obraz docker registry:2, jeśli nie istnieje, i utworzy kontener

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

Sprawdź stan kontenera:

# 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

Aby przesłać obrazy do serwera rejestru kontenerów, ustaw jak poniżej:

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

Jeśli masz włączony SELinux, możesz napotkać problem z używaniem portu 5000. Rozważ wyłączenie SELinux lub ustawienie go w trybie permisywnym, jeśli napotkasz problemy.

Jeżeli firewalld jest włączony i działa, pozwól na ruch przez ten port w zaporze.

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

Dodaj niepewny rejestr do silnika Docker

Domyślnie Docker używa https do łączenia się z rejestrem Docker. Jednak mogą wystąpić sytuacje, w których użycie niebezpiecznego rejestru jest uzasadnione, zwłaszcza jeśli znajdujesz się w zaufanej sieci. Eliminowane jest w ten sposób konieczność posiadania certyfikatu podpisanego przez CA do użytku wewnętrznego lub zaufania samopodpisanego certyfikatu na wszystkich węzłach Docker. Oto kroki, jak dodać niebezpieczny rejestr do silnika Docker.

Dla Ubuntu Xenial edytuj /etc/docker/daemon.json i zaktualizuj klucz „insecure-registries”. np.

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

Edytuj plik /etc/docker/daemon.json, np.

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

Dla Ubuntu Trusty edytuj plik /etc/default/docker i zaktualizuj DOCKER_OPTS, np.

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

Następnie uruchom ponownie silnik Dockera

sudo systemctl restart docker

Wysyłanie obrazów Dockera do lokalnego rejestru

Teraz, gdy rejestr jest gotowy, możesz zacząć przesyłać do niego obrazy dockera. Jeśli nie masz aktywnego serwera DNS, użyj pliku /etc/hosts, aby zmapować nazwę hosta na adres IP.

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

Pobiorę najnowszy obraz ubuntu z Docker Hub i wypchnę go do mojego lokalnego rejestru Dockera.

$ 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

Oznacz obraz jako registry.domain.com:5000/ubuntu. Tworzy to dodatkowy tag dla istniejącego obrazu. Gdy pierwsza część tagu to nazwa hosta i port, Docker interpretuje to jako lokalizację rejestru podczas przesyłania.

docker tag ubuntu $DOMAIN:5000/ubuntu

Wypchnij obraz do lokalnego rejestru działającego pod 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

Jeśli przesyłanie obrazu zakończyło się sukcesem, na końcu powinieneś otrzymać hash sha256. Wysłane obrazy są przechowywane w katalogu /var/lib/registry/docker/registry/v2/repositories.

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

To ta sama metoda, której użyjesz do przesyłania własnych obrazów Dockera. Aby pobrać obrazy Dockera z lokalnego rejestru, użyj polecenia:

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

W moim następnym przewodniku omówię konfigurowanie proxy nginx do uzyskiwania dostępu do repozytorium przez https.

Możesz również rzucić okiem na Instalację menedżera interfejsu Docker – Portainer