「docker stop」と「docker kill」の違いは何ですか?


116

違いは何だdocker stopとはdocker kill

Afaik、両方とも実行中のコンテナを停止します。それはそれであるdocker stop一方で、正しい方法でコンテナ内で実行プロセスを停止しようとdocker killkillシグナルを送るのだろうか?もしそうなら、どのようにdocker stop実行中のプロセスを正しく停止するかを知っているでしょう。(これはプロセスごとに異なるため)

回答:


113

docker killはコンテナー内で実行されるプロセスを正しい方法で停止しようとしますが、docker killはkillシグナルを送信しますか?

基本的には違います。違いはわずかですが、コマンドラインリファレンスで概説されています。

  • docker stop実行中のコンテナを停止します(猶予期間後にSIGTERMを送信し、その後SIGKILLを送信します)[...]コンテナ内のメインプロセスはSIGTERMを受信し、猶予期間後はSIGKILLを受信します。[強調鉱山]
  • docker kill実行中のコンテナーを強制終了します(SIGKILLまたは指定されたシグナルを送信します)[...]コンテナー内のメインプロセスはSIGKILLまたはオプション--signalで指定されたシグナルを送信します。[強調鉱山]

だから、stop標準送信することにより、正常なシャットダウンをトリガしようとPOSIX信号を SIGTERM一方、kill単にデフォルトでプロセスを殺す(だけでなく、他の信号を送信することができます):

SIGTERMシグナルは、プロセスの終了を要求するためにプロセスに送信されます。SIGKILLシグナルとは異なり、プロセスによってキャッチおよび解釈または無視されます。これにより、プロセスは適切な終了を実行してリソースを解放し、必要に応じて状態を保存できます。SIGINTはSIGTERMとほぼ同じであることに注意してください。

とにかく強制されるわけではありませんが、プロセスは通常、SIGTERM適切に処理され、その責任に応じて正しいことを行うことが期待されます-これは、猶予期間よりも長い猶予シャットダウン試行のために簡単に失敗する可能性がありますパラマウント(例:データベース用); より詳細な説明については、例えばヘイデン少佐のSIGTERM対SIGKILLを参照してください。

SIGTERMを受信すると、アプリケーションは何をしたいかを決定できます。ほとんどのアプリケーションはリソースをクリーンアップして停止しますが、停止しないアプリケーションもあります。SIGTERMを受信すると、まったく異なる処理を行うようにアプリケーションを構成できます。また、ディスクI / Oの待機など、アプリケーションの状態が悪い場合、送信された信号に基づいて動作できない場合があります。


1
したがって、コンテナの一般的なシャットダウン手順が必要な場合は、スーパーバイザー/ runitプロセスでSIGTERMをキャッチする必要がありますか?
CMCDragonkai 14

ここでのベストプラクティスは何ですか?docker killシャットダウン中に時間を節約するために手動で使用する理由を理解していますが、スクリプトでは、経由で正常なシャットダウンを試みる方が常に良いとは思わないでしょうdocker stopか?docker killただし、スクリプトにはまだ多くのが表示されています。
デニス

10

docker kill メインエントリポイントプロセス/プログラムを突然停止します

docker stop それを優雅に停止しようとします(丁寧に尋ねます:P)

どちらの場合も、ファイルシステムの変更は(停止または強制終了の時点で)保持されるため、その場合docker start <container>はそこから続行します。


1
...しかしdocker kill、メインプロセスがまだメモリに保持していた保留中のファイルシステムの変更が失われると、ファイルシステムが破損する可能性がありますか?
アルジャン

明らかに、突然の停止であるため、キル時の変更のみが永続化されます。保留中のものはすべて失われます。私のポイントは、ドッカーのキルは実際にはないことです...コンテナを殺し、プロセスを停止します。シャットダウンする代わりにコンピューターの電源を切るときのように
-awkwardarts

2
DockerコンテナーはVMではなく、カーネルは強制終了しても存続します。したがって、カーネルに到達したファイルシステムの変更はそのままコミットされます。ファイルシステムを破損することはできません(fsckの意味で、アプリケーションは書き込みの一部を失うことを好まないかもしれません)。コンピューターの電源を切るのではなくdocker kill、プロセスを強制終了することに似ています。
イアンHowson氏

3

そして、以前に追加された回答への追加

ショーイベントdocker events後の実行docker stop

  • kill(シグナル15):シグナル15 = SIGTERM
  • 死ぬ
  • やめる

ショーイベントdocker events後の実行docker kill

  • kill(シグナル9):シグナル9 = SIGKILL
  • ダイ(出口コード137)

docker stopプロセスを強制終了する前にタイムアウトが発生します。デフォルトは10秒です。

この表にはさらに詳細があります。


1

デスクトップからプラグを抜いてコンピューターシャットダウンするのにています

プラグdocker killを抜くということは、ハード電源を切ることを意味し、my_containerを強制終了する直接的な方法を意味します。これは、最初にプロセスを正常にシャットダウンしようとはしません。

コンピューターをシャットダウンすることは、すべてのプロセスをシャットダウンするためにOSにシグナルを送信することをdocker stop意味しSIGTERM、プロセスを正常に停止するために実行中のコンテナーにシグナルを送信することを意味します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.