Wie starte ich Docker-Container beim Systemstart automatisch?

113

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

Gibt es eine bevorzugte Möglichkeit, dies unter Ubuntu 14.04 zu tun?

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

Stefan Arentz
quelle

Antworten:

136

Offensichtlich besteht die aktuelle Methode zum automatischen Starten von Docker-Containern ( ab Docker 1.2 ) darin, Neustartrichtlinien zu verwenden . Hiermit wird gesteuert, wie Docker das Starten des Containers beim Start und das Neustarten des Containers beim Verlassen des Containers handhaben soll. Bisher habe ich die Option 'always' verwendet und kann bestätigen, dass Docker den Container beim Systemstart automatisch startet:

sudo docker run --restart=always -d myimage

Dokumentationsauszug

Neustartrichtlinien Mit dem Flag --restart bei der Ausführung von Docker können Sie eine Neustartrichtlinie festlegen, wie ein Container beim Beenden neu gestartet werden soll oder nicht.

no - Starten Sie den Container nicht neu, wenn er beendet wird.

On-Failure - Starten Sie den Container nur neu, wenn er mit einem Exit-Status ungleich Null beendet wird.

always - Der Container wird unabhängig vom Beendigungsstatus immer neu gestartet.

Sie können auch festlegen, wie oft Docker maximal versucht, den Container neu zu starten, wenn die On-Failure-Richtlinie verwendet wird. Standardmäßig versucht Docker für immer, den Container neu zu starten.

$ sudo docker run --restart=always redis

Dadurch wird der redis-Container mit der Neustartrichtlinie always ausgeführt. Wenn der Container beendet wird, wird er von Docker neu gestartet.

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

Dadurch wird der Redis-Container mit einer Neustartrichtlinie bei Fehlschlagen und einer maximalen Neustartanzahl von 10 ausgeführt. Wenn der Redis-Container mehr als zehn Mal hintereinander mit einem Beendigungsstatus ungleich Null beendet wird, bricht Docker den Neustart des Containers ab. Die Angabe eines maximalen Neustartgrenzwerts gilt nur für die Richtlinie bei einem Fehler.

aknuds1
quelle
12
"always - Starten Sie den Container unabhängig vom Beendigungsstatus immer neu" ist etwas verwirrend. Der Container wird nicht neu gestartet, wenn Sie den Container manuell beenden. Dies ist das Verhalten, nach dem ich gesucht habe.
27.
12
Hinweis: Eine andere aufgerufene Richtlinie unless-stoppedwurde hinzugefügt. Es verhält sich so, alwaysaber wenn der Container gestoppt und das System neu gestartet wird oder der Docker-Daemon neu gestartet wird, wird der Container nicht neu gestartet. Sehen Sie hier für eine schöne Zusammenfassung aller 4 Optionen blog.codeship.com/…
David Morales
4
Natürlich muss der dockerDaemon automatisch starten, um dies zu unterstützen.
Sherrellbc
Ich denke, die Frage lautet "beim Systemstart", dh nach dem Neustart des physischen oder virtuellen Servers, wie werden die Container automatisch neu gestartet, sofern die Docker-Engine nach dem Neustart des Servers vollständig ausgeführt wird?
Root Loop
8

Docker hat diese Seite , die erklärt, wie es mit upstart und systemd gemacht wird. Ich stimme zu, dass es für Docker nicht das Richtige zu sein scheint. Ihre Lösung lautet "Ausführen". Dabei docker startwird davon ausgegangen, dass Sie Ihren Container bereits erstellt haben. Ich würde denken, dass Sie entweder docker run --rmdas Upstart-Skript ausführen (es wie einen brandneuen Prozess und einen Container aus einem Image behandeln) oder den Docker-Daemon die Container selbst beim Booten neu starten lassen (wie es standardmäßig der Fall ist, wenn Sie nichts anderes tun) ). Upstart bietet den Vorteil, dass Prozesse einfach gestartet / gestoppt werden können. Dies ist jedoch auch beim Starten / Stoppen des Dockers der Fall!

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

Lawrence Kesteloot
quelle
Der Link ist kaputt ... Dies scheint ein möglicher Ersatz zu sein, aber es zeigt auf keinen Fall "wie"
Gert van den Berg
Danke, ich habe den Link zu einer ähnlichen Seite gefixt, kann aber nicht sicher sein, ob dort dasselbe steht wie im Original.
Lawrence Kesteloot
6

Aber für Docker ist das nicht das Richtige.

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.

EEAA
quelle
Thanks @EEAA .. heißt 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 starte die Container im Vordergrund und lasse Supervisor stdout / stderr fangen. Ich bin mir nicht sicher, warum das --rmhier relevant ist.
EEAA
@EEAA: zu deiner Frage: Für manche Leute dockerist das ein Ersatz für lxcoder openvzwelche lxc.start.auto = 1und haben vzctl set --onboot yes. Auch ESXi und andere Virtualisierungslösungen verfügen über eine solche Funktion. Wie Lawrence glaube ich auch nicht, dass eine solche Autostart-Funktion auf verteilungsspezifische Weise implementiert werden sollte, da ein Docker-Benutzer in der Lage sein sollte, dasselbe Problem mit demselben Wissen auf jeder Plattform zu lösen.
Daniel Alder
1
Richtig, Docker ist eine großartige Möglichkeit, den Host von der Ausführung von Containern zu entkoppeln. Die Verwendung der hostspezifischen Konfiguration ist also ein kleiner Rückschritt.
Nijave