Wenn Sie eine Fehlermeldung über ein unsicheres Zertifikat erhalten, besteht die einfachste Lösung darin, den Docker-Daemon mit der Option "--insecure-registry" zu starten, gefolgt von einer Liste der Hostnamen ihrer Registries inklusive Port. Dies müssen Sie auf jedem Client tun, der die Registry verwenden möchte.
Der Grund für die Fehlermeldung liegt darin, dass beispielsweise aktuelle Linux-Distributionen das Root-Zertifikat von Let's Encrypt nicht in ihrer Keychain installiert haben, auf die Standard-Tools wie der Docker-Daemon (über die Krypto-Libraries) zurückgreifen – während etwa die Webbrowser eigene Keychains mitbringen. Listing 4 zeigt, wie Sie die Root-Zertifikate auf einem Ubuntu-System installieren und aktivieren. Dies müssen Sie nun allerdings auf allen Rechnern tun, von denen Sie oder Ihre Kollegen Docker verwenden, also möglicherweise auch auf Rechnern mit Windows oder macOS – da ist die Option mit den "--insecure-registries" sicher die einfachere.
Listing 4: Zertifikate von Let's Encrypt installieren
curl -O https://letsencrypt.org/certs/isrgrootx1.pem curl -O https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem openssl x509 -in isrgrootx1.pem -inform PEM -out isrgrootx1.crt openssl x509 -in lets-encrypt-x3-cross-signed.pem -inform PEM -out lets-encrypt-x3-cross-signed.crt sudo cp *.crt /usr/local/share/ca-certificates/ sudo update-ca-certificates –verbose I already trust 148, your new list has 150 Certificate added: C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3 1 new root certificates were added to your trust store. ... sudo systemctl restart docker
Interessant dürfte für viele auch der Betrieb einer eigenen Registry als Proxy sein, von der Docker-Dokumentation auch "pull through cache" genannt. Dies ist kein großes Problem. Es genügt, in der Konfigurationsdatei die Anweisung "proxy" hinzuzufügen und darunter die URL der Upstream-Registry einzutragen:
proxy:remoteurl: https://registry-1.docker.io
Eine weitere Option ist es, die Registry wie auch den Auth-Server hinter einem Proxy wie Apache, Nginx oder HAProxy zu betreiben. Dann fällt die Portnummer aus den Registry-URLs heraus und Sie haben auf dem Server zwei offene Ports weniger. Typischerweise erledigen Sie dann die TLS-Terminierung auch über den Proxy, dann kann die Verschlüsselung bei den Servern wegfallen. Sie müssen nur bei der Proxy-Konfiguration anhand der aufgerufenen URLs zwischen den Backends differenzieren. Eine solche Konfiguration für HAProxy können Sie in Listing 5 sehen.
Listing 5: HAProxy-Konfiguration
use_backend registry if { hdr_end(host) -i remote.repository.com } { path_beg /v2 } use_backend registry_auth if { hdr_end(host) -i remote.repository.com } { path_beg /auth } … backend registry server registry 127.0.0.1:5000 backend registry_auth server registry_auth 127.0.0.1:5001