GNU/Linux >> LINUX-Kenntnisse >  >> Panels >> Docker

Anfängerleitfaden zur Docker-Neustartrichtlinie

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.


Docker
  1. Was ist ein Docker-Container:Eine Einführung für Anfänger

  2. So führen Sie Nginx in einem Docker-Container aus:Eine Schritt-für-Schritt-Anleitung

  3. So führen Sie MySQL im Docker-Container aus:Eine einfache, leicht verständliche Anleitung

  4. Einige DOCKER-Befehle

  5. So weisen Sie einem Docker-Container eine statische IP zu

Docker lernen:So erstellen Sie einen Docker-Container

So verwenden Sie Docker-Neustartrichtlinien, um Container am Laufen zu halten

So führen Sie PHPMyAdmin in einem Docker-Container aus

So führen Sie Grafana in einem Docker-Container aus

So richten Sie einen Apache Docker-Container ein

Docker-Befehle zum Verwalten des Containerlebenszyklus (Definitive Guide)