Docker コンテナのネットワーキングは、コンテナ間通信、ホストとの通信、外部ネットワークとの接続を制御する中核的な仕組みです。bridge・host・overlay という 3 つの主要ネットワークドライバーはそれぞれ異なる特性を持ち、ユースケースに応じた適切な選択がアプリケーションのパフォーマンスとセキュリティを左右します。
Kubo では、Kubernetes 上でのコンテナネットワーキングを提供していますが、Docker レベルのネットワーク理解は Kubernetes ネットワーキングの土台となります。本記事では、各ネットワークモードの仕組みから実践的な使い分けまで、深く掘り下げて解説します。
Docker ネットワークの基本アーキテクチャ
Docker のネットワーキングは libnetwork ライブラリを通じて実装され、プラガブルなドライバーモデルを採用しています。Docker 公式ドキュメントでは、5 つのネットワークドライバーが紹介されています。
| ドライバー | スコープ | 分離性 | パフォーマンス | 主な用途 |
|---|---|---|---|---|
| bridge | 単一ホスト | 高 | 中 | デフォルト、一般的なコンテナ間通信 |
| host | 単一ホスト | なし | 最高 | 高パフォーマンスが必要な場面 |
| overlay | マルチホスト | 高 | 中〜低 | Docker Swarm / クラスタ間通信 |
| macvlan | 単一ホスト | 高 | 高 | 物理ネットワーク直接接続 |
| none | - | 完全分離 | - | セキュリティ重視のコンテナ |
# 利用可能なネットワークの一覧
docker network ls
# ネットワークの詳細情報
docker network inspect bridge
Captain.AI は、アプリケーションの要件を分析し、最適なネットワーク構成を自動提案します。
Bridge ネットワーク: デフォルトの選択
Bridge は Docker のデフォルトネットワークドライバーで、単一ホスト上のコンテナ間通信に最も広く使用されています。
仕組み
Docker は docker0 という仮想ブリッジインターフェースを作成し、コンテナはこのブリッジを通じて通信します。各コンテナは 172.17.0.0/16 サブネットからプライベート IP アドレスが割り当てられます。
# デフォルト 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 ネットワークの使用が強く推奨されます。
# ユーザー定義ネットワークの作成
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 ネットワーク
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 アドレスは割り当てられず、ホストのネットワークインターフェースとポートを直接使用します。
# Host ネットワークでコンテナを起動
docker run -d --network host nginx
# ホストの 80 番ポートに直接バインドされる
curl http://localhost:80
パフォーマンス特性
BetterLink のベンチマーク記事によると、Host ネットワークは以下のパフォーマンスを達成します:
| メトリクス | Bridge | Host |
|---|---|---|
| スループット | ~20 Gbps | ~40 Gbps |
| レイテンシ | ~50μs | ~0μs |
| CPU オーバーヘッド | 中 | 最小 |
Host モードの適切な用途
- 高頻度ネットワーク i-o: リアルタイム処理、ストリーミング
- モニタリングツール: Prometheus Node Exporter など
- ネットワークパフォーマンステスト: iperf3 など
- レガシーアプリケーション: 特定ポートへの直接バインドが必要なもの
制約と注意点
# 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 パケットにカプセル化し、物理ネットワークの上に仮想的なオーバーレイネットワークを構築します。
# 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 ネットワークには以下のポートが必要です:
| ポート | プロトコル | 用途 |
|---|---|---|
| 2377 | TCP | Swarm クラスタ管理 |
| 7946 | TCP/UDP | コンテナネットワークディスカバリ |
| 4789 | UDP | VXLAN データパス |
サービスディスカバリと DNS
Docker Swarm はサービスに**仮想 IP(VIP)**を自動的に割り当て、DNS エントリを登録します。他のサービスはハードコードされた IP アドレスなしで名前で参照できます。
# 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 ラウンドロビンモードも選択できます:
docker service create --name web \
--endpoint-mode dnsrr \
--network myapp-overlay \
nginx
DNSRR モードでは、DNS クエリがサービスの全レプリカの IP アドレスリストを返し、クライアントが直接接続先を選択します。Reintech の Docker Swarm 解説に詳細があります。
ネットワークモードの選択ガイド
ユースケース別推奨
| シナリオ | 推奨ドライバー | 理由 |
|---|---|---|
| Web アプリ + DB | Bridge(ユーザー定義) | 分離性と DNS ディスカバリ |
| マイクロサービス(単一ホスト) | Bridge(ユーザー定義) | サービス間分離 |
| マイクロサービス(マルチホスト) | Overlay | クラスタ間通信 |
| 高性能ネットワーク処理 | Host | NAT オーバーヘッドなし |
| IoT / 物理ネットワーク統合 | Macvlan | 物理 NIC 直接接続 |
| セキュリティ重視のバッチ処理 | None | 完全なネットワーク分離 |
セキュリティのベストプラクティス
# 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)の基盤です:
| Docker | Kubernetes |
|---|---|
| Bridge ネットワーク | Pod ネットワーク(CNI プラグイン) |
| Service(DNS) | Kubernetes Service |
| ポートマッピング | NodePort / LoadBalancer |
| Overlay | Pod 間通信(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 ネットワーク設計のご相談は、お問い合わせよりお気軽にどうぞ。