はじめに
この実験では、docker compose restartコマンドを使用して Docker サービスのライフサイクルを効果的に管理する方法を学びます。まず、Docker Compose を使用して Web サービスとデータベースサービスで構成されるシンプルなマルチサービスアプリケーションをセットアップします。
セットアップ後、docker compose restartコマンドを活用するさまざまな方法を探求します。これには、アプリケーション内のすべてのサービスの再起動、特定のサービスのターゲットを絞った再起動、依存関係に影響を与えずにサービスを再起動する方法、そして定義されたタイムアウト期間を設定してサービスを再起動する方法が含まれます。これらの実践的な演習を通じて、Docker 化されたアプリケーションを制御および維持するための実践的な経験を得ることができます。
シンプルなマルチサービスアプリケーションの準備
このステップでは、Docker サービスの再起動を練習するためにこの実験全体で使用するシンプルなマルチサービスアプリケーションを準備します。このアプリケーションは、Web サービスとデータベースサービスの 2 つのサービスで構成されています。これらのサービスは Docker Compose ファイルを使用して定義します。
まず、Docker Compose をインストールする必要があります。LabEx VM 環境にはプリインストールされていないため、ダウンロードしてインストールします。
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
sudo chmod +x /usr/local/bin/docker-compose
最初のコマンドは、公式 GitHub リポジトリから Docker Compose バイナリをダウンロードし、/usr/local/bin/docker-composeに保存します。$(uname -s)と$(uname -m)の部分は、オペレーティングシステムとアーキテクチャを自動検出して正しいバイナリをダウンロードします。2 番目のコマンドは、ダウンロードしたファイルを実行可能にします。
次に、Docker Compose のバージョンを確認してインストールを検証します。
docker-compose --version
Docker Compose version v2.20.2のような出力が表示されるはずです。
次に、この実験の作業ディレクトリである~/projectディレクトリに移動します。
cd ~/project
ここで、マルチサービスアプリケーションを定義するdocker-compose.ymlファイルを作成します。このファイルには、サービス、そのイメージ、および必要な設定が指定されます。
nano docker-compose.yml
以下の内容をdocker-compose.ymlファイルに貼り付けます:
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
depends_on:
- db
db:
image: postgres:latest
environment:
POSTGRES_PASSWORD: mysecretpassword
このdocker-compose.ymlファイルでは:
version: '3.8'は Docker Compose ファイルフォーマットのバージョンを指定しますservices:はアプリケーション内の異なるサービスを定義しますwebサービスはnginx:latestイメージを使用し、ホストのポート 80 をコンテナのポート 80 にマッピングし、dbサービスに依存しています。これはdbサービスがwebサービスの前に起動されることを意味しますdbサービスはpostgres:latestイメージを使用し、PostgreSQL イメージで必須のPOSTGRES_PASSWORD環境変数を設定します
ファイルを保存し、nano エディタを終了します(Ctrl + X、次にY、そしてEnterを押します)。
サービスを起動する前に、必要な Docker イメージをプルする必要があります。
docker pull nginx:latest
docker pull postgres:latest
これらのコマンドは、Docker Hub からnginx:latestとpostgres:latestイメージをダウンロードします。
最後に、docker-compose.ymlファイルで定義されたサービスを起動します。
docker-compose up -d
docker-compose up -dコマンドは、サービスをビルド、作成、バックグラウンド(デタッチドモード)で起動します。
以下のコマンドを使用して、実行中のサービスの状態を確認できます:
docker-compose ps
webとdbの両サービスが実行中であることを示す出力が表示されるはずです。
全サービスの再起動
このステップでは、docker-compose.ymlファイルで定義された全サービスを再起動する方法を学びます。サービスの再起動は、アプリケーションコードや設定、または Docker Compose ファイル自体に変更を加えた際によく行われる操作です。
全サービスを再起動するには、docker-compose restartコマンドを使用します。このコマンドは、docker-compose.ymlファイルで定義されている実行中のコンテナをすべて停止し、再度起動します。
まず、docker-compose.ymlファイルがある~/projectディレクトリにいることを確認してください。
cd ~/project
次に、以下のコマンドを実行して全サービスを再起動します:
docker-compose restart
サービスが停止され、再起動される様子を示す出力が表示されます。
コマンドが完了したら、docker-compose psコマンドを使用してサービスが再起動され、実行中であることを確認できます。
docker-compose ps
出力には、webとdbの両サービスがUp状態で表示され、正常に再起動されたことが示されるはずです。
全サービスの再起動は、アプリケーションの複数部分に影響する変更を適用する場合や、アプリケーションスタック全体をクリーンな状態で再起動したい場合に便利です。
特定サービスの再起動
このステップでは、マルチサービスアプリケーション内の特定のサービスだけを再起動する方法を学びます。これは単一のサービスに変更を加えた場合で、アプリケーションスタック全体を再起動する必要がない場合に便利です。
特定のサービスを再起動するには、docker-compose restartコマンドの後に再起動したいサービス名を指定します。サービス名はdocker-compose.ymlファイルで定義されています(この例ではwebとdbです)。
まず、~/projectディレクトリにいることを確認してください。
cd ~/project
webサービスを再起動してみましょう。
docker-compose restart web
webサービスが停止され、再起動される様子を示す出力が表示されます。dbサービスは実行されたままになります。
コマンドが完了したら、docker-compose psを使用してサービスの状態を確認します。
docker-compose ps
出力には、webとdbの両サービスが依然としてUp状態で表示されるはずです。ただし、webサービスは一度停止され、再起動されています。
次に、dbサービスを再起動してみましょう。
docker-compose restart db
dbサービスが停止され、再起動される様子を示す出力が表示されます。webサービスはdbサービスに依存しているため、Docker Compose は依存関係を満たすためにwebサービスも一時的に停止・再起動する場合があることに注意してください。
再度サービス状態を確認します:
docker-compose ps
両サービスともUp状態であるはずです。個別のサービスを再起動することで、アプリケーションのライフサイクルをより細かく制御できます。
依存関係なしでサービスを再起動
前のステップでは、docker-compose.ymlで定義されたdepends_on関係により、dbサービスを再起動するとwebサービスも一時的に再起動されることを確認しました。場合によっては、依存関係に影響を与えずにサービスを再起動したいことがあります。
依存関係なしでサービスを再起動するには、docker-compose restartコマンドに--no-depsフラグを追加します。
まず、~/projectディレクトリにいることを確認してください。
cd ~/project
今度は--no-depsフラグを使用して、dbサービスを再起動してみましょう。
docker-compose restart --no-deps db
出力を確認してください。dbサービスのみが停止・再起動され、dbに依存しているwebサービスは影響を受けていないはずです。
docker-compose psを使用してサービスの状態を確認します。
docker-compose ps
両サービスとも依然としてUp状態であるはずです。これにより、依存関係を考慮せずにサービスを単独で再起動する方法が示されました。これはデバッグ時や、依存関係を持つ他のサービスに影響を与えずに単一のサービスに変更を適用したい場合に便利です。
タイムアウト指定でのサービス再起動
この最終ステップでは、再起動操作にタイムアウトを指定する方法を学びます。サービスを再起動する際、Docker Compose はコンテナに停止シグナルを送信し、正常にシャットダウンするのを待ちます。一定時間内にコンテナが停止しない場合、Docker は強制的にシャットダウンします。この待機時間は--timeoutフラグで制御できます。
コンテナ停止のデフォルトタイムアウトは 10 秒です。ここでは、webサービスを 3 秒の短いタイムアウトで再起動してみましょう。
まず、~/projectディレクトリにいることを確認してください。
cd ~/project
以下のコマンドを実行して、webサービスを 3 秒のタイムアウトで再起動します:
docker-compose restart --timeout 3 web
webサービスが停止され、再起動される様子を示す出力が表示されます。Docker Compose はコンテナが正常に停止するのを最大 3 秒待ち、その後強制シャットダウンを行います。
コマンドが完了したら、docker-compose psでサービスの状態を確認します。
docker-compose ps
両サービスとも依然としてUp状態であるはずです。
--timeoutフラグを使用することで、Docker Compose が再起動時にサービス停止を待機する時間を制御できます。これは、クリーンシャットダウンにより多くの時間を必要とするサービスや、逆により短い時間で停止させたいサービスに便利です。
最後に、実行中のサービスを停止・削除してクリーンアップしましょう。
docker-compose down
docker-compose downコマンドは、docker-compose upで作成されたコンテナ、ネットワーク、ボリュームを停止・削除します。
まとめ
この実験では、Docker Compose を使用してシンプルなマルチサービスアプリケーションを準備する方法を学びました。具体的には、Docker Compose のインストール、インストールの確認、そして web サービス (nginx) とデータベースサービス (postgres) の 2 つのサービスを定義するdocker-compose.ymlファイルの作成を行いました。ここで web サービスはデータベースサービスに依存するように設定しました。
その後、docker compose restartコマンドを使用してこれらのサービスを管理する様々な方法を検討しました。docker-compose.ymlファイルで定義されたすべてのサービスの再起動、特定のサービスの再起動、依存関係を再起動せずにサービスを再起動する方法、そして指定したタイムアウト期間でサービスを再起動する方法を学びました。これらのステップを通じて、Docker Compose がマルチコンテナアプリケーションのライフサイクル管理において提供する柔軟性と制御性が実証されました。



