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.