docker compose wait コマンドでサービス停止を待機する方法

DockerBeginner
オンラインで実践に進む

はじめに

この実験では、Docker Compose サービスのライフサイクルを効果的に管理するためにdocker compose waitコマンドを使用する方法を学びます。まず、複数のサービスを含む基本的なdocker-compose.ymlファイルをセットアップし、起動後の初期状態を確認します。

その後、docker compose waitのコア機能を探索し、プロジェクト内のすべてのサービスが停止するまで実行をブロックする方法を確認します。さらに、特定のサービスが停止するのを待つ方法や、docker compose wait--down-projectオプションを組み合わせてプロジェクトを完全にシャットダウンし待機操作を行う方法を実演します。

複数サービスを含むシンプルな docker-compose.yml を作成

このステップでは、2 つのサービスを定義するシンプルなdocker-compose.ymlファイルを作成します。開始前に、この環境にはプリインストールされていない Docker Compose をインストールする必要があります。

まず、Docker Compose バイナリをダウンロードします。インストールされている Docker バージョンと互換性のあるv2.20.2をダウンロードします。

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

このコマンドは、公式 GitHub リリースページから Docker Compose バイナリをダウンロードし、/usr/local/bin/docker-composeに保存します。$(uname -s)$(uname -m)の部分は、自動的に OS とアーキテクチャを検出します。

次に、ダウンロードしたバイナリに実行権限を付与します。

sudo chmod +x /usr/local/bin/docker-compose

インストールが正しく行われたことを確認するため、バージョンを確認します。

docker-compose version

インストールされた Docker Compose のバージョンが表示されるはずです。

Docker Compose がインストールされたので、docker-compose.ymlファイルを作成できます。このファイルは YAML 形式を使用して、アプリケーションのサービス、ネットワーク、ボリュームを定義します。Web サーバーとデータベースの 2 つのサービスを含むシンプルなファイルを作成します。

プロジェクトディレクトリに移動します。

cd ~/project

nanoエディタを使用してdocker-compose.ymlという名前のファイルを作成します。

nano docker-compose.yml

以下の内容をエディタに貼り付けます:

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  db:
    image: postgres:latest
    environment:
      POSTGRES_PASSWORD: mysecretpassword

このファイルの内容を説明します:

  • version: '3.8' Docker Compose ファイルフォーマットのバージョンを指定
  • services: アプリケーションを構成する様々なサービスを定義
  • web: webという名前のサービスを定義
    • image: nginx:latest Docker Hub の最新nginxイメージを使用
    • ports: ホストマシンのポート 80 をwebコンテナのポート 80 にマッピング
  • db: dbという名前のサービスを定義
    • image: postgres:latest Docker Hub の最新postgresイメージを使用
    • environment: コンテナ内の環境変数を設定。PostgreSQL イメージに必要なPOSTGRES_PASSWORDを設定

Ctrl + X、次にY、そしてEnterを押してファイルを保存します。

これで、2 つのサービスを定義するdocker-compose.ymlファイルが正常に作成されました。

サービスを起動して状態を確認

このステップでは、docker-compose.ymlファイルで定義したサービスを起動し、その状態を確認します。

まず、docker-compose.ymlファイルを作成した~/projectディレクトリにいることを確認してください。

cd ~/project

次に、docker-compose upコマンドを使用してサービスを起動します。-dフラグはコンテナをデタッチドモードで実行し、バックグラウンドで動作させます。

docker-compose up -d

このコマンドを初めて実行すると、Docker Compose は必要なイメージ(nginx:latestpostgres:latest)をシステム上に存在しない場合ダウンロードします。インターネット接続状況によっては時間がかかる場合があります。ダウンロード後、webdbサービスのコンテナが作成され起動します。

ネットワーク、ボリューム(このシンプルな例では定義されていません)、コンテナが作成・起動されることを示す出力が表示されます。

実行中のサービスの状態を確認するには、docker-compose psコマンドを使用します。

