はじめに
この実験では、Docker Compose ファイルで定義されたサービスを管理するためにdocker compose stopコマンドを使用する方法を学びます。まず、Docker Compose のインストールと基本的なdocker-compose.ymlファイルの作成を含む、シンプルな Docker Compose プロジェクトの準備から始めます。
プロジェクトのセットアップ後、Compose ファイルで定義されたサービスを起動する練習を行います。この実験の核心は、docker compose stopコマンドを使用して、実行中のすべてのサービスを停止する方法、特定のサービスを停止する方法、および指定したタイムアウトでサービスを停止する方法に焦点を当てています。この実践的な経験を通じて、Docker Compose を使用してマルチコンテナ Docker アプリケーションのライフサイクルを制御するための実用的なスキルを習得できます。
シンプルな Docker Compose プロジェクトの準備
このステップでは、シンプルな Docker Compose プロジェクトを準備します。Docker Compose は、マルチコンテナ Docker アプリケーションを定義・実行するためのツールです。Compose では YAML ファイルを使用してアプリケーションのサービスを設定し、単一のコマンドで設定からすべてのサービスを作成・起動できます。
LabEx 環境には Docker Compose がプリインストールされていないため、まずインストールする必要があります。Docker Compose バイナリをダウンロードし、実行可能にします。
まず、Docker Compose バイナリをダウンロードします。最新の安定版リリースをcurlでダウンロードします。
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
このコマンドは、システムアーキテクチャに合った Docker Compose バイナリをダウンロードし、/usr/local/bin/docker-composeに保存します。
次に、ダウンロードしたバイナリを実行可能にします。
sudo chmod +x /usr/local/bin/docker-compose
このコマンドで Docker Compose バイナリに実行権限を追加します。
インストールを確認するため、Docker Compose のバージョンを確認しましょう。
docker-compose --version
出力にインストールされた Docker Compose のバージョンが表示されれば、インストールは成功です。
Docker Compose がインストールされたので、シンプルな Docker Compose プロジェクトを作成します。プロジェクト用のディレクトリを作成し、その中にdocker-compose.ymlファイルを作成します。
まず、ホームディレクトリにmy-compose-appというディレクトリを作成します。
mkdir ~/project/my-compose-app
新しく作成したディレクトリに移動します。
cd ~/project/my-compose-app
次に、docker-compose.ymlファイルを作成します。このファイルでアプリケーションのサービスを定義します。nanoを使用してファイルを作成・編集します。
nano docker-compose.yml
nanoエディタ内で、以下の内容を貼り付けます:
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
app:
image: ubuntu:latest
command: tail -f /dev/null
このdocker-compose.ymlファイルの内容を説明します:
version: '3.8'- Docker Compose ファイルフォーマットのバージョンを指定services:- アプリケーションを構成するサービスを定義web:-webという名前のサービスを定義image: nginx:latest- このサービスがnginx:latestDocker イメージを使用することを指定。イメージがローカルにない場合、Docker Compose が Docker Hub から取得ports:- ホストマシンのポート 80 をwebコンテナのポート 80 にマッピング
app:-appという名前のサービスを定義image: ubuntu:latest- このサービスがubuntu:latestDocker イメージを使用することを指定command: tail -f /dev/null-appコンテナ起動時に実行するコマンドを指定。このコマンドでコンテナが終了せずに実行され続ける
Ctrl + X、次にY、そしてEnterを押してファイルを保存します。
サービスを起動する前に、必要な Docker イメージが利用可能か確認します。Docker Compose はイメージが存在しない場合に自動的に取得しますが、特にインターネットアクセスが制限された環境や起動を速くしたい場合には、事前に明示的に取得するのが良いプラクティスです。
まず、nginx:latestイメージを取得します。
docker pull nginx:latest
このコマンドで Docker Hub からnginx:latestイメージをダウンロードします。
次に、ubuntu:latestイメージを取得します。
docker pull ubuntu:latest
このコマンドで Docker Hub からubuntu:latestイメージをダウンロードします。
これで、webとappの 2 つのサービスを持つシンプルな Docker Compose プロジェクトの準備が完了し、必要な Docker イメージも取得できました。
Compose ファイルで定義されたサービスの起動
このステップでは、前のステップで作成したdocker-compose.ymlファイルに定義されたサービスを起動します。Docker Compose は、設定内のすべてのサービスをビルド、作成、起動するためのシンプルなコマンドを提供します。
docker-compose.ymlファイルがある~/project/my-compose-appディレクトリにいることを確認してください。
cd ~/project/my-compose-app
サービスを起動するには、docker-compose upコマンドを使用します。デフォルトでは、docker-compose upはコンテナをフォアグラウンドで起動し、各コンテナのログを表示します。
docker-compose up
このコマンドを実行すると、Docker Compose は以下の処理を行います:
- カレントディレクトリの
docker-compose.ymlファイルを探す - 各サービスに必要な Docker イメージが利用可能でない場合、ビルドまたは取得する
- 各サービスのコンテナを作成して起動する
- 実行中のすべてのコンテナからのログをターミナルに表示する
ネットワークとコンテナが作成・起動されていることを示す出力が表示されます。web(nginx)とapp(ubuntu)コンテナからのログが表示されます。
ターミナルの使用を継続するため、サービスをバックグラウンドで実行したい場合は、Ctrl + Cで現在の実行を停止できます。
デタッチドモード(バックグラウンド)でサービスを実行するには、docker-compose upコマンドに-dフラグを追加します。
docker-compose up -d
このコマンドはサービスをバックグラウンドで起動し、作成されたコンテナの名前を表示します。
サービスがデタッチドモードで実行されているので、docker psコマンドで実行中のコンテナの状態を確認できます。
docker ps
2 つの実行中コンテナが表示されるはずです:webサービス(nginx イメージベース)とappサービス(ubuntu イメージベース)です。出力には、コンテナの ID、イメージ、状態、ポートなどの情報が表示されます。
webサービスがアクセス可能か確認するため、ポート 80 で実行されている nginx サーバーにcurlでアクセスします。ホストのポート 80 をwebコンテナのポート 80 にマッピングしたので、LabEx VM から直接アクセスできます。
curl http://localhost:80
nginx ウェブサーバーが提供するデフォルトの HTML コンテンツが表示されれば、webサービスが実行中でアクセス可能であることが確認できます。
実行中の全サービスの停止
このステップでは、現在実行中の Docker Compose プロジェクトのサービスを停止する方法を学びます。Docker Compose は、docker-compose.ymlファイルで定義されたすべてのコンテナを停止する便利なコマンドを提供します。
docker-compose.ymlファイルがある~/project/my-compose-appディレクトリにいることを確認してください。
cd ~/project/my-compose-app
実行中のすべてのサービスを停止するには、docker-compose downコマンドを使用します。このコマンドは、docker-compose.ymlファイルで定義されたコンテナ、ネットワーク、ボリュームを停止・削除します。
docker-compose down
このコマンドを実行すると、Docker Compose は以下の処理を行います:
- 実行中のコンテナを正常に停止する
- 停止したコンテナを削除する
- このプロジェクトのために Docker Compose が作成したネットワークを削除する
docker-compose.ymlファイルで定義されたボリュームを削除する(明示的に指定しない限り)
コンテナとネットワークが停止・削除されていることを示す出力が表示されます。
docker-compose downを実行した後、docker psコマンドを使用してコンテナが実行されていないことを確認できます。
docker ps
このコマンドは現在実行中のコンテナを一覧表示します。すべてのサービスを停止したので、出力にwebやappコンテナは表示されないはずです。システム上で他のコンテナが実行されていない場合、出力はヘッダ行のみか空になります。
docker-compose downでサービスを停止することは、Docker Compose プロジェクトのリソースを終了時にクリーンアップする標準的な方法です。
特定サービスの停止
このステップでは、Docker Compose プロジェクト内の特定のサービスを停止する方法を学びます。すべてのサービスを一度に停止するのではなく、単一のコンポーネントのみを再起動または停止したい場合に便利です。
まず、サービスが実行中であることを確認しましょう。プロジェクトディレクトリに移動し、サービスをデタッチドモードで起動します。
cd ~/project/my-compose-app
docker-compose up -d
docker psを使用して、webとappの両サービスが実行中であることを確認します。
docker ps
両方のコンテナが実行中としてリスト表示されるはずです。
ここで、appサービスのみを停止しましょう。特定のサービスを停止するには、docker-compose stopコマンドの後にサービス名を指定します。
docker-compose stop app
このコマンドはappサービスのコンテナに停止シグナルを送信し、正常に停止するまで待機します。
コマンド実行後、再度コンテナの状態を確認しましょう。
docker ps
現在はwebコンテナのみが実行中として表示されるはずです。appコンテナは実行中のコンテナリストから消えているでしょう。
appコンテナが停止したことを確認するため、docker ps -aを使用することもできます。このコマンドは停止中のコンテナも含めてすべてのコンテナを表示します。
docker ps -a
appコンテナがExitedステータスでリスト表示されるはずです。
特定のサービスを停止することで、アプリケーションの個々のコンポーネントを他のコンポーネントに影響を与えずに管理できます。これは開発中や特定サービスのトラブルシューティング時に特に役立ちます。
タイムアウト付きでのサービス停止
このステップでは、指定したタイムアウト時間でサービスを停止する方法を説明します。コンテナを停止する際、Docker はコンテナ内のメインプロセスにSIGTERMシグナルを送信し、正常にシャットダウンする時間を与えます。プロセスが一定時間内に終了しない場合、Docker は強制終了するためにSIGKILLシグナルを送信します。デフォルトではこのタイムアウト時間は 10 秒に設定されていますが、docker-compose stopまたはdocker-compose downコマンドで-tまたは--timeoutフラグを使用することでこの時間を調整できます。
まず、サービスが実行中であることを確認しましょう。プロジェクトディレクトリに移動し、サービスをデタッチドモードで起動します。
cd ~/project/my-compose-app
docker-compose up -d
両方のサービスが実行中であることを確認します:
docker ps
次に、webサービスを 5 秒のタイムアウトで停止します。
docker-compose stop -t 5 web
このコマンドは、Docker Compose にwebサービスを停止させ、SIGTERMシグナル送信後、最大 5 秒間コンテナが正常に停止するのを待機させます。5 秒以内にコンテナが停止しない場合、Docker はSIGKILLシグナルを送信します。
webサービスが停止中であることを示す出力が表示されます。
再度コンテナの状態を確認しましょう:
docker ps
現在はappコンテナのみが実行中で、webコンテナは停止しているはずです。
同様に、docker-compose downを使用してすべてのサービスを停止する際にもタイムアウトを設定できます。3 秒のタイムアウトで全サービスを停止してみましょう。
docker-compose down -t 3
このコマンドは、docker-compose.ymlファイルで定義されたすべてのサービスを停止しようとし、各コンテナが正常に停止するまで最大 3 秒間待機した後、強制的に停止します。
コマンド実行後に実行中のコンテナがないことを確認します:
docker ps
出力には実行中のコンテナが表示されないはずです。
タイムアウトオプションを使用することで、アプリケーションが停止前にクリーンアップタスクを実行する十分な時間を確保でき、データ破損やその他の問題を防ぐことが重要です。
まとめ
この実験では、シンプルな Docker Compose プロジェクトを準備する方法を学びました。具体的には、バイナリをダウンロードして実行可能にすることで Docker Compose をインストールし、インストールを検証しました。その後、プロジェクトディレクトリとdocker-compose.ymlファイルを作成し、アプリケーションのサービスを定義しました。
また、Compose ファイルで定義されたサービスのライフサイクルをdocker compose stopコマンドを使用して管理する方法も学びました。これには、すべてのサービスの起動、実行中の全サービスの停止、特定サービスの停止、および指定タイムアウトでのサービス停止が含まれます。



