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

53804
Geert-Jan

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

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

89

3 ответа на вопрос

85
Steffen Opel

Is it that docker stop attempts to stop the process run inside the container in the correct way, while docker kill will send a kill signal?

Basically yes, the difference is subtle, but outlined in the Command Line reference:

  • docker stop: Stop a running container (send SIGTERM, and then SIGKILL after grace period) [...] The main process inside the container will receive SIGTERM, and after a grace period, SIGKILL. [emphasis mine]
  • docker kill: Kill a running container (send SIGKILL, or specified signal) [...] The main process inside the container will be sent SIGKILL, or any signal specified with option --signal. [emphasis mine]

So stop attempts to trigger a graceful shutdown by sending the standard POSIX signal SIGTERM, whereas killjust kills the process by default (but also allows to send any other signal):

The SIGTERM signal is sent to a process to request its termination. Unlike the SIGKILL signal, it can be caught and interpreted or ignored by the process. This allows the process to perform nice termination releasing resources and saving state if appropriate. It should be noted that SIGINT is nearly identical to SIGTERM.

While not enforced in anyway, processes are generally expected to handle SIGTERM gracefully and do the right thing depending on their responsibilities - this can easily fail due to the graceful shutdown attempt taking longer than the grace period though, which is something to consider if data integrity is paramount (e.g. for databases); see e.g. Major Hayden's SIGTERM vs. SIGKILL for a more detailed explanation:

The application can determine what it wants to do once a SIGTERM is received. While most applications will clean up their resources and stop, some may not. An application may be configured to do something completely different when a SIGTERM is received. Also, if the application is in a bad state, such as waiting for disk I/O, it may not be able to act on the signal that was sent.

Поэтому, если бы я хотел иметь общую процедуру завершения работы с контейнерами, мне пришлось бы перехватывать SIGTERM в процессе supervisor / runit? CMCDragonkai 9 лет назад 1
Какова лучшая практика здесь? Я понимаю, почему мы будем использовать `docker kill` вручную, чтобы сэкономить время при завершении работы, но в сценарии всегда лучше попытаться выполнить постепенное отключение через` docker stop`? Я все еще вижу много `docker kill`s 'в скриптах. Dennis 5 лет назад 0
6
awkwardarts

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

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

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

... но в случае `docker kill` любые ожидающие изменения файловой системы, которые основной процесс все еще имел в памяти, будут потеряны, поэтому файловая система может в конечном итоге быть повреждена? Arjan 7 лет назад 1
очевидно, поскольку это внезапная остановка, сохраняются только изменения во время уничтожения. Все, что ожидает, будет потеряно. Моя точка зрения заключалась в том, что docker kill не совсем ... убивает контейнер, останавливая процесс. например, когда вы выключаете компьютер, а не выключаете его awkwardarts 7 лет назад 0
0
faboulaws

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

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

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

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

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

docker stopимеет тайм-аут, прежде чем убить процесс. По умолчанию это 10 секунд.

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

Похожие вопросы