1. はじめに
Dockerを活用してコンテナを複数のサーバーに展開する場合、**「異なるホスト間での通信」**が課題になります。
通常のbridge
ネットワークでは、同一ホスト内でしかコンテナ通信ができません。
この問題を解決するのがOverlayネットワークです。
Overlayネットワークを利用すれば、複数ホスト上のコンテナが同一ネットワーク空間で通信可能になります。
この記事では、その仕組みと実際の構築手順をハンズオン形式で解説します。
2. Overlayネットワークとは?
Overlayネットワークは、VXLAN (Virtual Extensible LAN) という技術を用いて
複数のDockerホストを仮想的に1つのネットワークで結ぶ仕組みです。
各コンテナ間の通信は、ホスト間でカプセル化されて転送されるため、
物理ネットワーク構成を気にせず、シームレスに通信できます。
主な特徴:
- ホストを跨いだコンテナ通信が可能
- Docker Swarmモードと統合されている
- ネットワークの暗号化が可能 (
--opt encrypted
) - コンテナDNSによる自動名前解決に対応
3. 環境構成
今回の検証環境は以下の通りです。
ホスト名 | 役割 | IPアドレス |
---|---|---|
manager1 | Swarmマネージャー | 192.168.56.10 |
worker1 | Swarmワーカー | 192.168.56.11 |
両方のノードにDockerがインストールされている前提です。
4. Swarmモードの初期化
OverlayネットワークはSwarmモードでのみ利用できます。
まず、マネージャーノードでSwarmを初期化します。
# manager1 で実行
docker swarm init --advertise-addr 192.168.56.10
実行すると、他ノードをクラスターに参加させるためのトークンが表示されます。
次に、そのトークンを使って worker1 を参加させます。
# worker1 で実行
docker swarm join --token <JOIN_TOKEN> 192.168.56.10:2377
クラスター状態を確認します。
docker node ls
Ready
状態であればクラスタ構成は完了です。
5. Overlayネットワークの作成
Swarm環境が整ったら、Overlayネットワークを作成します。
docker network create -d overlay --attachable multi_overlay_net
オプション解説:
-d overlay
… Overlayドライバを指定--attachable
… 通常のコンテナもネットワークに参加可能
作成されたネットワークは以下で確認できます。
docker network ls
6. ハンズオン:マルチホスト通信を実現してみる
(1) WebサービスとDBを異なるノードに配置する
マネージャーノード上で、Overlayネットワークに接続したサービスを起動します。
docker service create \
--name web \
--network multi_overlay_net \
-p 8080:80 \
nginx
次に、DBサービスを別ノードで動かすように配置します。
docker service create \
--name redisdb \
--network multi_overlay_net \
redis:alpine
Dockerは自動的にどのノードにどのサービスを配置するかを決定します。
(必要に応じて --constraint 'node.hostname==worker1'
で明示的に指定も可能です)
(2) コンテナ間通信の確認
web
コンテナの中からredisdb
への疎通を確認します。
# webコンテナの中に入る
docker exec -it $(docker ps -qf "name=web") sh
# redisdbにPingを送る
ping redisdb
正常にOverlayネットワークが動作していれば、
別ホストにあるredisdb
コンテナに対してもPing応答が返ります。
7. Overlayネットワークの暗号化を有効化する
セキュリティを強化したい場合、Overlayネットワークを暗号化して作成します。
docker network create -d overlay --opt encrypted secure_overlay_net
この設定を行うと、ノード間通信が自動的に暗号化されます。
特にクラウド環境でのマルチホスト構成では有効です。
8. トラブルシューティング
Overlayネットワークで通信ができない場合、以下を確認します。
- UDPポート4789 (VXLAN) がファイアウォールで開放されているか
- Swarmクラスタが正常か
docker node ls
- ネットワークの構成を確認
docker network inspect multi_overlay_net
9. OverlayネットワークをComposeで活用する
Swarmを使わず、docker-compose
でOverlayを試すことも可能です(attachable利用)。
docker-compose.yml:
version: "3.9"
services:
web:
image: nginx
networks:
- overlay_net
ports:
- "8080:80"
db:
image: redis:alpine
networks:
- overlay_net
networks:
overlay_net:
external: true
事前にネットワークを作成しておきます。
docker network create -d overlay --attachable overlay_net
そしてComposeを起動します。
docker compose up -d
異なるホスト上にコンテナを配置した場合でも、
同じOverlayネットワークで通信できることを確認できます。
10. まとめ
Overlayネットワークを活用することで、
物理的に異なるホスト間でもコンテナを一体化したシステムとして構成できます。
ポイントの整理:
- OverlayネットワークはVXLANベースの仮想ネットワーク
- Swarmモードが前提(またはattachableで手動利用可)
- ノード間通信を暗号化することも可能
- サービス間はDNS名で自動的に解決できる
この仕組みを理解しておくことで、マルチホスト構成のDocker運用がぐっと楽になります。
次のステップ
今後は以下のような発展的テーマに進めます。
- Docker Swarm Stack を用いた大規模デプロイ
- Overlayネットワークのパフォーマンス計測
- マイクロサービス間通信の監視とトレース(Jaeger, Prometheusなど)
コメントを残す