Dockerネットワーク

bridge、host、overlay

ネットワークドライバ

bridge(デフォルト)

  • • 仮想ブリッジ(docker0)を作成
  • • コンテナ間は同一ブリッジ内で通信可能
  • • 外部との通信はNAT経由
  • • 単一ホストでの使用に適している

host

  • • ホストのネットワークを直接使用
  • • ネットワーク分離なし
  • • 最高のパフォーマンス
  • • ポートマッピング不要

overlay

  • • 複数ホストにまたがるネットワーク
  • • Docker Swarm / Kubernetes で使用
  • • VXLAN でカプセル化

none

  • • ネットワーク機能なし
  • • ループバックのみ
  • • 完全に分離されたコンテナ

bridgeネットワークの仕組み

Container A
eth0: 172.17.0.2
Container B
eth0: 172.17.0.3
↓ veth pair
docker0 bridge (172.17.0.1)
↓ NAT (iptables)
Host Network (eth0)

ネットワーク操作

1# ネットワーク一覧
2docker network ls
3
4# ネットワーク詳細
5docker network inspect bridge
6
7# カスタムネットワーク作成
8docker network create mynetwork
9docker network create --driver bridge --subnet 192.168.100.0/24 mynetwork
10
11# コンテナをネットワークに接続
12docker run -d --network mynetwork --name web nginx
13docker network connect mynetwork existing_container
14docker network disconnect mynetwork existing_container
15
16# ネットワーク削除
17docker network rm mynetwork
18docker network prune # 未使用ネットワーク削除

コンテナ間通信

ユーザー定義ネットワークでは、コンテナ名でDNS解決が可能。 デフォルトのbridgeネットワークでは--linkが必要(非推奨)。

1# カスタムネットワーク作成
2docker network create app-network
3
4# コンテナ起動
5docker run -d --network app-network --name db postgres
6docker run -d --network app-network --name web myapp
7
8# webコンテナからdbにアクセス
9# → "db" という名前で解決される
10# 例: postgres://db:5432/mydb

ポート公開

1# 基本
2docker run -p 8080:80 nginx # ホスト8080 → コンテナ80
3
4# 特定IPにバインド
5docker run -p 127.0.0.1:8080:80 nginx
6
7# ランダムポート
8docker run -p 80 nginx # ホストのランダムポート → コンテナ80
9docker run -P nginx # EXPOSEされた全ポート
10
11# UDP
12docker run -p 53:53/udp dns-server
13
14# 複数ポート
15docker run -p 80:80 -p 443:443 nginx
16
17# ポート確認
18docker port container_name

DNS設定

1# カスタムDNS
2docker run --dns 8.8.8.8 nginx
3
4# ホスト名設定
5docker run --hostname mycontainer nginx
6
7# /etc/hosts エントリ追加
8docker run --add-host db:192.168.1.100 nginx
9
10# DNS検索ドメイン
11docker run --dns-search example.com nginx

SRE/インフラ観点

ベストプラクティス

  • • カスタムネットワークを使用(DNS解決、分離)
  • • 本番では127.0.0.1バインドを検討(セキュリティ)
  • • 不要なポートは公開しない

トラブルシューティング

  • docker network inspect で設定確認
  • iptables -L -n でNATルール確認
  • • コンテナ内から pingcurl でテスト