ネットワークエイリアスとサービスディスカバリ
Docker ネットワークは、ネットワークエイリアスを使用したサービスディスカバリ(サービス検出)をサポートしています。これは、回復力(レジリエンス)が高くスケーラブルなアプリケーションを作成する際に役立ちます。この機能により、複数のコンテナが同じ DNS 名に応答できるようになり、基本的なロードバランシングが可能になります。
- この演習用に新しいブリッジネットワークを作成します。
docker network create service-network
- ネットワークの作成を確認します。
docker network ls
リストに service-network が表示されているはずです。
- 同じネットワークエイリアスを持つ 2 つのコンテナを作成します。
docker run -d --network service-network --network-alias myservice --name service1 nginx
docker run -d --network service-network --network-alias myservice --name service2 nginx
- クライアントコンテナを作成し、
nslookup を使用してサービスを解決します。
docker run --rm --network service-network appropriate/curl nslookup myservice
両方のコンテナの IP アドレスが返されるはずです。これは、Docker の組み込み DNS サーバーが 2 つのコンテナ間でロードバランシングを行っていることを示しています。
- サービスへのアクセスを複数回テストします。
for i in {1..4}; do docker run --rm --network service-network appropriate/curl ping -c 1 myservice; done
両方のコンテナから応答があるはずで、基本的なロードバランシングが行われていることがわかります。Docker DNS サーバーは、myservice を解決する際に 2 つの IP アドレスを交互に返します。
PING myservice (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.106 ms
--- myservice ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.106/0.106/0.106 ms
PING myservice (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.119 ms
--- myservice ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.119/0.119/0.119 ms
PING myservice (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.097 ms
--- myservice ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.097/0.097/0.097 ms
PING myservice (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.140 ms
--- myservice ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.140/0.140/0.140 ms