Skip to main content

Docker ネットワーキング完全解説: bridge/host/overlay の使い分け

Docker コンテナのネットワーキングは、コンテナ間通信、ホストとの通信、外部ネットワークとの接続を制御する中核的な仕組みです。bridge・host・overlay という 3 つの主要ネットワークドライバーはそれぞれ異なる特性を持ち、ユースケースに応じた適切な選択がアプリケーションのパフォーマンスとセキュリティを左右します。

Kubo では、Kubernetes 上でのコンテナネットワーキングを提供していますが、Docker レベルのネットワーク理解は Kubernetes ネットワーキングの土台となります。本記事では、各ネットワークモードの仕組みから実践的な使い分けまで、深く掘り下げて解説します。

Docker ネットワークの基本アーキテクチャ

Docker のネットワーキングは libnetwork ライブラリを通じて実装され、プラガブルなドライバーモデルを採用しています。Docker 公式ドキュメントでは、5 つのネットワークドライバーが紹介されています。

ドライバースコープ分離性パフォーマンス主な用途
bridge単一ホストデフォルト、一般的なコンテナ間通信
host単一ホストなし最高高パフォーマンスが必要な場面
overlayマルチホスト中〜低Docker Swarm / クラスタ間通信
macvlan単一ホスト物理ネットワーク直接接続
none-完全分離-セキュリティ重視のコンテナ
bash
# 利用可能なネットワークの一覧
docker network ls

# ネットワークの詳細情報
docker network inspect bridge

Captain.AI は、アプリケーションの要件を分析し、最適なネットワーク構成を自動提案します。

Bridge ネットワーク: デフォルトの選択

Bridge は Docker のデフォルトネットワークドライバーで、単一ホスト上のコンテナ間通信に最も広く使用されています。

仕組み

Docker は docker0 という仮想ブリッジインターフェースを作成し、コンテナはこのブリッジを通じて通信します。各コンテナは 172.17.0.0/16 サブネットからプライベート IP アドレスが割り当てられます。

bash
# デフォルト bridge ネットワークでコンテナを起動
docker run -d --name web nginx
docker run -d --name api node:20-alpine

# IP アドレスの確認
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web

ユーザー定義 Bridge ネットワーク

デフォルトの bridge ではなく、ユーザー定義 bridge ネットワークの使用が強く推奨されます。

bash
# ユーザー定義ネットワークの作成
docker network create --driver bridge myapp-network

# ネットワークに接続してコンテナを起動
docker run -d --name web --network myapp-network nginx
docker run -d --name api --network myapp-network node:20-alpine

