Starten Sie einen Dienst im Docker-Schwarmstapel neu

79

Weiß jemand, ob es eine Möglichkeit gibt, dass Docker Swarm einen Dienst, der Teil eines Stapels ist, neu startet, ohne den gesamten Stapel neu zu starten?

tweeks200
quelle

Antworten:

108

Doing docker stack deployfür mich wieder der Weg zu Update - Dienste zu gehen. Nach Francois 'Antwort und auch nach meiner eigenen Erfahrung werden dadurch nur Dienste aktualisiert, die aktualisiert werden müssen.

Aber manchmal scheint es beim Testen einfacher zu sein, nur einen einzigen Dienst neu zu starten. In meinem Fall musste ich das Volume löschen und den Dienst aktualisieren, um ihn so zu starten, als wäre er frisch. Ich bin mir nicht sicher, ob die von mir beschriebene Methode einen Nachteil hat. Ich habe es auf meinem Entwicklungsstapel getestet und es hat großartig für mich funktioniert.

Rufen Sie die Dienst-ID ab, die Sie herunterfahren möchten, und docker service update --force <id>erzwingen Sie dann die Aktualisierung des Dienstes, der ihn effektiv erneut bereitstellt

$ docker stack services <stack_name>
ID                  NAME              ...
3xrdy2c7pfm3        stack-name_api    ...

$ docker service update --force 3xrdy2c7pfm3

Das --forceFlag erzwingt eine Aktualisierung des Dienstes und führt zu einem Neustart.

Matt
quelle
68

Auf 0 skalieren und sichern:

docker service scale myservice=0
docker service scale myservice=10
Luke W.
quelle
2
Dieser ist der einzige, der tatsächlich einen Neustart erzwingt. Vielen Dank!
the_ccalderon
1
stimme zu, nur ein Update zu erzwingen hat den Dienst für mich nicht neu gestartet, weiß nicht warum
Egor
Obwohl diese Methode den Dienst zu stoppen scheint, lauert der Dienst irgendwie tief im Darm des Tieres. Zum Beispiel wird "Port bereits verwendet" angezeigt, wenn ich den Dienst verkleinere und versuche, einen anderen zu drehen, der denselben Port verwendet.
Netlander
14

Betrachten Sie die docker stackDokumentation:

Erweiterte Beschreibung

Erstellen und aktualisieren Sie einen Stapel aus einer Compose- oder einer Tupferdatei auf dem Schwarm

Aus diesem Blog-Artikel : docker stackfunktioniert ähnlich wie docker compose. Es ist idempotent . Wenn der Stack bereits bereitgestellt ist, docker stack deploywerden nur die Dienste neu gestartet, deren Digest oder Tag aktualisiert wurde:

Docker-Stack-Prozess

Nach meiner Erfahrung wird nur der aktualisierte Dienst neu gestartet , wenn ich denselben Stack mit einem sich ändernden Dienst erneut bereitstelle .

ABER ... es scheint einige Einschränkungen für Änderungen zu geben, die berücksichtigt werden (einige melden Fehler mit Bild-Tags ). Probieren Sie es also aus und prüfen Sie, ob es wie erwartet funktioniert.

Sie können auch verwenden, service updatewenn Sie sicher sein möchten, dass nur ein gezielter Dienst mit Ihren Änderungen aktualisiert wird.

Sie können sich auch auf diese ähnliche SO-Qualitätssicherung beziehen .

François Maturel
quelle
Danke, das funktioniert wie erwartet. Ich versuche tatsächlich, einen Neustart eines bestimmten Dienstes (oder des gesamten Stapels) fortlaufend zu erzwingen. Leider haben einige Dienste, mit denen ich zu tun habe, Probleme mit der Cache-Ungültigmachung, und wir müssen den Stack entfernen / erneut bereitstellen, um die Aktualisierungen zu erzwingen. Wenn service updateich mir die Dokumentation anschaue, könnte ich envVariablen hinzufügen / entfernen , um sie zu fälschen, wenn es keine eingebaute Methode gibt.
Tweeks200
War nur auf der Suche nach dem gleichen Ding - konnte keine in den Dokumenten finden.
Morgan Kobeissi
Ich habe gerade folgendes Problem docker stack deployfestgestellt : Ich würde keinen Dienst starten (openldap). Ich konnte keine Protokolldatei finden. docker-compose run <service>würde den Container ohne Probleme starten. Endlich docker service update --force <servce>hat funktioniert.
Rhoerbe
0

Gemäß dem Beispiel in der Dokumentation für fortlaufende Updates:

$ docker service update --image redis: 3.0.7 redis

Dies funktioniert jedoch nur, wenn sich Ihr Image bereits auf den lokalen Computern befindet. Wenn nicht, müssen Sie --with-registry-auth verwenden, um Registrierungsauthentifizierungsdetails an die Schwarmagenten zu senden. Weitere Informationen finden Sie in der Dokumentation zum Docker-Service-Update.

$ docker service update --with-registry-auth --image redis: 3.0.7 redis

Robert Wasmann
quelle
-1

entfernen Sie es:

docker stack rm stack_name

Stellen Sie es erneut bereit:

docker stack deploy -c docker-compose.yml stack_name
Xiaorong Liao
quelle
Die oben akzeptierte Antwort funktioniert und funktioniert rollierend, um Ausfallzeiten zu vermeiden
tweeks200