はじめに
この実験では、docker stop
コマンドを使用して Docker コンテナを効果的に管理する方法を学びます。実行中のコンテナを停止する基本的な使用方法から、停止プロセスを制御するさまざまなオプション(コンテナの強制停止や停止操作のタイムアウト設定など)までを網羅します。この実験を終える頃には、docker stop
を使用して Docker コンテナを正常かつ強制的に終了させることに習熟しているでしょう。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験では、docker stop
コマンドを使用して Docker コンテナを効果的に管理する方法を学びます。実行中のコンテナを停止する基本的な使用方法から、停止プロセスを制御するさまざまなオプション(コンテナの強制停止や停止操作のタイムアウト設定など)までを網羅します。この実験を終える頃には、docker stop
を使用して Docker コンテナを正常かつ強制的に終了させることに習熟しているでしょう。
このステップでは、docker stop
コマンドの基本的な使用方法を学びます。docker stop
コマンドは、実行中の 1 つ以上のコンテナを停止するために使用されます。デフォルトでは、このコマンドはコンテナに SIGTERM
シグナルを送信し、猶予期間後にコンテナが停止していない場合に SIGKILL
シグナルを送信します。
まず、実行状態を維持するシンプルなコンテナを起動しましょう。ubuntu
イメージを使用し、コンテナを起動し続けるコマンドを実行します。
docker run -d ubuntu sleep infinity
-d
フラグはコンテナをデタッチドモード(バックグラウンド)で実行します。sleep infinity
はコンテナを無期限に実行し続けるコマンドです。
次に、実行中のコンテナをリスト表示してコンテナ ID を取得します。
docker ps
以下のような出力が表示され、実行中の ubuntu
コンテナが確認できるはずです:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<container_id> ubuntu "sleep infinity" X seconds ago Up X seconds <container_name>
<container_id>
を docker ps
の出力から取得した実際のコンテナ ID に置き換えてください。次に、docker stop
コマンドの後にコンテナ ID を指定してコンテナを停止します。
docker stop <container_id>
このコマンドを実行後、コンテナは停止するはずです。実行中のコンテナを再度リスト表示して確認できます。
docker ps
今度は、docker ps
コマンドで停止したコンテナが表示されないはずです。
停止したコンテナを含む全てのコンテナを表示するには、docker ps
に -a
フラグを追加します。
docker ps -a
これにより、ステータスが Exited
の停止済みコンテナが表示されます。
このステップでは、デタッチオプションを使用してコンテナを停止する方法を探ります。docker run
のように docker stop
自体にデタッチオプションはありませんが、ターミナルで実行する際の docker stop
の動作にはデタッチの概念が内在しています。このコマンドは停止シグナルを送信した後、すぐに制御をターミナルに戻すため、他の作業を続行できます。
まず、停止対象となる別のコンテナを起動しましょう。今回は nginx
イメージを使用します。ローカルに nginx
イメージがない場合は先に取得してください。
docker pull nginx
次に、nginx
コンテナをデタッチモードで起動します。
docker run -d nginx
実行中の nginx
コンテナの ID を取得します。
docker ps
以下のような出力が表示され、前回の ubuntu
コンテナ(削除していない場合)と新しい nginx
コンテナが確認できます:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<nginx_container_id> nginx "nginx -g 'daemon off" X seconds ago Up X seconds 80/tcp <nginx_container_name>
<ubuntu_container_id> ubuntu "sleep infinity" Y minutes ago Exited Y minutes ago <ubuntu_container_name>
取得した ID を使用して nginx
コンテナを停止します。
docker stop <nginx_container_id>
docker stop
を実行すると、コマンドは停止シグナルを送信し、すぐにターミナル制御を返します。これがターミナルセッションから見た「デタッチ」動作です - コンテナが完全に停止するのを待たずに次のコマンドを入力できます。
nginx
コンテナが停止したことを確認します。
docker ps
nginx
コンテナは実行中のコンテナリストに表示されなくなっているはずです。
このステップでは、docker stop
コマンドを使用してコンテナを強制停止する方法を学びます。docker stop
はデフォルトで正常な停止シグナル (SIGTERM
) を送信しますが、コンテナがこのシグナルに応答しない場合、強制的に停止する必要があります。これは docker stop
のデフォルト動作で、タイムアウト後に SIGKILL
を送信することで実現されます。
正常に停止するのが難しいコンテナを実行してみましょう。再びシンプルな ubuntu
コンテナを使用しますが、今回は SIGTERM
シグナルを無視するプロセスをシミュレートします。
docker run -d ubuntu sh -c 'trap "" SIGTERM; sleep infinity'
このコマンドでは:
trap "" SIGTERM
はシェルに SIGTERM
シグナルを無視するよう指示しますsleep infinity
はコンテナを実行し続けますこの新しい ubuntu
コンテナの ID を取得します。
docker ps
新しい ubuntu
コンテナが実行されているのが確認できるはずです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<force_stop_container_id> ubuntu "sh -c 'trap \"\" SIGT…" X seconds ago Up X seconds <container_name>
<nginx_container_id> nginx "nginx -g 'daemon off" Y minutes ago Exited Y minutes ago 80/tcp <nginx_container_name>
<ubuntu_container_id> ubuntu "sleep infinity" Z minutes ago Exited Z minutes ago <ubuntu_container_name>
このコンテナを標準の docker stop
コマンドで停止してみます。
docker stop <force_stop_container_id>
コンテナが SIGTERM
シグナルを無視しているため、docker stop
はデフォルトの猶予期間(通常 10 秒)待機した後、無視できない SIGKILL
シグナルを送信します。これによりコンテナが強制的に停止されます。コマンドが完了するまでに若干の遅延が生じる場合があります。
コンテナが停止したことを確認します。
docker ps
コンテナは実行中のリストに表示されなくなっているはずです。
また、-t
フラグで 0 秒のタイムアウトを明示的に指定すると、猶予期間を待たずに即座に SIGKILL
シグナルを送信できます。これにより強制的に停止させることが可能です。-t
フラグについては次のステップで詳しく説明します。
このステップでは、docker stop
コマンドで -t
または --time
フラグを使用し、特定のタイムアウト時間を指定してコンテナを停止する方法を学びます。これにより、Docker が SIGTERM
シグナルを送信した後、コンテナが正常に終了するまで待機する時間を指定できます。指定時間を過ぎると SIGKILL
で強制停止されます。
タイムアウトを指定して停止するコンテナを実行しましょう。ubuntu
イメージと、シグナルを待機して終了するスクリプトを使用します。
docker run -d ubuntu sh -c 'trap "exit 0" SIGTERM; sleep infinity'
このコマンドは ubuntu
コンテナをデタッチモードで実行します。trap "exit 0" SIGTERM
の部分は、SIGTERM
シグナルを受信した際にスクリプトが正常終了するよう設定します。sleep infinity
はシグナルを受信するまでコンテナを実行し続けます。
この新しい ubuntu
コンテナの ID を取得します。
docker ps
新しい ubuntu
コンテナが実行されているのが確認できるはずです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<timeout_container_id> ubuntu "sh -c 'trap \"exit 0\"…" X seconds ago Up X seconds <container_name>
<force_stop_container_id> ubuntu "sh -c 'trap \"\" SIGT…" Y minutes ago Exited Y minutes ago <container_name>
<nginx_container_id> nginx "nginx -g 'daemon off" Z minutes ago Exited Z minutes ago 80/tcp <nginx_container_name>
<ubuntu_container_id> ubuntu "sleep infinity" A minutes ago Exited A minutes ago <ubuntu_container_name>
次に、-t
フラグを使用して 5 秒のタイムアウトを指定し、このコンテナを停止します。
docker stop -t 5 <timeout_container_id>
Docker は SIGTERM
シグナルを送信し、5 秒間待機します。このコンテナは SIGTERM
で正常終了するように設定されているため、タイムアウト期間内に停止するはずです。5 秒以内に停止しなかった場合、Docker は SIGKILL
を送信します。
コンテナが停止したことを確認します。
docker ps
コンテナは実行中のリストに表示されなくなっているはずです。
-t
フラグは、コンテナに強制停止される前にクリーンアップ操作を行うための特定の時間を与えたい場合に便利です。
この実験では、実行中のコンテナを管理するための docker stop
コマンドの基本的な使用方法を学びました。まず、docker stop
が猶予期間後に SIGTERM
シグナルと SIGKILL
を送信する仕組みを理解しました。次に、docker ps
でコンテナ ID を特定し、docker stop <container_id>
を実行してデタッチモードで動作しているシンプルな ubuntu
コンテナを停止する練習を行いました。コンテナの停止状態を確認するために再度実行中のコンテナをリスト表示し、さらに docker ps -a
を使用して停止済みのコンテナも含めて表示する方法も学びました。