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
- Reset Docker Factory Defaults (optional, für sauberes Szenario machen wir das jetzt)
- Zertifikat erstellen. https://docs.docker.com/registry/insecure/
- openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/uranus.key -x509 -days 365 -out certs/uranus.crt
- WICHTIG: Hostname muss als Common Name angegeben werden.
- Docker Registry starten, die Zertifikate müssen gemappt sein. https://docs.docker.com/registry/deploying/
- 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
- 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.
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