docker stop
とdocker kill
の違いは?
確かに、どちらも実行中のコンテナを停止させます。docker stop
はコンテナ内で実行されているプロセスを正しい方法で停止させようとし、docker kill
はキルシグナルを送るということでしょうか?もしそうだとしたら、docker stop
は実行中のプロセスを正しく停止させる方法をどうやって知っているのでしょうか。(これはプロセスごとに異なるので)
144 Geert-Jan 2014-05-21
docker stop はコンテナ内で実行されているプロセスを正しい方法で停止しようとしますが、docker kill は kill シグナルを送信しますか?
基本的にはい、違いは微妙ですが、コマンドラインの参照で概説します
- docker stop: 実行中のコンテナを停止する (SIGTERMを送信し、猶予期間後にSIGKILLする) […] コンテナ内のメインプロセスはSIGTERMを受信し、猶予期間後にSIGKILLする。[強調します]
- docker kill: 実行中のコンテナを kill (send SIGKILL, or specified signal) […] コンテナ内のメインプロセスには SIGKILL, or option -signal で指定された任意のシグナルが送られます。[強調します]
そのため、stop
は標準のPOSIXシグナル SIGTERM
を送信することでグレースフルシャットダウンを試みますが、kill
はデフォルトでプロセスを終了させます(ただし、他のシグナルを送信することもできます)
SIGTERM シグナルはプロセスの終了を要求するために送られます。SIGKILL シグナルとは異なり、このシグナルはプロセスがキャッチして解釈したり、無視したりすることができます。これにより、プロセスは適切な場合にはリソースを解放して状態を保存して終了することができます。SIGINT は SIGTERM とほぼ同じであることに注意してください
これは、データの完全性が最重要視される場合 (データベースなど) に考慮すべきことです。より詳細な説明は、例えば Major Hayden の SIGTERM vs. SIGKILL を参照してください
SIGTERMを受信したら、アプリケーションは何をしたいかを決定することができます。ほとんどのアプリケーションはリソースをクリーンアップして停止しますが、そうでないアプリケーションもあります。アプリケーションはSIGTERMを受信したときに全く異なることをするように設定されているかもしれません。また、アプリケーションがディスクI/Oを待っているような悪い状態にある場合、送られてきたシグナルにアクションを起こすことができないかもしれません
137 Steffen Opel 2014-05-22
docker kill
は、メインエントラントポイント処理/プログラムを突然停止します
docker stop
は潔く止めようとします(丁寧にお願いします :P)
どちらの場合も、ファイルシステムの変更は (停止時や kill 時に) 持続されるので、docker start <container>
であれば、そこからも継続されます
16 awkwardarts 2017-04-29
そして、先ほど追加した回答に加えて
docker stop
の後に docker events
を実行するとイベントが表示されます
- kill (signal 15): ここで、signal 15 = SIGTERM
- die
- stop
docker kill
の後に docker events
を実行するとイベントが表示されます
- kill (signal 9): ここで、signal 9 = SIGKILL
- 死ね(コード137終了
docker stop
には、プロセスを終了させる前のタイムアウトを指定します。デフォルトは10秒です
この表にはさらに詳細が書かれています
6 faboulaws 2018-11-03
デスクトップのプラグを抜いてコンピュータをシャットダウンするのと似ています
プラグオフを引くことがハードパワーオフを意味するように、docker kill
はmy_containerを強制終了させる直接的な方法を意味します
コンピュータをシャットダウンするとは、OSにすべてのプロセスをシャットダウンするための信号を送ることを意味し、docker stop
は実行中のコンテナにSIGTERM
の信号を送り、プロセスを優雅に停止させることを意味します
2 Rajat Badjatya 2019-01-19