docker-compose ps

このコマンドは、現在のディレクトリで Docker Compose が管理するコンテナを一覧表示します。webdbサービスの両方がUp状態で表示されるはずです。

標準のdocker psコマンドを使用して、システム上で実行中のすべてのコンテナ(Docker Compose で起動したものも含む)を確認することもできます。

docker ps

コンテナ名がディレクトリ名(この場合はproject)とサービス名(例:project-web-1project-db-1)で始まるものを探してください。

サービスのログを確認するには、docker-compose logsコマンドを使用します。例えば、webサービスのログを確認するには:

docker-compose logs web

dbサービスの場合は:

docker-compose logs db

これはデバッグやコンテナ内で何が起こっているかを理解するのに役立ちます。

これで、docker-compose.ymlファイルで定義したサービスの起動に成功し、docker-compose psを使用してその状態を確認できました。

docker compose wait を使用してサービス停止を待機

このステップでは、サービスが特定の状態になるまでブロックするdocker compose waitコマンドについて説明します。デフォルトでは、docker compose waitはサービスが停止するまで待機します。

まず、前のステップで起動したサービスが実行中であることを確認します。docker-compose psを使用して確認できます。

cd ~/project
docker-compose ps

webdbの両サービスがUp状態で表示されるはずです。

次に、新しいターミナルウィンドウまたはタブを開いてください。後でサービスを停止するために、現在のターミナルウィンドウは開いたままにしておきます。

新しいターミナルウィンドウで、~/projectディレクトリに移動します。

cd ~/project

docker compose waitコマンドを実行します。このコマンドは、現在のディレクトリのdocker-compose.ymlファイルで定義されたすべてのサービスが停止するまでブロックして待機します。

docker compose wait

このコマンドがハングしているように見えることに気付くでしょう。これはサービスが現在実行中であるため予期された動作です。docker compose waitコマンドはサービスが停止するのを待機しています。

次に、サービスが実行中の元のターミナルウィンドウに戻ります。docker-compose downコマンドを使用してサービスを停止します。このコマンドは、docker-compose upで作成されたコンテナ、ネットワーク、ボリュームを停止して削除します。

cd ~/project
docker-compose down

元のターミナルウィンドウの出力を確認してください。コンテナが停止・削除されていることを示すメッセージが表示されます。

次に、docker compose waitを実行した新しいターミナルウィンドウに戻ります。他のターミナルでdocker-compose downコマンドによってサービスが停止されると、このウィンドウのdocker compose waitコマンドはサービスの停止を検知して終了します。

新しいターミナルウィンドウでコマンドプロンプトが戻ってくるのが確認できるはずです。これはdocker compose waitが指定されたサービス(デフォルトではすべてのサービス)が停止するまでブロックする仕組みを示しています。

これで、プロジェクト内のすべてのサービスが停止するまでdocker compose waitを使用して待機することに成功しました。

特定サービスに対する docker compose wait の使用方法

前のステップでは、docker compose waitを使用してすべてのサービスが停止するのを待機しました。このステップでは、特定のサービスが特定の状態になるまで待機する方法を学びます。

まず、docker-compose up -dを使用してサービスを再起動します。~/projectディレクトリにいることを確認してください。

cd ~/project
docker-compose up -d

docker-compose psを使用して両方のサービスが実行中であることを確認します。

docker-compose ps

次に、新しいターミナルウィンドウまたはタブを開きます。この新しいターミナルで特定のサービスを待機するデモンストレーションを行います。

新しいターミナルウィンドウで、~/projectディレクトリに移動します。

cd ~/project

docker compose waitコマンドの後にサービス名を指定することで、待機対象のサービスを選択できます。例えば、webサービスのみが停止するのを待機する場合:

docker compose wait web

前のステップと同様に、このコマンドはwebサービスが現在実行中であるためブロックされます。

