Docker ネットワークの検査方法

DockerBeginner
オンラインで実践に進む

はじめに

Docker は、アプリケーションの開発、デプロイ、管理方法を革新した強力なコンテナ化プラットフォームです。Docker エコシステムの中核をなすのがネットワークであり、コンテナと外部世界とのシームレスな通信を可能にします。このチュートリアルでは、Docker ネットワークの世界に深く踏み込み、ネットワーク関連の問題を検査およびトラブルシューティングする方法を探り、コンテナ化されたアプリケーションが円滑に動作することを保証します。

Docker ネットワークの概要

Docker は、開発者がアプリケーションを一貫性があり隔離された環境でパッケージ化およびデプロイできるようにする、人気のコンテナ化プラットフォームです。Docker の重要なコンポーネントの 1 つは、コンテナとホストシステム間の通信を可能にするネットワーク機能です。

Docker ネットワークについて

Docker は、コンテナを接続するためにさまざまな種類のネットワークを提供します。

  1. ブリッジネットワーク: Docker によって作成されるデフォルトのネットワークで、コンテナ同士およびホストシステムとの通信を可能にします。
  2. ホストネットワーク: コンテナは、Docker ネットワークをバイパスして、ホストのネットワークインターフェースに直接アクセスできます。
  3. オーバーレイネットワーク: 異なる Docker ホスト上で実行されているコンテナが互いに通信できるようにするマルチホストネットワークです。
  4. Macvlan ネットワーク: コンテナに MAC アドレスを割り当てることができ、ネットワーク上の物理デバイスとして表示されます。

各ネットワークタイプには、独自のユースケースと設定要件があります。これらのネットワークタイプを理解することは、Docker 環境を効果的に管理およびトラブルシューティングするために不可欠です。

ネットワークネームスペースとインターフェース

Docker は、各コンテナのネットワークスタックを隔離するためにネットワークネームスペースを使用します。これは、各コンテナが独自のネットワークインターフェース、IP アドレス、ルーティングテーブルを持ち、ホストシステムや他のコンテナとは独立していることを意味します。

コンテナ内のネットワークインターフェースと設定を検査するには、次のコマンドを使用できます。

docker exec -it addr < container_name > ip

このコマンドは、指定されたコンテナに関連付けられたネットワークインターフェースと IP アドレスを表示します。

ポートの公開とコンテナのマッピング

コンテナ内部で実行されているサービスに外部からアクセスできるようにするには、ポートを公開し、ホストシステムにマッピングできます。これは、コンテナの実行時に -p または --publish フラグを使用して行われます。

docker run -p 8080:80 -d nginx

上記の例では、コンテナのポート 80 がホストのポート 8080 にマッピングされ、外部クライアントはコンテナ内部で実行されている Nginx Web サーバーにアクセスできるようになります。

DNS とサービスディスカバリ

Docker は、コンテナが同じネットワーク内の他のコンテナの名前を解決できるように、組み込みの DNS サーバーを提供します。これにより、サービスの発見とコンテナ間の通信が簡素化されます。

同じネットワーク内の他のコンテナにアクセスするには、コンテナ名または Docker Compose ファイルで定義されたサービス名を使用できます。

## コンテナ名を指定してアクセス
docker exec -it http://other-container < container_name > curl

Docker ネットワークの基本的な概念を理解することは、Docker ベースのアプリケーションを効果的に管理およびトラブルシューティングするために不可欠です。

Docker ネットワークの詳細の検査

Docker ネットワークの基本的な理解を得たら、ネットワーク設定の詳細を検査して問題をトラブルシューティングしたり、ネットワークのトポロジーを理解したりできます。

Docker ネットワークのリスト表示

Docker によって作成されたすべてのネットワークをリスト表示するには、次のコマンドを使用します。

docker network ls

これにより、各ネットワークのネットワーク名、ドライバ、スコープを含む表が表示されます。

ネットワークの詳細の検査

特定のネットワークの詳細な情報を取得するには、docker network inspect コマンドを使用します。

docker network inspect bridge

これにより、サブネット、ゲートウェイ、ネットワークに接続されているコンテナなどのネットワークに関する情報を含む JSON オブジェクトが出力されます。

ネットワークインターフェースの表示

