Was ist der Unterschied zwischen "docker stop" und "docker kill"?

53896
Geert-Jan

Was ist der Unterschied zwischen docker stopund docker kill?

Afaik, beide stoppen einen laufenden Container. Ist es, dass docker stopder Prozess innerhalb des Behälters in der richtigen Art und Weise laufen zu stoppen versucht, während docker killein Kill - Signal senden? Wenn ja, wie könnte man docker stopden laufenden Prozess korrekt stoppen? (Da sich dies von Prozess zu Prozess unterscheidet)

89

3 Antworten auf die Frage

85
Steffen Opel

Ist es so, dass Docker Stop versucht, den Prozess im Container auf korrekte Weise zu stoppen, während Docker Kill ein Kill-Signal sendet?

Grundsätzlich ist der Unterschied geringfügig, wird jedoch in der Befehlszeilenreferenz beschrieben :

  • Docker-Stopp : Stoppen Sie einen laufenden Container ( senden Sie SIGTERM und dann SIGKILL nach Ablauf der Gnadenfrist ) [...] Der Hauptprozess im Container erhält SIGTERM und nach einer Gnadenfrist SIGKILL. [Hervorhebung mein]
  • docker kill : Beendet einen laufenden Container ( sendet SIGKILL oder angegebenes Signal ) [...] Der Hauptprozess im Container wird SIGKILL oder ein beliebiges Signal gesendet, das mit der Option --signal angegeben wurde. [Hervorhebung mein]

Es wird also stopversucht, ein ordnungsgemäßes Herunterfahren durch Senden des Standard- POSIX-Signals auszulösen SIGTERM, während killder Prozess standardmäßig beendet wird (aber auch jedes andere Signal gesendet werden kann):

Das SIGTERM-Signal wird an einen Prozess gesendet, um dessen Beendigung anzufordern. Im Gegensatz zum SIGKILL-Signal kann es vom Prozess abgefangen und interpretiert oder ignoriert werden. Auf diese Weise kann der Prozess eine schöne Beendigungsfreigabe durchführen und gegebenenfalls den Status speichern. Es ist zu beachten, dass SIGINT nahezu identisch mit SIGTERM ist.

Obwohl dies in keiner Weise erzwungen wird, wird im Allgemeinen von Prozessen erwartet, SIGTERMdass sie ordnungsgemäß arbeiten und abhängig von ihren Verantwortlichkeiten das Richtige tun. Dies kann leicht fehlschlagen, da der Versuch des Herunterfahren des Herunterfahrens länger dauert als die Übergangszeit, was zu berücksichtigen ist, wenn die Datenintegrität zutrifft vorrangig (zB für Datenbanken); Eine ausführlichere Erklärung finden Sie z. B. bei Major Hayden's SIGTERM vs. SIGKILL :

Die Anwendung kann bestimmen, was sie tun möchte, wenn ein SIGTERM empfangen wird. Während die meisten Anwendungen ihre Ressourcen bereinigen und stoppen, tun dies manche nicht. Eine Anwendung kann so konfiguriert sein, dass sie etwas völlig anderes tut, wenn ein SIGTERM empfangen wird. Wenn sich die Anwendung in einem fehlerhaften Zustand befindet, beispielsweise auf Festplatten-E / A, wartet sie möglicherweise nicht auf das gesendete Signal.

Wenn ich also ein generisches Abschaltverfahren für Container haben wollte, müsste ich das SIGTERM im Supervisor / Runit-Prozess einfangen? CMCDragonkai vor 9 Jahren 1
Was ist die beste Praxis hier? Ich verstehe, warum wir "docker kill" von Hand verwenden würden, um beim Herunterfahren etwas Zeit zu sparen, aber wäre es in einem Skript nicht immer besser, ein elegantes Herunterfahren über "docker stop" zu versuchen? Ich sehe immer noch viele `Docker-Kill`s in Skripten. Dennis vor 5 Jahren 0
6
awkwardarts

docker kill stoppt den Haupteingangspunkt / das Programm abrupt

docker stop wird versuchen, es graziös zu stoppen (wird höflich fragen: P)

In beiden Fällen bleiben die Änderungen des Dateisystems erhalten (zum Zeitpunkt von stop oder kill). Wenn Sie dies docker start <container>dann tun, wird es von dort fortgesetzt.

... aber im Fall von "docker kill" gehen alle anstehenden Dateisystemänderungen, die der Hauptprozess noch im Speicher hatte, verloren, sodass das Dateisystem möglicherweise beschädigt wird? Arjan vor 7 Jahren 1
Da es sich um einen abrupten Stopp handelt, werden offensichtlich nur Änderungen zum Zeitpunkt der Tötung beibehalten. Alles ausstehende geht verloren. Mein Punkt war, dass Docker-Kill nicht wirklich ... den Container töten und den Prozess stoppen wird. B. wenn Sie Ihren Computer ausschalten, anstatt herunterzufahren awkwardarts vor 7 Jahren 0
0
faboulaws

Und zusätzlich zu den Antworten hinzugefügt

läuft docker eventsnach docker stopzeigt Ereignisse

  • kill (Signal 15): wobei Signal 15 = SIGTERM
  • sterben
  • halt

läuft docker eventsnach docker killzeigt Ereignisse

  • kill (Signal 9): wobei Signal 9 = SIGKILL ist
  • Sterben (Ausfahrt Code 137)

docker stophat eine Auszeit, bevor der Prozess beendet wird. Der Standardwert beträgt 10 Sekunden.

Diese Tabelle enthält noch mehr Details.