Overlayネットワークでマルチホスト通信を実現する【Docker実践】

1. はじめに

Dockerを活用してコンテナを複数のサーバーに展開する場合、**「異なるホスト間での通信」**が課題になります。
通常のbridgeネットワークでは、同一ホスト内でしかコンテナ通信ができません。

この問題を解決するのがOverlayネットワークです。
Overlayネットワークを利用すれば、複数ホスト上のコンテナが同一ネットワーク空間で通信可能になります。

この記事では、その仕組みと実際の構築手順をハンズオン形式で解説します。


2. Overlayネットワークとは?

Overlayネットワークは、VXLAN (Virtual Extensible LAN) という技術を用いて
複数のDockerホストを仮想的に1つのネットワークで結ぶ仕組みです。

各コンテナ間の通信は、ホスト間でカプセル化されて転送されるため、
物理ネットワーク構成を気にせず、シームレスに通信できます。

主な特徴:

  • ホストを跨いだコンテナ通信が可能
  • Docker Swarmモードと統合されている
  • ネットワークの暗号化が可能 (--opt encrypted)
  • コンテナDNSによる自動名前解決に対応

3. 環境構成

今回の検証環境は以下の通りです。

ホスト名役割IPアドレス
manager1Swarmマネージャー192.168.56.10
worker1Swarmワーカー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ネットワークで通信ができない場合、以下を確認します。

  1. UDPポート4789 (VXLAN) がファイアウォールで開放されているか
  2. Swarmクラスタが正常か docker node ls
  3. ネットワークの構成を確認 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など)

投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です