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


116

Какая разница между docker stopа docker kill?

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

Ответы:


113

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

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

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

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

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

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

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


1
Так что, если бы я хотел иметь общую процедуру выключения для контейнеров, мне пришлось бы перехватывать SIGTERM в процессе supervisor / runit?
CMCDragonkai

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

10

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

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

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


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

очевидно, поскольку это внезапная остановка, сохраняются только изменения во время уничтожения. Все, что ожидает, будет потеряно. Моя точка зрения заключалась в том, что уничтожение докера на самом деле не ... уничтожение контейнера, его остановка. например, когда вы выключаете компьютер, а не выключаете его
awkwardarts

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

3

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

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

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

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

  • убить (сигнал 9): где сигнал 9 = SIGKILL
  • Die (код выхода 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.