/ Docker

Eigene Docker-Registry

Eine eigene Docker-Registry ist eine kostengünstige Möglichkeit eigene Docker-Images zu speichern.

Die Installation

Auf dem System auf dem eine eigene Docker-Registry installiert werden soll, muss auch Docker installiert sein. Die Registry wird nämlich selbst auch als Docker-Container gestartet:

docker run -d -p 5000:5000 --restart=always --name registry registry:2

Lokal kann man dann zum Beispiel ein eigenes Image my-ubuntu in der Registry speichern docker push localhost:5000/my-ubuntu

Die Registry sollte aber aus dem Internet erreichbar und passwortgeschützt sein. Zusätzlich braucht man eine eigene Domain (registry.domain.com) und ein gültiges Zertifikat, das sich mit Hilfe von Let's Encrypt einfach generieren lässt:

sudo letsencrypt certonly --standalone -d registry.domain.com
sudo cp  /etc/letsencrypt/archive/registry.domain.com/* certs

Für den Passwortschutz muss eine htpasswd generiert werden:

mkdir auth && docker run --entrypoint htpasswd registry:2 -Bbn user pass > auth/htpasswd

Dann kann auch schon die Registry gestartet werden:

sudo docker run -d \
--restart=always --name registry -v $(pwd)/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-v $(pwd)/certs:/certs \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.domain.com.pem \
-e REGISTRY_HTTP_TLS_KEY=/certs/registry.domain.com.pem \
-p 443:443 registry:2

Die Verwendung

Die Registry ist jetzt erreichbar und kann nach Passworteingabe verwendet werden. Leider funktioniert ein Login mit docker login registry.domain.com nicht. Das von Let's Encrypt generierte Zertifikat wird nicht als vertrauenswürdig eingestufft. Das Problem ist, dass das Let's Encrypt-Zertifikat nicht vertrauenswürdig genug für den Docker-Client ist. Abhilfe schafft es Let's Encrypts Intermediate-Zertifikat hier herunterzuladen: https://letsencrypt.org/certificates/ als intermediate-certificate.pem zu speichern und an den Inhalt der Datei registry.domain.com.crt dran zu hängen: cat registry.domain.com.crt intermediate-certificate.pem > registry.domain.com.crt. Jetzt noch den laufenden Container löschen und neu starten.

Siehe:
https://docs.docker.com/registry/deploying/