Docker: Remote Zugriff auf Insecure Registry

Bereitstellung einer Remote Registry mit Docker for Windows

Per Default ist nur localhost Zugriff auf eine Registry in einem Docker for Windows gestattet. Möchte man über den Hostname auf die Registry von einem anderen Rechner (oder auch lokal) zugreifen, bekommt man sowas: http: server gave HTTP response to HTTPS Client.

Die Registry läuft lokal nicht mit HTTPS sondern HTTP, das bedeutet, dass wir HTTPS an der Registry aktivieren und uns vorher ein eigenes Certi generieren müssen. Ok, super Sache, das ist gleich gemacht.

Ein erneuter Push führt dann allerdings in die nächste Grube: x509: certificate signed by unknown authority

Laut Docker sollte das sich beheben lassen, indem man dem Docker Daemon diese als insecure bekannt macht (https://docs.docker.com/registry/insecure/). Das war allerdings nicht von Erfolgt gekrönt.

Letztlich muss man das Zerti von oben dann auch noch unter Windows installieren.

Nun klappt auch ein Remote Push und Pull – super.

Ausführliche Lösungsbeschreibung

  1. Reset Docker Factory Defaults (optional, für sauberes Szenario machen wir das jetzt)
  2. Zertifikat erstellen. https://docs.docker.com/registry/insecure/
    1. openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/uranus.key -x509 -days 365 -out certs/uranus.crt
    2. WICHTIG: Hostname muss als Common Name angegeben werden.
  3. Docker Registry starten, die Zertifikate müssen gemappt sein. https://docs.docker.com/registry/deploying/
    1. docker run -d  –restart=always  –name registry  -v D:\projekte\mediahub\helm\certs:/certs  -e REGISTRY_HTTP_ADDR=0.0.0.0:443  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/uranus.crt   -e REGISTRY_HTTP_TLS_KEY=/certs/uranus.key   -p 443:443   registry:2
  4. Wenn man nun etwas in die Registry pushed, kommt dennoch x509: certificate signed by unknown authority. Das liegt daran, dass der Docker Host auch das Zertifikat kennen muss. Daher muss man das installieren wie hier beschrieben: https://docs.docker.com/registry/insecure/

Open Windows Explorer, right-click the certificate, and choose Install certificate.
Then, select the following options:

  • Store location: local machine
  • Check place all certificates in the following store
  • Click Browser, and select Trusted Root Certificate Authorities
  • Click Finish

Da steht zwar, dass man Docker durchstarten muss, allerdings ging es auch ohne Restart.
Übrigens: Es macht dann auch keinen Unterschied, ob TLS enabled ist oder nicht.

Informatikwerk Cloud Icon

Möglicherweise funktioniert das mit einer anderen Docker Version wieder anders. Wenn man im Internet nach konkret diesem Ziel und den geschilderte Problemen sucht, dann findet man allerhand, und jeder scheint eine „eigene“ Lösung zu haben. Die abenteuerlichste war, sich über einen Priviliged Container auf den Docker Host zu hacken und dann die Certis dort in der Virtualisierung unterzuschieben – hat bei mir auch nicht funktioniert, was vermutlich daran lag, dass die Anpassungen dort nach einen Docker restart immer weg sind und von anderen Usern dann mit Scripten gelöst wurde.

Man muss dazu sagen, dass solche Lösungen „früher“ aus der Not entstanden sind. Docker entwickelt sich halt immer weiter.

D:\projekte\mediahub\helm>docker version
Client: Docker Engine - Community
Version: 19.03.1
API version: 1.40
Go version: go1.12.5
Git commit: 74b1e89
Built: Thu Jul 25 21:17:08 2019
OS/Arch: windows/amd64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 19.03.1
API version: 1.40 (minimum version 1.12)
Go version: go1.12.5
Git commit: 74b1e89
Built: Thu Jul 25 21:17:52 2019
OS/Arch: linux/amd64
Experimental: false