Docker Desktop の停止コマンドを使った管理方法

DockerDockerBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、docker stopコマンドを使用して Docker コンテナを効果的に管理する方法を学びます。実行中のコンテナを停止する基本的な使用方法から、停止プロセスを制御するさまざまなオプション(コンテナの強制停止や停止操作のタイムアウト設定など)までを網羅します。この実験を終える頃には、docker stopを使用して Docker コンテナを正常かつ強制的に終了させることに習熟しているでしょう。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555150{{"Docker Desktop の停止コマンドを使った管理方法"}} docker/ps -.-> lab-555150{{"Docker Desktop の停止コマンドを使った管理方法"}} docker/stop -.-> lab-555150{{"Docker Desktop の停止コマンドを使った管理方法"}} docker/pull -.-> lab-555150{{"Docker Desktop の停止コマンドを使った管理方法"}} end

docker stop コマンドの基本的な使い方を理解する

このステップでは、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 コンテナの停止

このステップでは、デタッチオプションを使用してコンテナを停止する方法を探ります。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 コンテナの強制停止

このステップでは、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 コンテナの停止

このステップでは、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 を使用して停止済みのコンテナも含めて表示する方法も学びました。