はじめに
この実験では、docker container stopコマンドを使用して Docker コンテナを適切に停止する方法を学びます。まず、シンプルなコンテナを作成して実行します。その後、デフォルトのシグナルとタイムアウトを使用してコンテナを停止する方法を探り、続いてコンテナ停止に使用するタイムアウトとシグナルをカスタマイズする方法を学びます。この実践的な経験を通じて、Docker コンテナのライフサイクルを効果的に管理するための実用的なスキルを習得できます。
シンプルなコンテナの作成と実行
このステップでは、シンプルな Docker コンテナを作成して実行する方法を学びます。コンテナは、コードとその依存関係をパッケージ化した標準的なソフトウェアユニットであり、アプリケーションを異なるコンピューティング環境間で迅速かつ確実に実行できるようにします。
まず、Docker Hub からシンプルなイメージをプルしましょう。ここではhello-worldイメージを使用します。これは非常に小さなイメージで、単純にメッセージを表示して終了します。
docker pull hello-world
イメージがプルされ、ダウンロードされていることを示す出力が表示されるはずです。
Using default tag: latest
latest: Pulling from library/hello-world
...
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
イメージを取得したので、このイメージを基にコンテナを実行できます。docker runコマンドを使用します:
docker run hello-world
このコマンドを実行すると、Docker はhello-worldイメージから新しいコンテナを作成します。コンテナはイメージで定義されたコマンドを実行し、この場合はコンソールにメッセージを表示します。
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
この出力は、Docker のインストールが正常に機能しており、最初のコンテナを正常に実行できたことを確認します。コンテナはhello-worldプログラムを実行し、その後終了しました。
実行されたコンテナ(終了したものも含む)を確認するには、docker ps -aコマンドを使用できます:
docker ps -a
hello-worldコンテナがExitedステータスで表示されるはずです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<container_id> hello-world "/hello" About a minute ago Exited (0) About a minute ago <container_name>
出力には、コンテナ ID、ベースとなったイメージ、実行されたコマンド、作成時刻、現在のステータス、および割り当てられた名前が表示されます。
デフォルトシグナルとタイムアウトを使用したコンテナの停止
このステップでは、デフォルトのシグナルとタイムアウトを使用して実行中の Docker コンテナを停止する方法を学びます。コンテナを停止すると、Docker はコンテナ内で実行されているメインプロセスにシグナルを送信します。デフォルトでは、Docker はSIGTERMシグナルを送信し、プロセスに正常終了するよう通知します。プロセスがデフォルトのタイムアウト期間(通常 10 秒)内に終了しない場合、Docker はSIGKILLシグナルを送信してプロセスを強制終了させます。
まず、実行状態を維持するコンテナを起動しましょう。ubuntuイメージを使用し、コンテナを起動したままにするシンプルなコマンドを実行します。
docker pull ubuntu
ubuntuイメージがプルされていることを示す出力が表示されるはずです。
Using default tag: latest
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
次に、ubuntuコンテナをデタッチモード(-d)で実行し、バックグラウンドで動作させます。また、コンテナを永続的に実行し続けるコマンド(例:tail -f /dev/null)を実行します。
docker run -d ubuntu tail -f /dev/null
このコマンドはコンテナ ID を出力します。
<container_id>
docker psコマンドを使用して、コンテナが実行中であることを確認できます:
docker ps
ubuntuコンテナがUpステータスで表示されるはずです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<container_id> ubuntu "tail -f /dev/null" About a minute ago Up About a minute ago <container_name>
では、docker stopコマンドを使用してこの実行中のコンテナを停止しましょう。コンテナ ID またはコンテナ名のどちらかを使用できます。<container_id>を実際の実行中コンテナの ID に置き換えてください。
docker stop <container_id>
このコマンドは停止されたコンテナ ID を出力します。
<container_id>
docker stopコマンドを実行すると、コンテナはSIGTERMシグナルを受け取ります。Docker はデフォルトのタイムアウト(10 秒)間、コンテナが正常に停止するのを待ちます。その時間内に停止しない場合、SIGKILLを送信します。
再度docker psを実行して、コンテナが停止したことを確認できます。
docker ps
ubuntuコンテナはdocker psの出力(実行中のコンテナのみ表示)に表示されなくなっているはずです。停止したコンテナも含めてすべてのコンテナを表示するには、docker ps -aを使用します。
docker ps -a
ubuntuコンテナがExitedステータスで表示されるはずです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<container_id> ubuntu "tail -f /dev/null" About a minute ago Exited (0) About a minute ago <container_name>
これにより、デフォルトのシグナルとタイムアウトを使用してコンテナが正常に停止されたことが確認できます。
カスタムタイムアウト設定によるコンテナの停止
このステップでは、実行中の Docker コンテナを停止する際に、正常終了期間のカスタムタイムアウトを指定する方法を学びます。これは、アプリケーションがクリーンにシャットダウンするための時間を調整したい場合に有用です。
前のステップと同じubuntuイメージとコマンドを使用して、実行状態を維持するコンテナを起動します。
まず、ubuntuコンテナをデタッチモード(-d)で起動し、tail -f /dev/nullコマンドを実行します:
docker run -d ubuntu tail -f /dev/null
このコマンドはコンテナ ID を出力します。
<container_id>
docker psを使用してコンテナが実行中であることを確認します:
docker ps
ubuntuコンテナがUpステータスで表示されるはずです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<container_id> ubuntu "tail -f /dev/null" About a minute ago Up About a minute ago <container_name>
次に、docker stopコマンドを使用してコンテナを停止しますが、今回は-tまたは--timeフラグを使用してタイムアウトを指定します。タイムアウトを 5 秒に設定しましょう。<container_id>を実際の実行中コンテナの ID に置き換えてください。
docker stop -t 5 <container_id>
このコマンドは停止されたコンテナ ID を出力します。
<container_id>
docker stop -t 5を使用すると、Docker はSIGTERMシグナルを送信し、コンテナが停止するまで 5 秒間待機します。5 秒後もコンテナが実行中のままの場合、Docker はSIGKILLシグナルを送信します。
docker ps -aを実行してコンテナが停止したことを確認します:
docker ps -a
ubuntuコンテナがExitedステータスで表示されるはずです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<container_id> ubuntu "tail -f /dev/null" About a minute ago Exited (0) About a minute ago <container_name>
これで、5 秒のカスタムタイムアウトでコンテナを正常に停止できました。
カスタムシグナルを使用したコンテナの停止
このステップでは、デフォルトのSIGTERM以外の特定のシグナルを送信して、実行中の Docker コンテナを停止する方法を学びます。これは、正常終了やその他のアクションに対して異なるシグナルに応答するように設定されたアプリケーションに有用です。
再びubuntuイメージとtail -f /dev/nullコマンドを使用して、コンテナを実行状態に保ちます。
ubuntuコンテナをデタッチモード(-d)で実行します:
docker run -d ubuntu tail -f /dev/null
このコマンドはコンテナ ID を出力します。
<container_id>
docker psを使用してコンテナが実行中であることを確認します:
docker ps
ubuntuコンテナがUpステータスで表示されるはずです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<container_id> ubuntu "tail -f /dev/null" About a minute ago Up About a minute ago <container_name>
次に、docker stopコマンドを使用してコンテナを停止しますが、--signalフラグでカスタムシグナルを指定します。例えば、直接SIGKILLシグナルを送信してみましょう。<container_id>を実際の実行中コンテナの ID に置き換えてください。
docker stop --signal SIGKILL <container_id>
このコマンドは停止されたコンテナ ID を出力します。
<container_id>
docker stop --signal SIGKILLを使用すると、Docker はコンテナ内のメインプロセスに即座にSIGKILLシグナルを送信します。このシグナルはプロセスでキャッチまたは無視できないため、正常終了期間なしに強制的に終了します。
docker ps -aを実行してコンテナが停止したことを確認します:
docker ps -a
ubuntuコンテナがExitedステータスで表示されるはずです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<container_id> ubuntu "tail -f /dev/null" About a minute ago Exited (137) About a minute ago <container_name>
SIGKILLでコンテナを停止すると、終了コードが異なる(例:137)場合があることに注意してください。これは非正常終了を示しています。
カスタムシグナルを送信してコンテナを正常に停止できました。
まとめ
この実験では、Docker コンテナを操作する基本的な手順を学びました。まず Docker Hub からシンプルなイメージ (hello-world) をプルし、そのイメージを基にコンテナを実行しました。これによりコンテナの作成と実行の基本プロセスを確認し、docker ps -aコマンドでコンテナのステータスをチェックすることで正常に完了したことを検証しました。
提供された内容には詳細は記載されていませんが、その後のステップではdocker container stopコマンドを使用して実行中のコンテナを停止するプロセスをガイドしていたでしょう。これには、停止時に使用されるデフォルトのシグナルとタイムアウトの理解、そして正常終了を実現するためにタイムアウト時間とコンテナに送信するシグナルの両方をカスタマイズする方法の探求が含まれていたはずです。



