Неужели 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. Кроме того, если приложение находится в плохом состоянии, например в ожидании дискового ввода-вывода, оно может не справиться с отправленным сигналом.
docker kill
вручную, чтобы сэкономить время при выключении, но в сценарии, не всегда ли лучше попытаться выполнить постепенное выключение черезdocker stop
? Я все еще вижу многоdocker kill
s в сценариях, хотя.docker kill
остановит основную точку входа процесса / программы резкоdocker stop
постараюсь это изящно остановить (попросит вежливо: P)в обоих случаях изменения файловой системы будут сохраняться (во время остановки или уничтожения), так что если вы
docker start <container>
затем продолжите с этого момента.источник
docker kill
каких-либо ожидающих изменений файловой системы, которые основной процесс все еще имел в памяти, будут потеряны, так что файловая система может в конечном итоге быть повреждена?docker kill
аналогично уничтожению процесса, а не выключению компьютера.И дополнение к ответам, добавленным ранее
бег
docker events
заdocker stop
шоу показывает событиябег
docker events
заdocker kill
шоу показывает событияdocker stop
имеет тайм-аут, прежде чем убить процесс. По умолчанию это 10 секунд.Эта таблица имеет еще больше деталей.
источник
Это аналогично отключению рабочего стола и выключению компьютера
Подобно отключению Plug Off означает жесткое отключение питания,
docker kill
это прямой способ убить my_container, который не пытается сначала корректно завершить процесс.Выключение компьютера означает отправку сигнала в ОС для выключения всех процессов, где
docker stop
означает отправкуSIGTERM
сигнала в работающий контейнер, чтобы корректно остановить процессы.источник