ユーザー定義 bridge の利点:

  • dns によるサービスディスカバリ: コンテナ名で通信可能(http:--api:3000
  • 自動 DNS 解決: デフォルト bridge では IP アドレスでの通信が必要
  • ネットワーク分離: 異なるネットワークのコンテナ間通信を遮断
  • 動的接続・切断: 実行中のコンテナのネットワーク変更が可能

DEV Community の Docker ネットワーク解説では、ユーザー定義 bridge をすべてのプロジェクトの標準として推奨しています。

Docker Compose での Bridge ネットワーク

yaml
services:
  web:
    image: nginx
    networks:
      - frontend
  api:
    image: node:20-alpine
    networks:
      - frontend
      - backend
  db:
    image: postgres:16
    networks:
      - backend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true  # 外部アクセスを遮断

internal: true を設定すると、そのネットワーク内のコンテナは外部ネットワーク(インターネット)にアクセスできなくなります。データベースのような内部サービスに有効です。

Host ネットワーク: 最大パフォーマンス

Host モードでは、コンテナはホストマシンのネットワーク名前空間を直接共有します。コンテナ独自の IP アドレスは割り当てられず、ホストのネットワークインターフェースとポートを直接使用します。

bash
# Host ネットワークでコンテナを起動
docker run -d --network host nginx

# ホストの 80 番ポートに直接バインドされる
curl http://localhost:80

パフォーマンス特性

BetterLink のベンチマーク記事によると、Host ネットワークは以下のパフォーマンスを達成します:

メトリクスBridgeHost
スループット~20 Gbps~40 Gbps
レイテンシ~50μs~0μs
CPU オーバーヘッド最小

Host モードの適切な用途

  • 高頻度ネットワーク i-o: リアルタイム処理、ストリーミング
  • モニタリングツール: Prometheus Node Exporter など
  • ネットワークパフォーマンステスト: iperf3 など
  • レガシーアプリケーション: 特定ポートへの直接バインドが必要なもの

制約と注意点

bash
# Host モードではポートマッピングは無効(-p フラグは無視される)
docker run --network host -p 8080:80 nginx  # -p は無視される
  • ポート競合: 複数コンテナが同じポートを使用できない
  • 分離性なし: コンテナがホストの全ネットワークにアクセス可能
  • セキュリティリスク: ネットワーク分離がないため攻撃対象領域が拡大
  • Linux のみ: macOS・Windows の Docker Desktop では動作が異なる

Kubo の Kubernetes 環境では、hostNetwork: true の使用は特別な理由がない限り非推奨としています。

Overlay ネットワーク: マルチホスト通信

Overlay ネットワークは、複数の Docker ホスト間でコンテナが通信するための分散ネットワークです。Docker Swarm モードで主に使用されます。

VXLAN による実装

Overlay ネットワークは VXLAN(Virtual Extensible LAN) 技術を使用して実装されています。VXLAN はコンテナの Layer 2 フレームをホスト間の IP/UDP パケットにカプセル化し、物理ネットワークの上に仮想的なオーバーレイネットワークを構築します。

bash
# Docker Swarm の初期化
docker swarm init

# Overlay ネットワークの作成
docker network create --driver overlay --attachable myapp-overlay

# 暗号化を有効化(IPsec)
docker network create --driver overlay --opt encrypted myapp-secure

必要なポート

Docker 公式の Swarm ネットワーク解説によると、Overlay ネットワークには以下のポートが必要です:

ポートプロトコル用途
2377TCPSwarm クラスタ管理
7946TCP/UDPコンテナネットワークディスカバリ
4789UDPVXLAN データパス

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

Docker Swarm はサービスに**仮想 IP(VIP)**を自動的に割り当て、DNS エントリを登録します。他のサービスはハードコードされた IP アドレスなしで名前で参照できます。

bash
# Swarm サービスの作成
docker service create --name web --network myapp-overlay \
  --replicas 3 nginx

docker service create --name api --network myapp-overlay \
  --replicas 2 myapp:latest

# api サービスから web サービスへのアクセス
# curl http://web:80 (VIP による自動ロードバランス)

DNS ラウンドロビン(DNSRR)

VIP ベースのロードバランシングに加え、DNS ラウンドロビンモードも選択できます:

bash
docker service create --name web \
  --endpoint-mode dnsrr \
  --network myapp-overlay \
  nginx

DNSRR モードでは、DNS クエリがサービスの全レプリカの IP アドレスリストを返し、クライアントが直接接続先を選択します。Reintech の Docker Swarm 解説に詳細があります。

ネットワークモードの選択ガイド

ユースケース別推奨

シナリオ推奨ドライバー理由
Web アプリ + DBBridge(ユーザー定義)分離性と DNS ディスカバリ
マイクロサービス(単一ホスト)Bridge(ユーザー定義)サービス間分離
マイクロサービス(マルチホスト)Overlayクラスタ間通信
高性能ネットワーク処理HostNAT オーバーヘッドなし
IoT / 物理ネットワーク統合Macvlan物理 NIC 直接接続
セキュリティ重視のバッチ処理None完全なネットワーク分離

セキュリティのベストプラクティス

yaml
# Docker Compose でのネットワーク分離例
services:
  web:
    networks:
      - frontend
  api:
    networks:
      - frontend
      - backend
  db:
    networks:
      - backend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true
    ipam:
      config:
        - subnet: 172.28.0.0-24

env.dev の Docker ネットワーキングガイドでは、本番環境でのネットワークセグメンテーションの重要性が強調されています。

Kubernetes との関係

Docker のネットワーキングモデルは Kubernetes の CNI(Container Network Interface)の基盤です:

DockerKubernetes
Bridge ネットワークPod ネットワーク(CNI プラグイン)
Service(DNS)Kubernetes Service
ポートマッピングNodePort / LoadBalancer
OverlayPod 間通信(Flannel, Calico 等)
NetworkPolicy なしNetworkPolicy でトラフィック制御

moldstud の包括的ガイドでは、Docker から Kubernetes へのネットワーキング移行についても詳しく解説されています。

まとめ: 適材適所のネットワーク設計

Docker ネットワーキングの 3 つの主要ドライバーを理解し、適切に使い分けることが、コンテナアプリケーションのパフォーマンスとセキュリティの両立に不可欠です。

  • Bridge: ほとんどのユースケースの第一選択。ユーザー定義ネットワークを常に使用
  • Host: パフォーマンスが最優先で、分離性を犠牲にできる場合のみ
  • Overlay: マルチホスト環境での Docker Swarm サービス間通信

Kubo は、Docker レベルのネットワーク知識を土台に、Kubernetes の高度なネットワーキング機能(Service Mesh、NetworkPolicy、Ingress)を提供するコンテナ基盤です。Captain.AI と組み合わせることで、ネットワーク設計から運用監視までを AI が支援します。

Docker ネットワーキングや Kubernetes ネットワーク設計のご相談は、お問い合わせよりお気軽にどうぞ。

← Back to all posts