Docker bietet eine Option für Neustartrichtlinien, damit Ihre Container bei bestimmten Ereignissen oder Fehlern automatisch neu gestartet werden.
Dies ist äußerst hilfreich in Szenarien, in denen Sie den Docker-Host (Ihren Linux-Server) neu starten müssen oder wenn der im Container ausgeführte Dienst ausfällt.
Docker-Neustartrichtlinien werden auf Containerbasis angewendet. Es gibt zwei Möglichkeiten, einem Container eine Neustartrichtlinie zuzuweisen. Sie können es in der YAML-Datei festlegen, wenn Sie Docker Compose oder Swarm oder Kubernetes verwenden.
Sie können die Neustartrichtlinie auch direkt in der Befehlszeile festlegen, wenn Sie einen Container ausführen:
docker container run --restart <policy>
Lassen Sie uns darüber sprechen, welche Art von Neustartrichtlinie Sie verwenden können.
Docker-Neustartrichtlinien
Es gibt folgende Neustartrichtlinien für Docker-Container:
- no:Das Standardverhalten ist, Container nicht automatisch zu starten
- immer:Starten Sie einen angehaltenen Container immer neu, es sei denn, der Container wurde explizit angehalten
- unless-stopped:Starten Sie den Container neu, es sei denn, der Container war im gestoppten Zustand, bevor der Docker-Daemon gestoppt wurde (später erklärt)
- on-failure:Container neu starten, wenn er mit einem Exit-Code ungleich Null beendet wurde oder wenn der Docker-Daemon neu gestartet wird
Wie ich bereits erwähnt habe, gilt:Wenn Sie nicht ausdrücklich eine Neustartrichtlinie hinzufügen, wird diese mit „no“ angezeigt, was bedeutet, dass Container nicht automatisch neu gestartet werden.
Erläuterung der Docker-Neustartrichtlinien mit Beispielen
Lassen Sie mich diese Richtlinien in Aktion zeigen, damit Sie sie tatsächlich visualisieren können. Dies ist besonders hilfreich, um den Unterschied zwischen always
zu verstehen und unless-stopped
Richtlinien.
Richtlinie immer neu starten
Beginnen wir mit dem always
Richtlinie neu starten. Mit dieser Richtlinie wird der Container immer neu gestartet, es sei denn, er wurde explizit gestoppt.
Ich werde einen Alpine-Linux-Container mit always
ausführen Richtlinie neu starten. Ich nenne es Always-Policy.
Der Container hat eine Aufgabe. Es führt den Bash-Sleep-Befehl 10 Sekunden lang aus und wird dann beendet.
docker container run --name always-policy --restart always alpine sleep 10
Ohne den always
Neustartrichtlinie hätte der Container nach 10 Sekunden angehalten. Aber hier wird es automatisch neu gestartet und der Sleep-Befehl für weitere 10 Sekunden ausgeführt und so weitergemacht.
[email protected]:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1171dcfb7e06 alpine "sleep 10" 25 seconds ago Up 4 seconds always-policy
Sie können im obigen Befehl sehen, dass der Container zwar vor 25 Sekunden erstellt wurde, aber erst seit 4 Sekunden aktiv ist. Bitte beachten Sie, dass derselbe Container neu gestartet wird und kein neuer erstellt wird.
Sie können den Befehl docker inspect verwenden, um zu sehen, wie oft der Container bisher neu gestartet wurde.
[email protected]:~$ docker inspect always-policy | grep -i restartcount
"RestartCount": 4,
Wenn Sie den Container mit dem Stop-Befehl stoppen, wird er danach nicht automatisch neu gestartet. Im folgenden Beispiel sehen Sie möglicherweise, dass der Container jetzt den Status "Beendet" anstelle von "Up" hat.
[email protected]:~$ docker stop always-policy
always-policy
[email protected]:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1171dcfb7e06 alpine "sleep 10" 58 seconds ago Exited (0) 6 seconds ago always-policy
Ich habe das -it
verwendet Option zum Ausführen des Containers mit interaktivem Terminal im obigen Screenshot. Das war hier aus Gewohnheit und unnötig.
unless-stopped-vs-always-restart-policy
Der unless-stopped
ähnelt dem always
Richtlinie neu starten. Beide starten die Container automatisch neu und wenn Sie die Container explizit stoppen, werden sie nicht neu gestartet.
Aber der Hauptunterschied zwischen den beiden besteht darin, dass, wenn Sie die Container mit dem Befehl docker stop stoppen und dann den Docker-Daemon neu starten, der Container mit always
Die Neustartrichtlinie startet den Container automatisch, aber den Container mit unless-stopped
Richtlinie wird nicht neu gestartet.
Lassen Sie es mich anhand von Beispielen zeigen. Ich habe bereits einen angehaltenen Container mit der Richtlinie „Immer neu starten“. Lassen Sie mich einen neuen Container namens unless-stopped-policy erstellen mit unless-stopped
Richtlinie.
docker container run --name unless-stopped-policy --restart always alpine sleep 10
Beenden Sie den Container:
docker stop unless-stopped-policy
Jetzt habe ich zwei Container, die explizit gestoppt wurden:
[email protected]:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d244b6e08899 alpine "sleep 10" 2 minutes ago Exited (0) About a minute ago unless-stopped-policy
1171dcfb7e06 alpine "sleep 10" 22 minutes ago Exited (0) 21 minutes ago always-policy
Starten Sie den Docker-Daemon neu:
sudo systemctl restart docker
Wenn Sie nun die ausgeführten Container überprüfen, können Sie sehen, dass der Container namens always-policy ausgeführt wird, da er mit always
festgelegt wurde Richtlinie neu starten.
[email protected]:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1171dcfb7e06 alpine "sleep 10" 30 minutes ago Up 8 seconds always-policy
Die gesamten Schritte sind in diesem Screenshot zu sehen:
Neustartrichtlinie bei Fehler
Der on-failure
Die Richtlinie zum Neustart startet einen Container neu, wenn er mit einem Exit-Code ungleich Null beendet wurde (was auf einen Fehler/Ausfall hinweist). Es startet auch die Container neu, wenn der Docker-Daemon neu startet, einschließlich derer, die zuvor im gestoppten Zustand waren.
Wenn Sie einen Container manuell mit dem Docker-Stopp-Befehl stoppen, existiert er mit dem Code Null, der anzeigt, dass alles normal war.
Festlegen der Neustartrichtlinie in der Docker-Compose-Datei
Inzwischen haben Sie eine ziemlich gute Vorstellung davon, wie Sie einen Container mit einer Neustartrichtlinie ausführen.
Wenn Sie etwas wie Docker Compose zum Bereitstellen von Containern verwenden, können Sie die Neustartrichtlinie für das Dienstobjekt in der YAML-Datei angeben.
Hier ist ein Beispielbeispiel:
version: "3.3"
services:
NginxProxy:
image: "jwilder/nginx-proxy:latest"
restart: "on-failure"
networks: ["net"]
ports:
- "80:80"
- "443:443"
Welche Docker-Neustartrichtlinie soll verwendet werden?
Ehrlich gesagt gibt es auf diese Frage keine einfache Antwort. Es hängt von Ihrem Anwendungsfall und Ihren Wünschen ab.
Ich hoffe, dieser Artikel war hilfreich, um die Docker-Neustartrichtlinie zu verstehen. Wenn Sie Fragen oder Anregungen haben, lassen Sie es mich bitte im Kommentarbereich wissen.