次に、元のターミナルウィンドウに戻ります。ここではwebサービスのみを停止します。docker stopコマンドとコンテナ名を使用して行います。コンテナ名はdocker psで確認でき、おそらくproject-web-1のような名前になっています。

cd ~/project
docker stop project-web-1

実際のコンテナ名が異なる場合は、project-web-1を適切な名前に置き換えてください。

元のターミナルウィンドウの出力を確認すると、webコンテナが停止中であることを示すメッセージが表示されます。

次に、docker compose wait webを実行した新しいターミナルウィンドウに戻ります。webサービスが停止したため、docker compose wait webコマンドはこれを検知して終了します。

新しいターミナルウィンドウでコマンドプロンプトが戻ってくるのが確認できます。dbサービスがまだ実行中であっても、docker compose wait webコマンドは終了していることに注目してください。

dbサービスがまだ実行中であることを確認するため、元のターミナルに戻ってdocker-compose psを実行します。

cd ~/project
docker-compose ps

dbサービスがUp状態で表示され、webサービスは表示されないか停止状態になっているはずです。

最後に、残っているdbサービスを停止します。

cd ~/project
docker-compose down

これで、特定のサービスが停止するまでdocker compose waitを使用して待機することに成功しました。

--down-project オプションを指定した docker compose wait の使用方法

この最終ステップでは、docker compose wait--down-project オプションについて説明します。このオプションは、サービスの停止を待機した後、自動的にプロジェクト全体を停止させたい場合に便利です。

まず、前のステップでサービスが停止していることを確認します。docker-compose ps を使用して確認できます。

cd ~/project
docker-compose ps

もしサービスがまだ実行中の場合は、docker-compose down で停止させます。

docker-compose down

次に、デタッチドモードでサービスを再起動します。

cd ~/project
docker-compose up -d

両方のサービスが実行中であることを確認します。

docker-compose ps

ここで、docker compose wait コマンドに --down-project オプションを付けて実行します。このコマンドはすべてのサービスが停止するのを待機し、その後自動的に docker-compose down を実行します。

docker compose wait --down-project

これまでの docker compose wait の使用と同様に、このコマンドはサービスが現在実行中であるためブロックされます。

次に、新しいターミナルウィンドウまたはタブを開きます。この新しいターミナルで、手動でサービスを停止します。

新しいターミナルウィンドウで、~/project ディレクトリに移動します。

cd ~/project

docker-compose down を使用してサービスを停止します。

docker-compose down

新しいターミナルウィンドウの出力を確認してください。コンテナが停止・削除されていることを示すメッセージが表示されます。

次に、docker compose wait --down-project を実行した元のターミナルウィンドウに戻ります。他のターミナルで docker-compose down コマンドによってサービスが停止されると、docker compose wait コマンドはこれを検知します。--down-project オプションが使用されているため、自動的にプロジェクトを停止(この場合はコンテナ、ネットワーク、ボリュームの削除)に進みます。

元のターミナルウィンドウには、手動で docker-compose down を実行した時と同様の出力が表示されるはずです。プロジェクトが停止した後、docker compose wait コマンドは終了します。

これで、docker compose wait--down-project オプションを使用して、サービスの停止を待機した後、自動的にプロジェクトを停止させることに成功しました。

まとめ

この実験では、docker compose wait コマンドを使用してサービスが停止するまで待機する方法を学びました。最初に Docker Compose をインストールし、webdb という 2 つのサービスを定義するシンプルな docker-compose.yml ファイルを作成しました。このセットアップにより、wait コマンドの機能を実証するための環境が整いました。

次に、docker-compose.yml ファイルで定義されたすべてのサービスが停止するまで待機する方法を確認しました。また、特定のサービス名を指定してそれらのサービスのみの停止を待機する方法や、--down-project オプションを使用してプロジェクト全体が停止するまで待機する方法も学びました。これらのステップを通じて、Docker Compose サービスのライフサイクル管理における docker compose wait コマンドの柔軟性と有用性が示されました。