docker container wait コマンドでコンテナ停止を待機する方法

DockerDockerBeginner
今すぐ練習

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

はじめに

この実験では、docker container waitコマンドを効果的に使用する方法を学びます。このコマンドはスクリプティングや自動化において強力なツールであり、指定したコンテナが停止するまで実行を一時停止することができます。

まず、デタッチモード(-d)を使用して Docker コンテナをバックグラウンドで起動します。次に、docker container waitを使用して、このバックグラウンドコンテナの実行が終了するまでターミナルをブロックします。ブロッキング動作を実証するために、別のターミナルからコンテナを停止します。最後に、docker container waitコマンドが返す終了コードを確認し、コンテナの終了ステータスをどのように通知するかを理解します。


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-555128{{"docker container wait コマンドでコンテナ停止を待機する方法"}} docker/ps -.-> lab-555128{{"docker container wait コマンドでコンテナ停止を待機する方法"}} docker/stop -.-> lab-555128{{"docker container wait コマンドでコンテナ停止を待機する方法"}} docker/pull -.-> lab-555128{{"docker container wait コマンドでコンテナ停止を待機する方法"}} end

バックグラウンドでコンテナを起動する

このステップでは、Docker コンテナをバックグラウンドで起動する方法を学びます。バックグラウンドでコンテナを実行すると、ターミナルを占有せずに操作できるため、長時間実行されるサービスやアプリケーションに便利です。

まず、alpineイメージをプルします。これはテスト用に便利な非常に小さな Linux ディストリビューションイメージです。

docker pull alpine

イメージがプルされダウンロードされることを示す出力が表示されます。

Using default tag: latest
latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

次に、-dフラグを使用してalpineコンテナをバックグラウンドで起動します。-dフラグは「デタッチドモード」を意味します。コンテナ内でsleep 30という簡単なコマンドを実行し、30 秒後にコンテナが終了するようにします。

docker run -d alpine sleep 30

このコマンドを実行すると、Docker はコンテナの完全な ID を表示します。

<container_id>

バックグラウンドでコンテナが実行されていることを確認するには、docker psコマンドを使用します。このコマンドは現在実行中のすべてのコンテナをリスト表示します。

docker ps

以下のような出力が表示され、alpineコンテナが実行中であることがわかります:

CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
<container_id>   alpine    "sleep 30"    X seconds ago   Up X seconds             <container_name>

STATUS列にはUpと表示され、その後にコンテナが実行されている時間が表示されます。これにより、コンテナがデタッチドモードで実行されていることが確認できます。

docker container wait を使用してコンテナ停止を待機する

このステップでは、docker container wait コマンドの使用方法を学びます。このコマンドは 1 つ以上のコンテナが停止するまでブロックし、その後それらの終了コードを出力します。コンテナ内のバックグラウンドプロセスが完了するのを待ってから他のタスクを進めたい場合に便利です。

まず、前のステップで起動したコンテナの ID を取得します。実行中のコンテナの ID のみを取得するには docker ps -q を使用します。

docker ps -q

このコマンドはコンテナ ID を出力します。次のコマンドで必要になるので、この ID をコピーしてください。

<container_id>

次に、先ほど取得したコンテナ ID を指定して docker container wait コマンドを実行します。

docker container wait <container_id>

このコマンドを実行すると、ターミナルがハングしたように見えます。これは想定された動作です。docker container wait コマンドはブロッキングコマンドで、指定したコンテナが停止するまで実行を一時停止します。現在コンテナは sleep 30 コマンドを実行中なので、このコマンドはコンテナが終了するまで最大 30 秒間待機します。

コンテナが停止すると(sleep 30 コマンドが完了するか、手動で停止された場合)、docker container wait コマンドのブロックが解除され、コンテナの終了コードが出力されます。

例えば、コンテナが 30 秒後に正常に停止した場合、次のように表示されます:

0

終了コード 0 は通常、コンテナ内のコマンドが正常に完了したことを示します。

このターミナルウィンドウは開いたままにしてください。次のステップでこの待機中のコマンドと対話します。

別のターミナルでコンテナを停止する

このステップでは、新しいターミナルを開いて実行中のコンテナを停止します。これにより、最初のターミナルで実行していた docker container wait が外部からコンテナが停止された場合にどのように反応するかを確認します。

LabEx 環境で新しいターミナルウィンドウを開いてください。通常は"+"アイコンをクリックするか、メニューから「新しいターミナル」を選択することで開けます。

この新しいターミナルで、再度実行中のコンテナを特定する必要があります。docker ps を使用して実行中のコンテナをリスト表示し、コンテナ ID を見つけてください。

docker ps

前のステップと同様の出力が表示され、コンテナ ID、イメージ、コマンドなどが確認できます。

CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
<container_id>   alpine    "sleep 30"    X minutes ago   Up X minutes             <container_name>

次に、docker stop コマンドの後にコンテナ ID を指定してコンテナを停止します。

docker stop <container_id>

停止コマンドが成功したことを示すコンテナ ID がターミナルに表示されます。

<container_id>

docker container wait を実行していた最初のターミナルウィンドウに戻ってください。docker container wait コマンドが終了し、終了コードが表示されているはずです。この終了コードについては次のステップで確認します。

docker container wait の終了コードを確認する

この最終ステップでは、最初のターミナルで docker container wait コマンドによって出力された終了コードを確認します。

docker container wait <container_id> コマンドを実行した最初のターミナルウィンドウに戻ってください。

コマンドの後に数字が表示されているはずです。この数字がコンテナの終了コードです。

137

前のステップでは docker stop を使用してコンテナを停止しました。docker stop でコンテナを停止すると、Docker はコンテナ内のメインプロセスに SIGTERM シグナルを送信し、猶予期間後にプロセスが終了していない場合は SIGKILL シグナルを送信します。終了コード 137 は、プロセスが SIGKILL シグナルによって終了したことを示す一般的な指標です(128 + 9、9 は SIGKILL のシグナル番号)。

これは docker container wait がコンテナが停止するのを待つだけでなく、コンテナがどのように停止したかについての情報を提供する終了コードも返すことを示しています。もしコンテナが sleep 30 コマンドを自然に完了していた場合、終了コードは 0 になっていたでしょう。

どちらのターミナルでも docker ps -a を実行してコンテナが停止していることを確認できます。-a フラグは停止したコンテナを含むすべてのコンテナを表示します。

docker ps -a

alpine コンテナがリストされ、そのステータスが Exited (<exit_code>) と表示されるはずです。

CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
<container_id>   alpine    "sleep 30"    X minutes ago    Exited (137) X seconds ago             <container_name>

これで docker container wait を使用する実験は完了です。バックグラウンドでコンテナを起動し、docker container wait を使用して停止を待機し、別のターミナルから停止させ、結果の終了コードを確認する方法を学びました。

まとめ

この実験では、-dフラグとdocker runコマンドを使用して Docker コンテナをバックグラウンドで起動する方法と、docker psでそのステータスを確認する方法を学びました。また、docker container waitコマンドについても学び、指定したコンテナが停止するまで実行をブロックし、その終了コードを返すという目的を理解しました。