Vergleich zwischen Docker Stop und Kill: Wann welcher Befehl zu verwenden ist

Meistern Sie die Docker-Containerverwaltung, indem Sie die wesentlichen Unterschiede zwischen `docker stop` und `docker kill` verstehen. Erfahren Sie, wann `SIGTERM` für ein ordnungsgemäßes Herunterfahren verwendet werden sollte, um die Datenintegrität zu wahren, und wann `SIGKILL` für die sofortige Beendigung nicht reagierender Container erforderlich ist. Dieser Leitfaden bietet praktische Beispiele und Best Practices für die Auswahl des richtigen Befehls zur optimalen Anwendungsstabilität und einem effizienten Arbeitsablauf.

Docker Stop vs. Kill im Vergleich: Wann welcher Befehl verwendet werden sollte

Wenn Ihr Container heruntergefahren werden muss, sind docker stop und docker kill nicht austauschbar. Der Unterschied ist besonders wichtig, wenn Ihre App Daten schreibt, Netzwerkverbindungen hält oder Aufräumzeit benötigt, bevor sie beendet wird.

Verwenden Sie docker stop für normale Herunterfahrvorgänge. Verwenden Sie docker kill, wenn Sie ein sofortiges Signal benötigen, normalerweise weil der Container einen ordnungsgemäßen Stopp ignoriert hat oder Sie das Fehlerverhalten testen.

docker stop verstehen

Der Befehl docker stop fordert den Hauptprozess des Containers auf, sauber zu beenden. Standardmäßig sendet Docker SIGTERM an PID 1 im Container, wartet eine Gnadenfrist ab und sendet dann SIGKILL, falls der Prozess noch läuft.

Dieses erste Signal kann durch die STOPSIGNAL-Anweisung des Images oder durch die Option --stop-signal geändert werden, die beim Erstellen des Containers verwendet wird. In den meisten alltäglichen Fällen können Sie sich docker stop jedoch als "Sende der App eine Herunterfahranforderung, erzwinge sie dann nur, wenn sie nicht beendet wird" vorstellen.

  • Speichern des aktuellen Zustands.
  • Schließen offener Netzwerkverbindungen.
  • Freigeben gehaltener Ressourcen.
  • Abschließen laufender Vorgänge (wie das Schreiben von Daten auf die Festplatte).

Bei Linux-Containern beträgt die Standardwartezeit üblicherweise 10 Sekunden, sofern für den Container kein anderer Stopp-Timeout konfiguriert wurde. Windows-Container verwenden eine längere Standardeinstellung. Sie können die Wartezeit pro Befehl mit -t oder --time überschreiben.

Wie docker stop funktioniert

  1. Senden von SIGTERM: Docker sendet ein SIGTERM-Signal an den primären Prozess (PID 1) im Container.
  2. Warten auf die Gnadenfrist: Docker wartet darauf, dass der Prozess beendet wird.
  3. Senden von SIGKILL (falls erforderlich): Wenn der Prozess am Ende der Gnadenfrist noch nicht beendet wurde, sendet Docker ein SIGKILL-Signal.

Wann docker stop verwendet werden sollte

  • Normales Herunterfahren der Anwendung: Dies ist die bevorzugte Methode zum Stoppen von Anwendungen, die sauber heruntergefahren werden müssen, wie z. B. Datenbanken, Webserver oder Anwendungen, die kritische Schreibvorgänge durchführen.
  • Entwicklungsumgebungen: Für routinemäßige Stopps während der Entwicklung stellt docker stop sicher, dass Sie laufende Prozesse nicht versehentlich unterbrechen.
  • Produktionsumgebungen für geplante Wartungsarbeiten: Wenn Sie einen Dienst neu starten oder Updates durchführen müssen, ermöglicht docker stop der Anwendung, ihre Arbeit zu beenden.

Beispiel

# Starten Sie einen Container namens 'my-web-server'
docker run -d --name my-web-server -p 80:80 nginx

# Stoppen Sie den Container ordnungsgemäß
docker stop my-web-server

# Überprüfen Sie, ob der Container gestoppt ist
docker ps -a | grep my-web-server

Wenn Ihre App mehr Zeit zum Leeren von Warteschlangen oder Schließen von Datenbankverbindungen benötigt, geben Sie ihr ein längeres Timeout:

docker stop --time 30 my-web-server

docker kill verstehen

