95

В чем разница между docker stop и docker kill?

Афаик, оба остановят работающий контейнер. Неужели docker stop пытается остановить процесс, запущенный внутри контейнера, правильным образом, в то время как docker kill отправит сигнал kill? Если это так, как бы docker stop знал, как правильно остановить запущенный процесс. (Так как это отличается от процесса к процессу)

4 ответа4

92

Неужели Docker Stop пытается остановить процесс, запущенный внутри контейнера, правильным образом, в то время как Docker kill отправит сигнал kill?

По сути, да, разница невелика, но изложена в справке по командной строке :

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

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

Сигнал SIGTERM отправляется процессу, чтобы запросить его завершение. В отличие от сигнала SIGKILL, он может быть пойман и интерпретирован или проигнорирован процессом. Это позволяет процессу выполнять хорошее завершение, освобождая ресурсы и сохраняя состояние, если это необходимо. Следует отметить, что SIGINT практически идентичен SIGTERM.

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

Приложение может определить, что оно хочет сделать после получения SIGTERM. Хотя большинство приложений будут очищать свои ресурсы и останавливаться, некоторые могут этого не делать. Приложение может быть настроено на что-то совершенно другое при получении SIGTERM. Кроме того, если приложение находится в плохом состоянии, например в ожидании дискового ввода-вывода, оно может не справиться с отправленным сигналом.

6

docker kill внезапно остановит основной процесс / программу входа

docker stop постарается остановить это изящно (спросит вежливо:P)

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

2

И дополнение к ответам, добавленным ранее

запуск docker events после docker stop показывает события

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

запуск docker events после docker kill показывает события

  • убить (сигнал 9): где сигнал 9 = SIGKILL
  • Die (код выхода 137)

docker stop имеет тайм-аут перед завершением процесса. По умолчанию это 10 секунд.

Эта таблица имеет еще больше деталей.

0

Это аналогично отключению рабочего стола и выключению компьютера

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .