Frage Wie starte ich Andock-Container beim Systemstart automatisch?


Was ist eine gute Möglichkeit, Docker-Container beim Hochfahren des Systems automatisch zu starten?

Gibt es einen bevorzugten Weg, dies auf Ubuntu 14.04 zu tun?

Ich habe gebraucht supervisord in der Vergangenheit, um Web-Apps automatisch zu starten. Aber das ist nicht das Richtige für Docker.


99
2017-10-02 14:25


Ursprung




Antworten:


Anscheinend ist die aktuelle Methode, Docker-Container automatisch zu starten (von Docker 1.2) ist zu benutzen Richtlinien neu starten. Dadurch wird gesteuert, wie Docker den Start des Containers beim Start und Neustart des Containers beim Beenden behandeln soll. Ich habe bisher die Option "immer" verwendet und kann bestätigen, dass Docker den Container beim Systemstart automatisch startet:

sudo docker run --restart=always -d myimage

Auszug aus der Dokumentation

Neustart-Richtlinien Mit dem - Restart-Flag auf Docker können Sie ausführen   Spezifizieren Sie eine Neustart-Richtlinie für die Art und Weise, wie ein Container sein sollte oder nicht   beim Beenden neu gestartet.

nein - Starten Sie den Container beim Beenden nicht neu.

on-failure - Starten Sie den Container nur neu, wenn er nicht mit Null beendet wird   Ausgangsstatus

immer - Den Container immer neu starten, unabhängig vom Beendigungsstatus.

Sie können auch festlegen, wie oft Docker versuchen wird   Starten Sie den Container neu, wenn Sie die Richtlinie für fehlgeschlagene Vorgänge verwenden. Der Standardwert ist   Der Docker versucht immer, den Container neu zu starten.

$ sudo docker run --restart=always redis

Dies wird die Redis ausführen   Container mit einer Neustart-Richtlinie von immer, so dass wenn der Container   beendet, Docker wird es neu starten.

$ sudo docker run --restart=on-failure:10 redis

Dies wird die   redis container mit einer Neustart-Richtlinie für einen Fehler und einem Maximum   Zähle 10 neu. Wenn der Redis-Container mit einem Nicht-Null-Exit beendet wird   status mehr als 10 mal hintereinander Docker bricht den Versuch ab, neu zu starten   der Kontainer. Die Bereitstellung eines maximalen Wiederanlauflimits gilt nur für   Ausfallpolitik.


120
2017-12-07 20:18



"immer - Immer den Container unabhängig vom Exit-Status neu starten" ist etwas verwirrend. Der Container wird nicht neu gestartet, wenn Sie den Container manuell beenden / stoppen. Dies ist das Verhalten, nach dem ich gesucht habe. - w00t
genial! Danke, versuch es jetzt. - zx1986
Hinweis: Eine andere Richtlinie wird aufgerufen unless-stopped wurde hinzugefügt. Es verhält sich wie always Wenn der Container jedoch angehalten wird und das System neu gestartet wird oder der Andockdämon neu gestartet wird, wird der Container nicht neu gestartet. Sehen Sie hier für eine nette Zusammenfassung aller 4 Optionen blog.codeship.com/... - David Morales
Natürlich, die docker Der Daemon muss automatisch starten, um dies zu unterstützen. - sherrellbc


Docker hat diese Seite Das erklärt, wie man es mit Upstart und Systemd macht. Ich stimme zu, dass es für Docker nicht das Richtige ist. Ihre Lösung ist zu laufen docker start, die davon ausgeht, dass Sie Ihren Container bereits erstellt haben. Ich würde denken, dass du es entweder tun würdest docker run --rm im Upstart-Skript (Behandeln Sie es wie einen brandneuen Prozess und Container aus einem Bild) oder lassen Sie den Docker-Dämon die Container selbst beim Booten neu starten (wie es standardmäßig ist, wenn Sie nichts anderes tun). Upstart hat den Vorteil, das Starten / Stoppen von Prozessen zu vereinfachen, aber Sie bekommen das auch mit dem Start / Stop von Docker!

Ich denke, es ist seltsam, den Benutzer zu zwingen, manuell einen Container (mit allen korrekten Port / Volume-Bindungen) zu erstellen, bevor das Upstart-Skript funktioniert.


7
2017-10-14 04:49





Aber das ist nicht das Richtige für Docker.

Warum nicht?

Ich benutze supervisord dafür mit großem Erfolg.

Verwenden Sie, was Sie wissen, verwenden Sie, was funktioniert, verwenden Sie etwas, das Sie leicht pflegen und verstehen können.


4
2017-10-02 14:27



Danke @EEEAA .. bedeutet das, dass Sie sie im Nicht-Daemon-Modus ausführen? Bedeutet das nicht auch, dass Sie sie ausführen müssen? --rm ? - Stefan Arentz
Ich lasse die Container im Vordergrundmodus laufen und lasse supervisord stdout / stderr fangen. Ich bin mir nicht sicher warum --rm ist hier relevant. - EEAA
@EEEAA: zu deiner Frage: Für manche Leute, docker ist ein Ersatz für lxc oder openvz welche haben lxc.start.auto = 1 und vzctl set --onboot yes. Auch ESXi und andere Virtualisierungslösungen enthalten eine solche Funktion. Wie Lawrence glaube ich auch nicht, dass solch ein Autostart-Feature in einer verteilungsspezifischen Weise implementiert werden sollte, da ein Docker-Benutzer in der Lage sein sollte, das gleiche Problem mit demselben Wissen auf jeder Plattform zu lösen. - Daniel Alder
Richtig, Docker ist eine großartige Möglichkeit, den Host von laufenden Containern zu entkoppeln, so dass die Verwendung der hostspezifischen Konfiguration ein kleiner Schritt zurück ist. - nijave