Sowohl an der Arbeit wie auch Privat gibt es immer wieder die unterschiedlichsten Gründe, ein Docker Image nicht in den DockerHub zu laden. Will man trotzdem zum Beispiel mit seiner Arbeitsgruppe seine Docker Images auf einfache weise teilen, kann sich die Installation eines eigenen Docker Repositories lohnen. Genau Dafür kann man Docker Registry verwenden. Eleganter weise kann man auch Docker Registry in einem Container laufen lassen.
Download und starten von Docker Registry
Um das entsprechende Image für Docker Registry auf unserem Server zu hinterlegen, laden wir dieses mit docker pull vom DockerHub herunter. Das ganze sieht dann wie folgt aus:
1 2 3 4 5 6 7 8 9 10 | docker pull registry Using default tag: latest latest: Pulling from library/registry 81033e7c1d6a: Pull complete b235084c2315: Pull complete c692f3a6894b: Pull complete ba2177f3a70e: Pull complete a8d793620947: Pull complete Digest: sha256:672d519d7fd7bbc7a448d17956ebeefe225d5eb27509d8dc5ce67ecb4a0bce54 Status: Downloaded newer image for registry:latest |
Nach dem Download lege ich zwei Verzeichnisse an. In dem einen Verzeichnis werde ich einen SSL Key für den Registry Container generieren. Der zweite Ordner dient zur Ablage der Docker Images, welche durch den Registry Container verwaltet werden sollen.
1 2 | mkdir -p /srv/docker/registry/certs mkdir -p /srv/docker/registry/data |
In /srv/docker/registry/certs generiere ich nun den SSL Key:
1 2 | sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /srv/docker/registry/certs/registry.key -out /srv/docker/registry/certs/registry.crt |
Nun kann der Docker Container gestartet werden. Beim Starten übergeben wir als Parameter noch den Pfad zur Ablage der Images und zum SSL Key.
1 2 3 4 5 | sudo docker run -d -p 5000:5000 --restart=always --name registry -v /srv/docker/registry/data:/var/lib/registry \ -v /srv/docker/registry/certs:/certs \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/registry.key \ registry:latest |
Anschließend können wir noch einmal prüfen, ob der Docker Container auch gestartet ist:
1 2 3 | docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 71a665da01de registry:latest "/entrypoint.sh /etc…" About a minute ago Up About a minute 0.0.0.0:5000->5000/tcp registry |
Push eines Docker Images zum Docker Registry Container
Damit man nun ein Docker Images auf den eigenen Docker Registry Container schieben kann, muss das Docker Images entsprechen mit der Adresse des Registry Container getagt werden. Das ganze sieht für das Images hello-world dann wie folgt aus:
1 | docker tag hello-world 192.168.10.95:5000/hello-world |
Damit ist die Vorbereitung des Images abgeschlossen. Um jetzt zur Registry pushen zu können, müssen wir die IP Adresse oder den DNS Namen in Insecure registries hinterlegen.
Auf dem Desktop öffnet man dazu die Einstellungen von Docker, im Reiter Deamon kann man dann die Einstellungen entsprechend durchführen.
Nachdem diese Einstellung auf Clientseite durchgeführt wurde, können wir das Image in die Docker Registry pushen. Dafür verwendet man den folgenden Befehl:
1 2 3 4 | docker push 192.168.10.75:5000/hello-world The push refers to repository [192.168.10.75:5000/hello-world] af0b15c8625b: Pushed latest: digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a size: 524 |
Pull eines Docker images vom Docker Registry Container
Als nächstes wollen wir testen, ob man das Image vom Registry Server herunterladen kann. Dafür lösche ich als erstes das lokale Image löschen. Mit dem folgenden Befehl können schaue ich mir genau das Image an, welches zuvor in die Registry übertragen wurde.
1 2 3 | docker images 192.168.10.75:5000/hello-world REPOSITORY TAG IMAGE ID CREATED SIZE 192.168.10.75:5000/hello-world latest fce289e99eb9 7 months ago 1.84kB |
Mit diesem Befehl kann man nach dem löschen prüfen, ob das Image wirklich gelöscht ist. Das Images löscht man nun mit dem folgenden Befehl:
1 2 3 | docker image rm 192.168.10.75:5000/hello-world Untagged: 192.168.10.75:5000/hello-world:latest Untagged: 192.168.10.75:5000/hello-world@sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a |
Verwendet man dann noch mal den Befehl zum Anzeigen des Images, wird kein Image mit dem Namen mehr gefunden:
1 2 | docker images 192.168.10.75:5000/hello-world REPOSITORY TAG IMAGE ID CREATED SIZE |
Jetzt können wir das Image von der Registry herunterladen. Dafür verwendet man den folgenden Befehl:
1 2 3 4 5 6 | docker pull 192.168.10.75:5000/hello-world Using default tag: latest latest: Pulling from hello-world Digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a Status: Downloaded newer image for 192.168.10.75:5000/hello-world:latest 192.168.10.75:5000/hello-world:latest |
Wir verwenden nun wieder den Befehl zum Anzeigen des Images. Jetzt sollte dieses wieder auf unserem System vorhanden sein.
1 2 3 | docker images 192.168.10.75:5000/hello-world REPOSITORY TAG IMAGE ID CREATED SIZE 192.168.10.75:5000/hello-world latest fce289e99eb9 7 months ago 1.84kB |
Damit haben wir die Funktion des Registry Servers getestet.
Markus Watermeyer meint
Moin, erstmal danke für die Anleitung. War ja gar nicht so wild ;-D
Habe nun aber das Problem, dass der „Handshake“ irgendwie nicht funktioniert. Ich bekomme folgenden Fehler:
Get https://:5000/v2/: x509: cannot validate certificate for because it doesn’t contain any IP SANs
Irgendeine Ahnung, was ich da machen kann?