Heute wollte ich aus einem Node.js-Projekt ein Docker-Image erzeugen und es auf meinem lokalen Test-Swarm deployen.
Leider wird ein lokal gebautes Docker-Image nur auf dem Node gespeichert und ist auch nur dort verfügbar, auf dem es erstellt wurde. Die anderen Swarm-Nodes kommen nicht heran.
Die Lösung: das Image in eine Docker-Registry pushen, aus der es dann alle Nodes im Swarm pullen können.
Die Registry erstellen
Um einen Registry-Service im Swarm zu starten, führe Folgendes aus:
docker service create —name registry —publish 5000:5000 registry:latest
Das erstellt den Registry-Service und lässt ihn im Swarm laufen, sodass er für alle Nodes im Swarm erreichbar ist.
Ein Image in die Registry pushen
Um ein Image in die Registry zu pushen, musst du zwei Dinge tun – das Image taggen und dann pushen.
Hier ein Beispiel, wie man das Image in einem Rutsch baut und taggt:
docker build . -t localhost.localdomain:5000/
Und so pusht man es in die Registry:
docker push localhost.localdomain:5000/
Um das Image in einem Service oder Container zu verwenden, gibst du den vollständigen Pfad von oben an, also localhost.localdomain:5000/<image-name>:latest.
Die Swarm-Nodes haben dann Zugriff auf das Image und können es pullen und ausführen.
Wichtiger Hinweis zur Registry-Adresse
In den meisten Tutorials im Netz wird die Registry-URL als localhost:5000 angegeben. Leider funktioniert das nicht, und meistens läuft die Verbindung in einen Timeout. Wenn wir das zu localhost.localdomain ändern, klappt es!
Keine Ahnung, warum das passiert, wo doch sowohl localhost als auch localhost.localdomain zu 127.0.0.1 aufgelöst werden.