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?
Basicamente sim, a diferença é sutil, mas descrita na referência Command Line :
- docker stop : Pare um contêiner em execução ( envia SIGTERM e depois SIGKILL após período de carência ) [...] O processo principal dentro do container receberá o SIGTERM, e após um período de carência, o SIGKILL. [ênfase minha]
- killer kill : Mate um contêiner em execução ( envia SIGKILL ou sinal especificado ) [...] O processo principal dentro do container será enviado SIGKILL, ou qualquer sinal especificado com a opção --sinal. [ênfase minha]
Portanto, stop
tenta ativar um desligamento normal enviando o sinal POSIX SIGTERM
padrão, enquanto kill
apenas mata o processo por padrão (mas também permite enviar qualquer outro sinal):
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.
Embora não seja obrigatório de qualquer maneira, espera-se que os processos manipulem SIGTERM
normalmente e façam a coisa certa dependendo de suas responsabilidades - isso pode falhar facilmente devido à tentativa de desligamento normal levar mais tempo do que o período de carência, o que é algo considerar se a integridade dos dados é primordial (por exemplo, para bancos de dados); veja por exemplo SIGTERM contra o SIGKILL do Major Hayden para uma explicação mais detalhada:
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.