はじめに
この実験では、docker-compose alpha vizコマンドを使用して Docker Compose ファイルを効果的に可視化する方法を学びます。このハンズオン体験では、サービスを表現する基本的なグラフの生成から始め、段階的にサービスイメージ、ネットワーク、ポートを含めた視覚化を強化していきます。また、可読性を向上させるために出力グラフのインデントをカスタマイズする方法も習得します。
この実験を修了する頃には、Docker Compose 設定を明確で情報量の多い視覚的表現として作成できるようになり、マルチコンテナアプリケーション内の関係性と依存関係を容易に理解できるようになります。
Compose ファイルから基本的なグラフを生成
このステップでは、Docker Compose ファイルの基本的なグラフ表現を生成する方法を学びます。これはサービス、ネットワーク、ボリューム間の関係を視覚化するのに役立ちます。
まず、Docker Compose をインストールする必要があります。LabEx 環境にはプリインストールされていないため、pipを使用してインストールします。
sudo apt update
sudo apt install -y python3-pip
pip install docker-compose
インストールが完了したら、Docker Compose のバージョンを確認してインストールを検証できます。
docker-compose --version
docker-compose version 1.29.2, build 5becea4cのような出力が表示されるはずです。
次に、簡単な Docker Compose ファイルを作成しましょう。プロジェクトディレクトリに移動し、docker-compose.ymlというファイルを作成します。
cd ~/project
nano docker-compose.yml
docker-compose.ymlファイルに以下の内容を追加します:
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
app:
image: ubuntu:latest
command: sleep infinity
このdocker-compose.ymlファイルは、nginx:latestイメージを使用するwebサービスとubuntu:latestイメージを使用するappサービスの 2 つを定義しています。webサービスはホストのポート 80 をコンテナ内のポート 80 にマッピングします。appサービスは単にコンテナを実行し続けるためにsleep infinityコマンドを実行します。
この compose ファイルから基本的なグラフを生成するには、docker-compose configコマンドに--graphフラグを付けて使用します。このコマンドは compose ファイルを解析し、DOT 形式でグラフ表現を出力します。
docker-compose config --graph
出力は DOT 言語(グラフ記述言語)で表示されます。サービスとそれらの基本的な接続関係が表示されます。例えば、次のような内容が表示されるかもしれません:
digraph {
compound=true
"web" [label="web"]
"app" [label="app"]
"web" -> "app" [label="depends_on"]
}
この DOT 出力は、webとappがノードで、"depends_on"というラベルの付いたwebからappへの有向エッジがある有向グラフを表しています。この簡単な例では明示的に依存関係を定義していませんが、docker-compose config --graphは一部の関係を推測することができます。
グラフにサービスイメージを含める
このステップでは、生成されるグラフにサービスイメージを含める方法を学びます。デフォルトでは、基本的なグラフはサービス名のみを表示します。イメージ名を含めることで、各サービスが何を表しているかについてより多くのコンテキストを提供します。
前のステップで作成したdocker-compose.ymlファイルを引き続き使用します。
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
app:
image: ubuntu:latest
command: sleep infinity
グラフ出力にサービスイメージを含めるには、docker-compose config --graphコマンドに--imagesフラグを追加する必要があります。
docker-compose config --graph --images
このコマンドを実行すると、DOT グラフ出力が生成されますが、今回はサービスを表すノードにイメージ名も含まれます。出力は前のステップと似ていますが、ノード定義内に追加情報が含まれます。
例えば、出力は次のようになるかもしれません:
digraph {
compound=true
"web" [label="web\nnginx:latest"]
"app" [label="app\nubuntu:latest"]
"web" -> "app" [label="depends_on"]
}
各ノードのlabel属性には、サービス名とイメージ名が改行文字 (\n) で区切られて含まれていることに注目してください。これにより、各サービスにどの Docker イメージが使用されているかが一目でわかるようになり、グラフの情報量が増えます。
これは Docker Compose のグラフ可視化に詳細を追加する簡単な方法であり、アプリケーションの構成要素を一目で理解するのに役立ちます。
グラフにサービスネットワークを含める
このステップでは、生成されるグラフにサービスが接続されているネットワークを含める方法を学びます。ネットワークトポロジーを理解することは、コンテナ間の通信フローをデバッグしたり可視化したりする上で重要です。
docker-compose.ymlファイルを修正して、ネットワークを明示的に定義し、サービスをそれに接続します。
プロジェクトディレクトリにあるdocker-compose.ymlファイルを開きます:
nano ~/project/docker-compose.yml
ネットワーク定義を追加し、サービスをこのネットワークに接続するように内容を修正します:
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
networks:
- my_network
app:
image: ubuntu:latest
command: sleep infinity
networks:
- my_network
networks:
my_network:
driver: bridge
この更新されたdocker-compose.ymlでは、トップレベルにnetworksセクションを追加してbridgeドライバを使用するmy_networkというネットワークを定義しました。また、各サービス(webとapp)の下にnetworksキーを追加し、それらがmy_networkに接続されるべきことを指定しました。
ネットワーク情報をグラフ出力に含めるには、--graphフラグと共に--networksフラグを使用します。
docker-compose config --graph --networks
このコマンドを実行すると、ネットワークを表すノードと、それに接続されているサービスを示すエッジを含む DOT グラフ出力が生成されます。出力は以前よりも複雑になり、ネットワーク接続が示されます。
サービス(webとapp)のノードとネットワーク(my_network)のノードが表示されます。サービスをネットワークに接続するエッジがあり、それらがそのネットワークのメンバーであることを示します。この可視化により、サービスがネットワークレベルでどのように分離または接続されているかを確認できます。
グラフにサービスポートを含める
このステップでは、生成されるグラフにサービスの公開ポートと公開済みポートを含める方法を学びます。ポートを可視化することで、Docker ネットワーク外部や他のサービスからどのようにアクセス可能かを理解するのに役立ちます。
前のステップで使用したdocker-compose.ymlファイルを引き続き使用します。
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
networks:
- my_network
app:
image: ubuntu:latest
command: sleep infinity
networks:
- my_network
networks:
my_network:
driver: bridge
グラフ出力にサービスポートを含めるには、--graphフラグと共に--portsフラグを使用します。複数のフラグを組み合わせて、グラフに異なる種類の情報を含めることができます。イメージ、ネットワーク、ポートをグラフに含めてみましょう。
docker-compose config --graph --images --networks --ports
このコマンドを実行すると、各サービスのポート情報を含む DOT グラフ出力が生成されます。出力はさらに詳細になり、サービス名、イメージ名、ネットワーク接続、ポートマッピングが表示されます。
webサービスでは、ノード定義にポートマッピング80:80が含まれます。これはホストのポート 80 がwebコンテナ内のポート 80 にマッピングされていることを示します。
webサービスのノードの DOT 出力は次のようになります:
"web" [label="web\nnginx:latest\n80:80"]
グラフにポートを含めることで、サービスがどのように公開されているか、外部トラフィックや他のコンテナからのトラフィックがどのように到達できるかがより明確になります。これは接続問題のデバッグやサービスの外部インターフェースを理解するのに特に有用です。
出力グラフのインデントをカスタマイズ
このステップでは、生成される DOT グラフ出力のインデントをカスタマイズする方法を学びます。デフォルトのインデントは通常問題ありませんが、可読性を向上させたり、出力をさらに処理する場合に特定のフォーマット標準に準拠させたりするために調整したい場合があります。
前のステップで使用したdocker-compose.ymlファイルを引き続き使用します。
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
networks:
- my_network
app:
image: ubuntu:latest
command: sleep infinity
networks:
- my_network
networks:
my_network:
driver: bridge
グラフ出力のインデントをカスタマイズするには、--indentフラグの後にインデントに使用したいスペースの数を指定します。イメージ、ネットワーク、ポートを含むグラフを生成し、インデントを 4 スペースに設定してみましょう。
docker-compose config --graph --images --networks --ports --indent 4
このコマンドを実行すると、前のステップと同じグラフ内容が生成されますが、DOT 出力の行は 4 スペースでインデントされます。このコマンドの出力と前のステップの出力を比較して、インデントの違いを確認してください。
例えば、4 スペースのインデントを適用した出力の一部は次のようになります:
digraph {
compound=true
"web" [label="web\nnginx:latest\n80:80"]
"app" [label="app\nubuntu:latest"]
"my_network" [label="my_network"]
"web" -> "my_network" [label="network"]
"app" -> "my_network" [label="network"]
"web" -> "app" [label="depends_on"]
}
異なるインデント値を試して、出力フォーマットにどのような影響を与えるかを確認できます。このオプションは主に美的な目的や、DOT ファイルに特定のインデントスタイルを要求するツールのために用意されています。
まとめ
この実験では、docker-compose config --graphコマンドを使用して Docker Compose ファイルを可視化する方法を学びました。まず Docker Compose をインストールし、2 つのサービスを含む基本的なdocker-compose.ymlファイルを作成しました。その後、このファイルの基本的なグラフ表現を DOT 形式で生成し、サービスとそれらの関係を視覚的に表現しました。
基本的な可視化に加えて、グラフに追加の詳細情報を含める方法を探求しました。これにはサービスのイメージ、ネットワーク、ポートを視覚的出力に組み込むことが含まれ、Compose ファイルの設定をより包括的に把握できるようになりました。最後に、可読性を向上させるために出力グラフのインデントをカスタマイズする方法を学びました。