Der Befehl docker kill sendet sofort ein Signal an den Hauptprozess des Containers. Standardmäßig ist dieses Signal SIGKILL. Im Gegensatz zu SIGTERM kann SIGKILL vom Prozess nicht abgefangen, ignoriert oder behandelt werden. Das Betriebssystem beendet den Prozess, ohne ihm die Möglichkeit zur Bereinigung zu geben.

Das bedeutet, dass nicht gespeicherte Daten, offene Verbindungen oder laufende Schreibvorgänge unterbrochen werden können. Ein zustandsloser Testcontainer kümmert sich vielleicht nicht darum. Eine Datenbank, ein Warteschlangen-Worker oder ein Job zur Dateiverarbeitung schon.

Sie können auch docker kill --signal verwenden, um ein anderes Signal zu senden, z. B. SIGHUP, aber wenn Ihr Ziel ein ordnungsgemäßes Herunterfahren ist, ist docker stop normalerweise klarer.

Wie docker kill funktioniert

  1. Senden von SIGKILL: Docker sendet ein SIGKILL-Signal direkt an den primären Prozess (PID 1) im Container.
  2. Sofortige Beendigung: Der Prozess wird vom Betriebssystem beendet.

Wann docker kill verwendet werden sollte

  • Nicht reagierende Container: Wenn ein Container hängt und docker stop ihn auch nach der Gnadenfrist nicht beenden konnte.
  • Notstopps: In Situationen, in denen Sie einen Container sofort stoppen müssen, unabhängig von den Konsequenzen, wie z. B. bei Sicherheitsvorfällen oder kritischen Fehlern.
  • Resilienztests: Um zu sehen, wie sich Ihre Anwendung verhält, wenn der Prozess ohne Bereinigung verschwindet.

Beispiel

# Starten Sie einen Container namens 'my-test-app'
docker run -d --name my-test-app ubuntu sleep infinity

# Erzwingen Sie das Stoppen des Containers
docker kill my-test-app

# Überprüfen Sie, ob der Container gestoppt ist
docker ps -a | grep my-test-app

Wichtige Unterschiede zusammengefasst

Merkmal docker stop docker kill
Gesendetes Signal Normalerweise SIGTERM, dann SIGKILL bei Timeout-Ablauf Standardmäßig SIGKILL
Beendigung Ordentlich, ermöglicht Bereinigung Sofortig, erzwungen, keine Bereinigung
Datenintegrität Bewahrt im Allgemeinen die Datenintegrität Risiko von Datenkorruption oder inkonsistentem Zustand
Anwendungsfall Normales Herunterfahren, geplante Wartung Nicht reagierende Container, Notstopps
Gnadenfrist Ja Nein

Best Practices und Überlegungen

  • Versuchen Sie immer zuerst docker stop: Für Routineoperationen sollte docker stop Ihre Standardwahl sein. Es schützt Ihre Anwendungen und Daten.
  • Verstehen Sie die Signale Ihrer Anwendung: Anwendungen können so programmiert werden, dass sie SIGTERM-Signale verarbeiten. Stellen Sie sicher, dass das Einstiegspunkt-Skript oder der Prozessmanager Ihrer Anwendung so eingerichtet ist, dass es auf SIGTERM hört und ordnungsgemäß reagiert.
  • Passen Sie die Gnadenfrist für docker stop an: Sie können eine benutzerdefinierte Gnadenfrist für docker stop mit dem Flag -t oder --time angeben. Zum Beispiel gibt docker stop -t 30 my-container dem Container 30 Sekunden zum Herunterfahren.
  • Verwenden Sie docker kill als letzten Ausweg: Greifen Sie nur dann auf docker kill zurück, wenn docker stop unwirksam ist oder in kritischen, dringenden Situationen.
  • Überwachen Sie die Container-Gesundheit: Die Implementierung von Gesundheitschecks in Ihrer Docker-Einrichtung kann helfen, Container zu identifizieren, die nicht mehr reagieren, sodass Sie Probleme möglicherweise beheben können, bevor sie ein docker kill erfordern.
  • Überprüfen Sie das Verhalten von PID 1: Shell-Wrapper-Skripte können Signale schlucken, wenn sie sie nicht an den eigentlichen App-Prozess weiterleiten. Bevorzugen Sie exec in Einstiegspunkt-Skripten, damit die App Herunterfahrsignale direkt erhält.

Praktische Erkenntnis

Machen Sie docker stop zu Ihrer normalen Gewohnheit, insbesondere bei zustandsbehafteten Dingen. Greifen Sie nur dann zu docker kill, wenn der Container nicht reagiert, wenn Geschwindigkeit wichtiger ist als Bereinigung oder wenn Sie absichtlich das Absturzverhalten testen.