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.