Private Docker Registry...

Private Docker Registry

Docker Hub to miejsce w którym możemy dzielić się ze wszystkimi naszymi obrazami. A jeśli chcemy się dzielić tylko z naszymi współpracownikami? Oto jak w prosty sposób przygotować własne registry dla obrazów dockerowych.

Po zainstalowaniu systemu CentOS 7 czas na instalację dockera:

# yum install docker -y
# systemctl enable docker
# systemctl start docker
# systemctl status docker

Ustawiamy nazwę serwera:

# hostnamectl set-hostname registry.my-company.local

Generujemy klucze: (jako „Common Name” podaj pełną nazwę serwera):

# mkdir /etc/certs/
# cd /etc/certs/
# openssl genrsa -out ./self.key 1024
# openssl req -new -key ./self.key -x509 -days 365 -out ./self.crt

Pobieramy obraz „registry” z Docker HUB:

# docker pull registry:2

Otwieramy port 5000:

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

Aby nasze registry uruchamiało się automatycznie definiujemy nowy unit:

# cat /etc/systemd/system/docker-registry.service
[Unit]
Description=Registry server for Docker
Requires=docker.service
After=docker.service
[Service]
ExecStart=/usr/local/bin/start-registry.sh
ExecStop=/usr/bin/docker stop registry
ExecStopPost=/usr/bin/docker rm registry
[Install]
WantedBy=multi-user.target

Włączenie nowej usługi:

# systemctl daemon-reload
# systemctl enable docker-registry.service

Oraz nowy skrypt startowy:

# cat /usr/local/bin/start-registry.sh
#!/bin/bash

docker run -p 5000:5000 --name registry \
-v /etc/certs/:/certs/ \
-v /opt/registry/:/var/lib/registry/:Z \
-e REGISTRY_HTTP_TLS_KEY=/certs/self.key \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/self.crt \
registry:2
Opcje polecenia „docker run”:
  • -p 5000:5000 <- port :::5000 jest przypięty do portu :5000 kontenera
  • -v /etc/certs/:/certs/ <- katalog /etc/certs z serwera jest zamontowany jako katalog /certs w kontenerze. W ten sposób kontener „zobaczy” wygenerowane wcześniej klucz i certyfikat.
  • -v /opt/registry/:/var/lib/registry/:Z <- katalog /opt/registry/ z serwera jest zamontowany jako /var/lib/registry/. W ten sposób obrazy umieszczone w kontenerze, tak na prawdę zostaną składowane na serwerze. (:Z bez tej opcji SELinux pozawala tylko na odczyt bez zapisu)
  • -e REGISTRY_HTTP_TLS_KEY=/certs/self.key <- przekazanie do kontenera zmiennej środowiskowej (lokalizacja klucza)
  • -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/self.crt <- przekazanie do kontenera zmiennej środowiskowej (lokalizacja certyfikatu)

Uruchamiamy nasze registry:

# chmod +x /usr/local/bin/start-registry.sh
# mkdir /opt/registry/
# systemctl start docker-registry
# systemctl status docker-registry
# ss -taupn | grep :5000

Teraz na dowolnym innym serwerze instalujemy dockera i aktualizujemy konfigurację.

Umieszczamy certyfikat na odpowiedniej ścieżce:

# mkdir /etc/docker/certs.d/registry.my-company.local:5000/
# scp [email protected]:/etc/certs/self.crt /etc/docker/certs.d/registry.my-company.local:5000/ca.crt

Edytujemy plik /etc/sysconfig/docker, a nim modyfikujemy jedną linie:

ADD_REGISTRY='--add-registry registry.my-company.local:5000'

Restartujemy usługę docker:

# systemctl restart docker

Sprawdzamy, czy działa:

# docker pull alpine:latest
# docker tag alpine:latest registry.my-company.local:5000/myalpine:latest
# docker push registry.my-company.local:5000/myalpine:latest
# docker rmi myalpine:latest
# docker rmi alpine:latest
# docker pull myalpine:latest

To oczywiście nie jest jedyny sposób na zbudowanie własnego registry. Bardziej zaawansowani administratorzy powinni zainteresować się instalację docker-registry z pakietów. Dodatkowo warto posłużyć się apache jako front-end i to na nim skonfigurować klucze SSL.