Яка різниця між `docker stop` і` docker kill`?


116

Яка різниця між docker stopі docker kill?

Афаїк, обидва зупинять запущений контейнер. Це docker stopспроби зупинити процес, який запускається всередині контейнера правильним чином, при docker killцьому надсилатиме сигнал убити? Якщо так, як би docker stopзнати, як правильно зупинити запущений процес. (Оскільки це відрізняється від процесу до процесу)

Відповіді:


112

Це те, що докер зупиняє спроби зупинити процес запуску всередині контейнера правильним чином, в той час як docker kill буде надсилати сигнал вбивства?

В основному так, різниця є тонкою, але окресленою у посиланні на командний рядок :

  • зупинка докера : зупиніть запущений контейнер ( надішліть SIGTERM, а потім SIGKILL після пільгового періоду ) [...] Основний процес всередині контейнера отримає SIGTERM, а після пільгового періоду - SIGKILL. [акцент мій]
  • docker kill : вбити запущений контейнер ( надіслати SIGKILL або вказаний сигнал ) [...] Основний процес всередині контейнера буде надісланий SIGKILL, або будь-який сигнал, вказаний з опцією --signal. [акцент мій]

Таким чином, stopнамагається викликати витончене відключення, надсилаючи стандартний сигнал POSIX SIGTERM , тоді як killпросто вбиває процес за замовчуванням (але також дозволяє надсилати будь-який інший сигнал):

Сигнал SIGTERM надсилається процесу з вимогою його припинення. На відміну від сигналу SIGKILL, його можна вловлювати та інтерпретувати або ігнорувати в процесі. Це дозволяє процесу виконувати гарне припинення, вивільняючи ресурси та зберігаючи стан, якщо це доречно. Слід зазначити, що SIGINT майже ідентичний SIGTERM.

Хоча в будь-якому разі не застосовується, процеси, як правило, SIGTERMграціозно поводяться та роблять правильно, залежно від їхніх обов'язків - це може легко закінчитися через витончену спробу вимкнення, яка займає більше часу, ніж пільговий період, але це щось, що слід враховувати, якщо цілісність даних є першочерговий (наприклад, для баз даних); див., наприклад, SIGTERM майора Хайдена проти SIGKILL для більш детального пояснення:

Додаток може визначити, що він хоче робити, коли буде отримано SIGTERM. У той час як більшість програм очищають свої ресурси та зупиняються, деякі можуть не робити. Програма може бути налаштована на те, щоб зробити щось зовсім інше, коли отримано SIGTERM. Крім того, якщо програма знаходиться в поганому стані, наприклад, очікування дискового вводу / виводу, воно може не мати можливості діяти на надісланий сигнал.


1
Отже, якби я хотів провести загальну процедуру відключення контейнерів, мені доведеться спіймати SIGTERM в процесі супервізора / runit?
CMCDragonkai

Яка найкраща практика тут? Я розумію, чому ми б використовували docker killвручну, щоб заощадити деякий час під час відключення, але в сценарії, чи не завжди було б краще спробувати витончене відключення docker stop? Я все ще бачу багато docker kills у сценаріях.
Денніс

10

docker kill зупинить процес / програму основної вхідної точки різко

docker stop спробує зупинити це витончено (ввічливо запитає: P)

в обох випадках зміни файлової системи зберігатимуться (під час зупинки чи вбиття), тож якщо ви docker start <container>тоді, вони продовжуватимуться звідти.


1
... але у разі docker killбудь-яких змін у файловій системі, що очікували, що основний процес все-таки залишився в пам'яті, буде втрачено, тож файлова система може закінчитися пошкодженою?
Ар'ян

Очевидно, оскільки це різка зупинка, зберігаються лише зміни під час вбивства. Все, що очікує на розгляд, буде втрачено. Моя думка полягала в тому, що вбивство докера насправді не ... вбивство контейнера, його зупинка процесу. наприклад, коли ви вимикаєте комп'ютер замість вимкнення
незручно

2
Контейнери Docker не є машинами, і ядро ​​залишається в живих через вбивство. Тому будь-які зміни файлової системи, які дійшли до ядра, будуть здійснені неушкодженими. Пошкодити файлову систему не повинно (у сенсі fsck; програма може не сподобатися втратити деякі записи). docker killє аналогом вбивства процесу, не вимикаючи комп'ютер.
Ян Хоусон

3

І додаток до відповідей, доданих раніше

працює docker eventsпісля docker stopпоказу подій

  • kill (сигнал 15): де сигнал 15 = SIGTERM
  • померти
  • Стоп

працює docker eventsпісля docker killпоказу подій

  • вбити (сигнал 9): де сигнал 9 = SIGKILL
  • Померти (вихідний код 137)

docker stopмає час очікування, перш ніж вбити процес. За замовчуванням - 10 секунд.

У цій таблиці ще більше деталей.


1

Це аналогічно витягуванню підключення з робочого столу та вимкненню комп'ютера

Як і витягнути модуль Plug Off, це відключити docker killпотужне живлення, означає прямий спосіб вбити my_container, який не намагається спочатку виграшно вимкнути процес.

Вимкнення комп’ютера означає надсилання сигналу в ОС для вимкнення всіх процесів, де docker stopозначає відправлення SIGTERMсигналу до запущеного контейнера, щоб граціозно зупинити процеси.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.