コンテナに関連付けられたネットワークインターフェースを表示するには、docker exec コマンドを使用してコンテナ内で ip addr コマンドを実行できます。

docker exec -it addr < container_name > ip

これにより、コンテナに割り当てられたネットワークインターフェースと IP アドレスが表示されます。

ネットワークトラフィックの監視

コンテナへのおよびからのネットワークトラフィックを監視するには、tcpdumpWireshark などのツールを使用できます。最初に、コンテナをホストのネットワークネームスペースに接続する必要があります。

docker run -it --network host --name mycontainer ubuntu

次に、ホストシステムで tcpdump を実行してネットワークトラフィックをキャプチャできます。

tcpdump -i < host_interface > -n

これにより、コンテナへのおよびからのネットワークトラフィックを分析できます。

ネットワークトポロジーの視覚化

Docker 環境のネットワークトポロジーを視覚化するには、PortainerWeave Scope などのツールを使用できます。これらのツールは、コンテナ、ネットワーク、ホスト間の関係を表示するためのグラフィカルインターフェースを提供します。

graph TD A[Docker ホスト] --> B[ブリッジネットワーク] B --> C[コンテナ 1] B --> D[コンテナ 2] B --> E[コンテナ 3]

Docker ネットワークの詳細を理解し検査することで、コンテナ化されたアプリケーションを効果的に管理およびトラブルシューティングできます。

ネットワーク問題のトラブルシューティング

Docker ネットワークを十分に理解している場合でも、コンテナ化されたアプリケーションの開発やデプロイ中にさまざまなネットワーク関連の問題が発生する可能性があります。このセクションでは、一般的なネットワーク問題とそのトラブルシューティング方法について説明します。

接続問題

最も一般的なネットワーク問題の 1 つは、コンテナ間の接続問題、またはコンテナとホストシステム間の接続問題です。これらの問題をトラブルシューティングするには、以下の手順に従います。

  1. ネットワーク設定の確認:コンテナが正しいネットワークに接続されていること、およびネットワーク設定が正しいことを確認します。
  2. ネットワークインターフェースの検査:docker exec コマンドを使用して、コンテナ内のネットワークインターフェースと IP アドレスを確認します。
  3. 接続性のテスト:ping または curl コマンドを使用して、コンテナ間またはコンテナとホストシステム間の接続性をテストします。
## コンテナ間の接続性をテスト
docker exec -it container1 ping container2

## コンテナとホスト間の接続性をテスト
docker exec -it container1 ping host.docker.internal

DNS 解決問題

コンテナが他のコンテナやサービスの名前を解決できない場合、DNS 関連の問題である可能性があります。この問題をトラブルシューティングするには、以下の手順に従います。

  1. DNS 設定の確認:コンテナが正しい DNS サーバーを使用していること、および DNS サーバーが正常に機能していることを確認します。
  2. コンテナの DNS 設定の検査:docker exec コマンドを使用して、コンテナ内の DNS 設定を確認します。
  3. DNS 解決のテスト:dig または nslookup コマンドを使用して、コンテナ内の DNS 解決をテストします。
## コンテナの DNS 設定の確認
docker exec -it container1 cat /etc/resolv.conf

## DNS 解決のテスト
docker exec -it container1 dig container2

ネットワークパフォーマンス問題

ネットワークパフォーマンスが遅い、またはレイテンシが高い場合は、iperf などのツールを使用して、コンテナ間またはコンテナとホストシステム間のネットワーク帯域幅とレイテンシを測定できます。

## コンテナ間のネットワーク帯域幅を測定
docker run -it --rm appropriate/iperf3 -c container2

## コンテナとホスト間のネットワークレイテンシを測定
docker run -it --rm appropriate/iperf3 -c host.docker.internal -t 10 -i 1

これらのトラブルシューティング手順と適切なツールを使用することで、Docker 環境におけるネットワーク関連の問題を効果的に特定および解決できます。

まとめ

このチュートリアルを終了するまでに、Docker ネットワークの検査方法、ネットワーク関連の問題の特定と解決方法、そして最大のパフォーマンスと信頼性のために Docker ネットワーク設定を最適化する方法をしっかりと理解しているはずです。習得した知識を用いて、Docker ベースのインフラストラクチャを効果的に管理および維持し、アプリケーションが常に意図したとおりに接続され機能していることを確認できます。