はじめに
この実験では、docker stack config コマンドを使用して、Docker Compose ファイルの最終的なマージされた構成を調査する方法を学びます。これは、特に複数のファイルや環境変数を扱う場合に、Docker が Compose 定義をどのように解釈するかを理解するために重要なスキルです。まず、単一の Compose ファイルから構成を出力する方法を学び、その際に LabEx 環境で Docker Compose をインストールするための必要な手順も含みます。
その後、複数の Compose ファイルからの構成をマージして出力する方法を探索し、Docker が異なるソースからの定義をどのように結合するかを実証します。また、標準入力から直接構成を出力する方法や、構成出力を生成する際に環境変数の補間をスキップする方法も学びます。これらの手順により、docker stack config コマンドが Docker Compose 設定のデバッグと検証に持つ機能を包括的に理解することができます。
単一の Compose ファイルから最終構成を出力する
このステップでは、単一の Docker Compose ファイルから最終構成を出力する方法を学びます。これは、すべての変数と拡張機能が処理された後の 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
このコマンドは、公式の GitHub リポジトリから Docker Compose のバイナリをダウンロードします。$(uname -s) と $(uname -m) は、VM のオペレーティングシステムとアーキテクチャを取得するために使用され、正しいバイナリをダウンロードすることを保証します。
次に、ダウンロードしたバイナリに実行権限を付与する必要があります。
sudo chmod +x /usr/local/bin/docker-compose
このコマンドは、docker-compose コマンドを実行可能にします。
では、バージョンを確認することでインストールを検証しましょう。
docker-compose --version
コンソールにインストールされた Docker Compose のバージョンが表示されるはずです。
構成を出力する前に、Docker Compose ファイルが必要です。~/project ディレクトリに簡単なファイルを作成しましょう。
nano ~/project/docker-compose.yaml
次の内容を docker-compose.yaml ファイルに貼り付けます。
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
これは、nginx:latest イメージを使用して web という名前の単一のサービスを定義し、ホストのポート 80 をコンテナ内のポート 80 にマッピングする簡単な Compose ファイルです。
Ctrl + X を押し、次に Y を押し、最後に Enter を押してファイルを保存します。
では、docker-compose.yaml ファイルを保存した ~/project ディレクトリに移動しましょう。
cd ~/project
この Compose ファイルから最終構成を出力するには、docker-compose config コマンドを使用します。
docker-compose config
このコマンドは、現在のディレクトリ内の docker-compose.yaml ファイルを読み取り、最終的にマージされた構成を標準出力に出力します。docker-compose.yaml ファイルの YAML 内容が表示され、Docker Compose によって追加されたいくつかの追加のデフォルト値が含まれている可能性があります。
複数の Compose ファイルから構成をマージして出力する
このステップでは、複数の Docker Compose ファイルからの構成をマージし、最終的な結合された構成を出力する方法を学びます。これは、基本構成を定義し、それを追加のファイルで上書きまたは拡張することができる強力な機能であり、異なる環境(開発、ステージング、本番など)を管理するのに役立ちます。
~/project ディレクトリで作業を続けます。前のステップで docker-compose.yaml ファイルを作成しました。では、基本構成を拡張するための別の Compose ファイルを作成しましょう。docker-compose.override.yaml と名付けます。
nano ~/project/docker-compose.override.yaml
次の内容を docker-compose.override.yaml ファイルに貼り付けます。
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
この上書きファイルは、docker-compose.yaml で定義された web サービスを変更します。ホストのポートマッピングを 80 から 8080 に変更し、html という名前のローカルディレクトリから静的な HTML コンテンツを提供するためのボリュームマウントを追加します。
Ctrl + X を押し、次に Y を押し、最後に Enter を押してファイルを保存します。
では、html ディレクトリを作成し、その中に簡単な index.html ファイルを作成しましょう。
mkdir ~/project/html
nano ~/project/html/index.html
次の内容を ~/project/html/index.html に貼り付けます。
<h1>Hello from Nginx!</h1>
Ctrl + X を押し、次に Y を押し、最後に Enter を押してファイルを保存します。
デフォルトでは、Docker Compose は現在のディレクトリ内の docker-compose.yaml と docker-compose.override.yaml を自動的に探してマージします。上書きファイルの構成が優先されます。
マージされた構成を確認するには、~/project ディレクトリにいることを確認し、再度 docker-compose config コマンドを実行します。
cd ~/project
docker-compose config
これで、web サービスがポートマッピング 8080:80 とボリュームマウント ./html:/usr/share/nginx/html を持つ結合された構成が表示されるはずです。
-f フラグを使用して、使用する Compose ファイルを明示的に指定することもできます。ファイルを指定する順序は重要で、後のファイルが前のファイルを上書きします。
たとえば、docker-compose.yaml と docker-compose.override.yaml を明示的にマージするには、次のコマンドを実行できます。
docker-compose -f docker-compose.yaml -f docker-compose.override.yaml config
この場合、docker-compose.override.yaml は docker-compose.yaml の後に自動的に検出されてマージされるため、このコマンドは -f フラグを使用せずに docker-compose config を実行した場合と同じマージされた出力を生成します。
標準入力から構成を出力する
このステップでは、標準入力 (stdin) を介して提供される Docker Compose ファイルから最終構成を出力する方法を学びます。これは、Compose ファイルを動的に生成したい場合や、別のコマンドの出力を直接 docker-compose config にパイプする場合に便利です。
~/project ディレクトリで作業を続けます。ファイルから読み取る代わりに、Compose 構成の内容を直接 docker-compose config コマンドにパイプします。
cat コマンドを使用して docker-compose.yaml ファイルの内容を出力し、docker-compose config にパイプしましょう。
cd ~/project
cat docker-compose.yaml | docker-compose config -f -
このコマンドでは:
cat docker-compose.yamlはdocker-compose.yamlファイルの内容を標準出力に出力します。|はパイプ演算子で、catコマンドの標準出力をdocker-compose configコマンドの標準入力にリダイレクトします。docker-compose config -f -はdocker-compose configにファイルではなく標準入力 (-) から構成を読み取るように指示します。
最初のステップで docker-compose config を実行したときと同じ出力、つまり docker-compose.yaml の構成が表示されるはずです。
また、別の構成を直接パイプすることもできます。たとえば、redis サービスの簡単な構成をパイプしてみましょう。
echo "version: '3.8'\nservices:\n redis:\n image: redis:latest" | docker-compose config -f -
このコマンドでは:
echo "version: '3.8'\nservices:\n redis:\n image: redis:latest"は、redisサービスを持つ簡単な Compose ファイルの YAML 文字列を出力します。\nは出力に改行を作成します。|はこの文字列をdocker-compose configコマンドにパイプします。docker-compose config -f -は標準入力から構成を読み取ります。
出力は redis サービスの YAML 構成になるはずです。
この方法は、Compose 構成をプログラムで生成する場合や、構成をファイルに保存せずにすぐにテストしたい場合に特に便利です。
変数補間をスキップしてマージされた構成を出力する
このステップでは、複数の Docker Compose ファイルからマージされた構成を出力する際に、変数補間をスキップする方法を学びます。デフォルトでは、docker-compose config は環境変数を補間します。デバッグやテンプレート生成など、変数がそのまま残った生の構成を見たい場合に、補間をスキップすると便利です。
~/project ディレクトリで、docker-compose.yaml と docker-compose.override.yaml ファイルを使って作業を続けます。
まず、補間をデモンストレーションするために、docker-compose.yaml ファイルに環境変数を追加しましょう。
nano ~/project/docker-compose.yaml
docker-compose.yaml ファイルを変更して、イメージ名に環境変数を含めます。
version: "3.8"
services:
web:
image: nginx:${NGINX_VERSION:-latest}
ports:
- "80:80"
ここで、${NGINX_VERSION:-latest} は NGINX_VERSION 環境変数の値に置き換えられる変数です。NGINX_VERSION が設定されていない場合は、デフォルトで latest になります。
Ctrl + X を押し、次に Y を押し、最後に Enter を押してファイルを保存します。
では、NGINX_VERSION 環境変数を設定してから、docker-compose config を実行して補間の動作を確認しましょう。
cd ~/project
export NGINX_VERSION=1.21
docker-compose config
マージされた構成が表示され、web サービスのイメージ名は nginx:1.21 になっているはずです。
変数を補間せずにマージされた構成を出力するには、docker-compose config コマンドに --no-interpolate フラグを使用します。
docker-compose --no-interpolate config
今回は、NGINX_VERSION 環境変数が設定されているにもかかわらず、出力には変数のプレースホルダが残ったまま、イメージ名が nginx:${NGINX_VERSION:-latest} と表示されるはずです。
このフラグは、変数置換が行われる前の Compose ファイルに記述された正確な構成を見たい場合に役立ちます。
まとめ
この実験では、docker-compose config コマンドを使用して Docker Compose ファイルの最終構成を調査する方法を学びました。まず、LabEx の仮想マシン (VM) 環境に Docker Compose をインストールし、システムアーキテクチャに適したバイナリをダウンロードし、実行権限を付与しました。その後、バージョンを確認することでインストールを検証しました。
インストール後、基本的な Web サービスを定義する簡単な docker-compose.yaml ファイルを作成しました。そして、docker-compose config コマンドを使用して、この単一の Compose ファイルから最終構成を出力し、Compose 定義の処理状態を表示する方法を実演しました。



