Dockerネットワーク
bridge、host、overlay
ネットワークドライバ
bridge(デフォルト)
- • 仮想ブリッジ(docker0)を作成
- • コンテナ間は同一ブリッジ内で通信可能
- • 外部との通信はNAT経由
- • 単一ホストでの使用に適している
host
- • ホストのネットワークを直接使用
- • ネットワーク分離なし
- • 最高のパフォーマンス
- • ポートマッピング不要
overlay
- • 複数ホストにまたがるネットワーク
- • Docker Swarm / Kubernetes で使用
- • VXLAN でカプセル化
none
- • ネットワーク機能なし
- • ループバックのみ
- • 完全に分離されたコンテナ
bridgeネットワークの仕組み
Container A
eth0: 172.17.0.2
eth0: 172.17.0.2
Container B
eth0: 172.17.0.3
eth0: 172.17.0.3
↓ veth pair
docker0 bridge (172.17.0.1)
↓ NAT (iptables)
Host Network (eth0)
ネットワーク操作
1 # ネットワーク一覧 2 docker network ls 3 4 # ネットワーク詳細 5 docker network inspect bridge 6 7 # カスタムネットワーク作成 8 docker network create mynetwork 9 docker network create --driver bridge --subnet 192.168.100.0/24 mynetwork 10 11 # コンテナをネットワークに接続 12 docker run -d --network mynetwork --name web nginx 13 docker network connect mynetwork existing_container 14 docker network disconnect mynetwork existing_container 15 16 # ネットワーク削除 17 docker network rm mynetwork 18 docker network prune # 未使用ネットワーク削除
コンテナ間通信
ユーザー定義ネットワークでは、コンテナ名でDNS解決が可能。 デフォルトのbridgeネットワークでは--linkが必要(非推奨)。
1 # カスタムネットワーク作成 2 docker network create app-network 3 4 # コンテナ起動 5 docker run -d --network app-network --name db postgres 6 docker run -d --network app-network --name web myapp 7 8 # webコンテナからdbにアクセス 9 # → "db" という名前で解決される 10 # 例: postgres://db:5432/mydb
ポート公開
1 # 基本 2 docker run -p 8080:80 nginx # ホスト8080 → コンテナ80 3 4 # 特定IPにバインド 5 docker run -p 127.0.0.1:8080:80 nginx 6 7 # ランダムポート 8 docker run -p 80 nginx # ホストのランダムポート → コンテナ80 9 docker run -P nginx # EXPOSEされた全ポート 10 11 # UDP 12 docker run -p 53:53/udp dns-server 13 14 # 複数ポート 15 docker run -p 80:80 -p 443:443 nginx 16 17 # ポート確認 18 docker port container_name
DNS設定
1 # カスタムDNS 2 docker run --dns 8.8.8.8 nginx 3 4 # ホスト名設定 5 docker run --hostname mycontainer nginx 6 7 # /etc/hosts エントリ追加 8 docker run --add-host db:192.168.1.100 nginx 9 10 # DNS検索ドメイン 11 docker run --dns-search example.com nginx
SRE/インフラ観点
ベストプラクティス
- • カスタムネットワークを使用(DNS解決、分離)
- • 本番では127.0.0.1バインドを検討(セキュリティ)
- • 不要なポートは公開しない
トラブルシューティング
- •
docker network inspectで設定確認 - •
iptables -L -nでNATルール確認 - • コンテナ内から
ping、curlでテスト