はじめに
この実験では、compose.yaml ファイルで定義されたサービスイメージを更新するために docker compose pull コマンドを使用する方法を学びます。まず、Docker イメージを利用するサービスを含む compose.yaml ファイルを準備します。
セットアップ後、docker compose pull コマンドのさまざまな使用方法を探求します。具体的には、特定のサービスイメージの取得、すべてのサービスイメージの取得、ビルド可能なサービスを無視したイメージの取得、進行状況情報を表示せずに静かにイメージを取得する方法などを含みます。この実践的な経験を通じて、Docker Compose のサービスイメージを効率的に管理および更新するスキルを身につけることができます。
イメージを使用したサービスを含む compose.yaml ファイルの準備
このステップでは、Docker イメージを使用するサービスを定義したcompose.yamlファイルを準備します。Docker Compose は、マルチコンテナの Docker アプリケーションを定義・管理するためのツールです。LabEx VM には Docker が既にインストールされていますが、Docker Compose はインストールされていません。まず Docker Compose をインストールします。
まず、Docker Compose をインストールしましょう。Docker Compose バイナリをダウンロードし、実行可能にします。
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
Docker Compose がインストールされたので、バージョンを確認してインストールを検証します。
docker-compose --version
Docker Compose version v2.20.2のような出力が表示されるはずです。
次に、プロジェクト用のディレクトリを作成し、その中に移動します。
mkdir ~/project/my-compose-app
cd ~/project/my-compose-app
このディレクトリ内にcompose.yamlファイルを作成します。このファイルは、nginxイメージを使用する Web サービスとredisイメージを使用するデータベースサービスの 2 つのサービスを定義します。
nano compose.yaml
以下の内容をcompose.yamlファイルに貼り付けます:
services:
web:
image: nginx:latest
ports:
- "80:80"
db:
image: redis:latest
ファイルを保存し、nano エディタを終了します(Ctrl + X、次にY、そしてEnterを押します)。
このcompose.yamlファイルは 2 つのサービスを定義しています:
web:nginx:latestDocker イメージを使用し、ホストのポート 80 をコンテナのポート 80 にマッピングしますdb:redis:latestDocker イメージを使用します
次のステップでは、このcompose.yamlファイルを使用して定義されたサービスイメージを取得します。
docker compose pull で特定サービスのイメージを取得
このステップでは、compose.yaml ファイルで定義された特定のサービスイメージを docker compose pull コマンドで取得する方法を学びます。これは、他のサービスに影響を与えずに単一のサービスのイメージのみを更新またはダウンロードする必要がある場合に便利です。
まず、前のステップで compose.yaml ファイルを作成した ~/project/my-compose-app ディレクトリにいることを確認してください。
cd ~/project/my-compose-app
次に、web サービスのイメージを取得しましょう。これを行うコマンドは docker compose pull <service_name> です。今回のケースではサービス名は web です。
docker compose pull web
Docker Compose が nginx:latest イメージを取得していることを示す出力が表示されます。このプロセスでは、Docker レジストリからイメージレイヤーがダウンロードされます。
コマンドが完了したら、利用可能な Docker イメージをリスト表示して nginx イメージが取得されたことを確認できます。
docker images
出力に nginx とそのタグ (latest)、イメージ ID、作成日、サイズが表示されるはずです。
これで、compose.yaml ファイルで定義された特定のサービスのイメージを選択的に取得する方法がわかりました。次のステップでは、すべてのサービスのイメージを取得します。
compose.yaml ファイルで定義された全サービスのイメージを取得
このステップでは、docker compose pull コマンドを使用して compose.yaml ファイルで定義された全サービスのイメージを取得する方法を学びます。サービス名を指定しない場合、これが docker compose pull のデフォルト動作となります。
まず、~/project/my-compose-app ディレクトリにいることを確認してください。
cd ~/project/my-compose-app
次に、引数を指定せずに docker compose pull コマンドを実行します。
docker compose pull
このコマンドは compose.yaml ファイルを読み込み、定義されている全サービスのイメージを取得します。前のステップで既に nginx イメージを取得しているため、Docker Compose はイメージが最新かどうかを確認します。そしてまだ取得されていない redis:latest イメージの取得を開始します。
redis イメージの取得プロセスを示す出力が表示されます。
コマンドが完了したら、利用可能な Docker イメージをリスト表示して nginx と redis の両方のイメージが取得されたことを確認できます。
docker images
これで出力に nginx と redis の両方が表示されるはずです。
この方法により、マルチコンテナアプリケーションに必要な全イメージを 1 つのコマンドで簡単に取得できることがわかります。
ビルド可能なサービスを除外してイメージを取得
このステップでは、docker compose pull コマンドで --ignore-buildable フラグを使用する方法を説明します。このフラグは、compose.yaml ファイルに Dockerfile からビルドするサービス(ビルド可能なサービス)と事前ビルド済みイメージを使用するサービスの両方が含まれている場合に便利です。--ignore-buildable フラグを指定すると、Docker Compose は image キーが指定されているサービスのみイメージを取得し、build キーが指定されているサービスはスキップします。
まず、compose.yaml ファイルを修正してビルド可能なサービスを含めます。基本的なイメージをビルドするシンプルなサービスを追加します。
~/project/my-compose-app ディレクトリにいることを確認してください。
cd ~/project/my-compose-app
次に、ビルド可能なサービスのためのシンプルな Dockerfile を作成します。
nano Dockerfile
以下の内容を Dockerfile に貼り付けます:
FROM alpine:latest
CMD ["echo", "Hello from buildable service!"]
ファイルを保存して nano エディタを終了します。
続いて、compose.yaml ファイルを修正してこの Dockerfile を使用する新しいサービスを追加します。
nano compose.yaml
db サービスの下に以下のサービス定義を追加します:
builder:
build: .
完成した compose.yaml ファイルは以下のようになります:
services:
web:
image: nginx:latest
ports:
- "80:80"
db:
image: redis:latest
builder:
build: .
ファイルを保存して nano エディタを終了します。
それでは、docker compose pull --ignore-buildable を使用してイメージを取得してみましょう。
docker compose pull --ignore-buildable
Docker Compose が web と db サービスをチェックし、必要に応じてそれらのイメージを取得する様子が確認できます(前のステップですでに取得済みのはずです)。しかし、builder サービスは image キーではなく build キーを使用しているため無視されます。builder サービスに関連するビルドやイメージ取得の出力は表示されません。
builder サービスのイメージがビルドまたは取得されていないことを確認するには、Docker イメージをリスト表示します。
docker images
nginx と redis イメージのみが表示され、このコマンドによって Dockerfile から新しいイメージが作成されていないことがわかります。
このように、--ignore-buildable フラグを使用することで、事前ビルド済みイメージのみを選択的に取得できることがわかりました。これは様々な開発やデプロイメントのシナリオで役立ちます。
進捗情報を表示せずにサービスイメージを取得
このステップでは、docker compose pull コマンドで --quiet または -q フラグを使用して、詳細な進捗情報を表示せずにサービスイメージを取得する方法を学びます。これは、スクリプトや自動化されたワークフローなどでターミナルの出力量を減らしたい場合に便利です。
まず、~/project/my-compose-app ディレクトリにいることを確認してください。
cd ~/project/my-compose-app
次に、docker compose pull --quiet コマンドを使用してイメージを取得します。web と db のイメージは前のステップですでに存在している可能性が高いため、Docker Compose はそれらが最新かどうかをチェックします。最新であれば、コマンドは最小限の出力で素早く完了します。イメージを取得する必要があった場合でも、通常のプログレスバーやレイヤー情報は表示されません。
docker compose pull --quiet
--quiet フラグなしで docker compose pull を実行した場合と比べて、出力が大幅に簡素化されていることに気付くでしょう。イメージがすでに最新であることを示すメッセージは表示されるかもしれませんが、各レイヤーの詳細なダウンロード進捗は表示されません。
効果をより明確に示すために、まず 1 つのイメージを削除してから、--quiet フラグ付きで取得してみましょう。redis イメージを削除します。
docker rmi redis:latest
そして、再度 --quiet フラグを使用してイメージを取得します。
docker compose pull --quiet
今回は redis イメージが取得されますが、詳細な進捗は表示されません。出力は最小限で、通常の視覚的フィードバックなしで取得操作が行われていることが確認できます。
Docker イメージをリスト表示して、redis イメージが再度取得されたことを確認できます。
docker images
nginx と redis の両方が表示されるはずです。
--quiet フラグは、docker compose pull コマンドの出力詳細度を制御するシンプルかつ効果的な方法で、詳細な出力が不要な環境に適しています。
まとめ
この実験では、docker compose pull コマンドを使用してサービスイメージを更新する方法を学びました。まず、特定の Docker イメージを持つサービスを定義した compose.yaml ファイルを準備し、Docker Compose 自体のインストールも行いました。
その後、個々のサービスのイメージを取得する方法、ファイル内で定義された全てのサービスを取得する方法、ビルド可能なサービスを無視するオプションの使用方法、そして出力を抑制して静かに取得する方法について検討しました。



