同じカスタムネットワーク上のコンテナ間の通信をテストする方法

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

はじめに

Docker は、コンテナ化された環境でアプリケーションを構築、デプロイ、実行するための強力なプラットフォームです。Docker コンテナ間の通信を管理およびテストする方法を理解することは、堅牢でスケーラブルなアプリケーションを構築するために不可欠です。このチュートリアルでは、カスタム Docker ネットワークを作成し、同じネットワーク上のコンテナ間の通信をテストする手順を案内します。

Docker ネットワークの理解

Docker は、コンテナ同士や外部世界と通信するための組み込みのネットワークシステムを提供しています。Docker は、ブリッジネットワーク、ホストネットワーク、オーバーレイネットワーク、カスタムネットワークなど、いくつかの種類のネットワークをサポートしています。

ブリッジネットワーク

Docker のデフォルトのネットワークタイプはブリッジネットワークです。新しいコンテナを起動すると、別のネットワークを指定しない限り、自動的にデフォルトのブリッジネットワークに接続されます。同じブリッジネットワーク上のコンテナは、コンテナ名または IP アドレスを使用して互いに通信できます。

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

ホストネットワーク

ホストネットワークでは、コンテナが Docker ネットワークをバイパスして、ホストのネットワークスタックを直接使用できます。これは、パフォーマンス重視のアプリケーションや、ホスト固有のネットワークリソースにアクセスする必要がある場合に便利です。

オーバーレイネットワーク

オーバーレイネットワークは、複数の Docker デーモンを接続し、Swarm サービスが互いに通信できるようにするために使用されます。オーバーレイネットワークは、通常、Docker Swarm 環境で使用されます。

カスタムネットワーク

デフォルトのネットワークに加えて、独自のネットワークを作成することもできます。カスタムネットワークを使用すると、コンテナを相互に隔離し、それらの通信方法を制御できます。これは、より複雑なマルチティアアプリケーションを構築する場合に便利です。

graph LR
  A[ホスト] -- カスタムネットワーク --> B[コンテナ 1]
  A[ホスト] -- カスタムネットワーク --> C[コンテナ 2]
  B[コンテナ 1] -- カスタムネットワーク --> C[コンテナ 2]

Docker のネットワーク機能を理解することは、コンテナ化されたアプリケーションの構築と管理に不可欠です。次のセクションでは、カスタムネットワークを作成し、そのネットワーク上のコンテナ間の通信をテストする方法を説明します。

カスタムネットワークの作成

Docker でカスタムネットワークを作成するには、docker network create コマンドを使用します。このコマンドでは、ネットワークドライバ、サブネット、その他の構成オプションを指定できます。

カスタムブリッジネットワークの作成

my-network という名前のカスタムブリッジネットワークを作成してみましょう。

docker network create my-network

docker network ls コマンドを使用して、ネットワークの作成を確認できます。

NETWORK ID     NAME         DRIVER    SCOPE
a1b2c3d4e5f6   my-network   bridge    local

コンテナをカスタムネットワークに接続する

次に、2 つのコンテナを起動し、my-network カスタムネットワークに接続してみましょう。

## コンテナ 1 を起動
docker run -d --name container1 --network my-network ubuntu:22.04 sleep infinity

## コンテナ 2 を起動
docker run -d --name container2 --network my-network ubuntu:22.04 sleep infinity

docker network inspect コマンドを使用して、ネットワークと接続されたコンテナを調べることができます。

[
  {
    "Name": "my-network",
    "Id": "a1b2c3d4e5f6",
    "Created": "2023-04-18T12:34:56.789Z",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
      "Driver": "default",
      "Options": {},
      "Config": [
        {
          "Subnet": "172.18.0.0/16"
        }
      ]
    },
    "Internal": false,
    "Attachable": false,
    "Ingress": false,
    "ConfigFrom": {
      "Network": ""
    },
    "ConfigOnly": false,
    "Containers": {
      "container1_id": {
        "Name": "container1",
        "EndpointID": "container1_endpoint_id",
        "MacAddress": "02:42:ac:12:00:02",
        "IPv4Address": "172.18.0.2/16",
        "IPv6Address": ""
      },
      "container2_id": {
        "Name": "container2",
        "EndpointID": "container2_endpoint_id",
        "MacAddress": "02:42:ac:12:00:03",
        "IPv4Address": "172.18.0.3/16",
        "IPv6Address": ""
      }
    },
    "Options": {},
    "Labels": {}
  }
]

カスタムネットワークを作成し、コンテナを接続したら、次のセクションでコンテナ間の通信をテストします。

コンテナ間の通信のテスト

カスタムネットワークを作成し、コンテナを接続したら、コンテナ間の通信をテストできます。

コンテナ間の ping

まず、一方のコンテナからもう一方のコンテナに ping を実行してみましょう。

## 最初のコンテナに入ります
docker exec -it container1 bash

## コンテナ名で2番目のコンテナに ping を実行します
ping -c 4 container2

出力は、コンテナがコンテナ名を使用して互いに通信できることを示すはずです。

PING container2 (172.18.0.3) 56(84) bytes of data.
64 bytes from container2.my-network (172.18.0.3): icmp_seq=1 ttl=64 time=0.065 ms
64 bytes from container2.my-network (172.18.0.3): icmp_seq=2 ttl=64 time=0.057 ms
64 bytes from container2.my-network (172.18.0.3): icmp_seq=3 ttl=64 time=0.057 ms
64 bytes from container2.my-network (172.18.0.3): icmp_seq=4 ttl=64 time=0.057 ms

--- container2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3ms
rtt min/avg/max/mdev = 0.057/0.059/0.065/0.003 ms

TCP 通信のテスト

コンテナ間の TCP 通信もテストできます。たとえば、一方のコンテナでシンプルな HTTP サーバーを実行し、もう一方のコンテナからアクセスできます。

## コンテナ1でシンプルなHTTPサーバーを起動
docker exec -it container1 bash
python3 -m http.server 8000

## 別のターミナルで、コンテナ2からHTTPサーバーにアクセス
docker exec -it container2 bash
curl http://container1:8000

2 番目のターミナルの出力は、最初のコンテナで実行されている HTTP サーバーの内容を表示するはずです。

同じカスタムネットワーク上のコンテナ間の通信をテストすることで、コンテナ化されたアプリケーションのコンポーネントが互いに適切に連携できることを確認できます。これは、複雑で複数のサービスを持つアプリケーションを構築およびデプロイするために不可欠です。

まとめ

この Docker チュートリアルでは、カスタムネットワークを作成し、そのネットワーク上でコンテナを起動し、コンテナ間の通信を確認する方法を学習します。このガイドの終わりまでに、Docker コンテナ間の接続性をテストし、アプリケーションが同じカスタムネットワーク内でシームレスに相互作用できる知識とスキルを習得します。