🐳

【Docker基本】Dockerネットワーク管理

に公開

🔸 1. Dockerネットワークの基礎

🧱 Dockerネットワークの基本概念

  • Dockerネットワークは、Linuxカーネルのネットワークスタックの上に構築された抽象レイヤー。
  • CNM (Container Networking Model) に基づいて構築。
  • 使用されるLinuxの構成要素:bridge, namespace, veth pair, iptables

🧩 CNMの構成要素

コンポーネント 説明
Sandbox 各コンテナに割り当てられるネットワーク空間(eth0など)
Endpoint vethの片側として、Sandboxに接続
Network 複数のエンドポイントを接続する仮想ネットワーク

🔹 2. veth, Namespace, Bridgeの理解

  • veth (Virtual Ethernet):双方向通信が可能な仮想ペア。1つはコンテナ、もう1つはホストのbridgeに接続。
  • Network Namespace:コンテナごとに独立したネットワーク空間。IP・ルーティングの隔離を提供。
  • Bridge Network:Dockerデフォルトの仮想スイッチ。MACアドレスベースで通信。
brctl show        # bridge構成の確認
ip addr show      # IPアドレス確認
iptables -t nat -L -n  # NATテーブル確認

※ 上記の内容はLinuxではできますが、macOSではできない。


📡 3. Dockerのネットワークドライバー

ドライバー 説明
bridge デフォルト。単一ホスト上のコンテナ間通信
host ホストと同一のネットワーク空間を共有
none ネットワーク無し。完全隔離
overlay 複数ホスト間通信(Swarm構成)
macvlan VLANによる物理ネットワークとの直接接続

🌐 4. Docker DNSと名前解決の仕組み

  • Dockerは127.0.0.11を内部DNSサーバーとして使用。
  • コンテナ名や--net-aliasで登録された名前で名前解決可能。
  • 同一ネットワーク内でのラウンドロビンDNSが自動で構成される。
docker network create mynet
docker run --name app1 --net=mynet --net-alias=group1 ...
docker run --name app2 --net=mynet --net-alias=group1 ...
docker run -it --rm --net=mynet busybox nslookup group1

⚙️ 5. 実践:独自ネットワークとIP設定

docker network create \
  --driver bridge \
  --subnet 172.30.1.0/24 \
  --gateway 172.30.1.1 \
  vswitch-net

docker run --net=vswitch-net --ip=172.30.1.100 ubuntu

🚀 6. Nginxでのリバースプロキシ構成

📌 Nginxの基本構成

  • デフォルトはWebサーバーだが、設定変更でリバースプロキシにも利用可能。
  • /etc/nginx/nginx.conf を修正して以下のように定義。
http {
  upstream backend-alb {
    server 127.0.0.1:5001;
    server 127.0.0.1:5002;
    server 127.0.0.1:5003;
  }
  server {
    listen 80;
    location / {
      proxy_pass http://backend-alb;
    }
  }
}
sudo systemctl restart nginx
curl localhost:80

🎯 分散方式

モード 説明
round-robin 順番に割り当て(デフォルト)
least_conn 接続数が最も少ないサーバーに割り当て
ip_hash クライアントIPに基づいて固定化

🧱 7. HAProxyによる高性能ロードバランシング

HAProxyの構成例(L7)

frontend myfrontend
  bind *:80
  acl path_item path_beg /item
  acl path_basket path_beg /basket
  use_backend item_backend if path_item
  use_backend basket_backend if path_basket

backend item_backend
  balance roundrobin
  server web1 172.30.1.10:8080 check
  server web2 172.30.1.11:8080 check

backend basket_backend
  balance roundrobin
  server web3 172.30.1.12:8080 check
  server web4 172.30.1.13:8080 check
docker run -d \
  --name haproxy-container \
  --net proxy-net \
  -p 80:80 -p 8404:8404 \
  -v $PWD/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg \
  haproxy:latest

🧪 8. 総合演習:DNS + Proxyによる実運用例

  1. Dockerネットワーク上に複数のアプリケーションコンテナを配置
  2. --net-alias によってサービス名をDNSに登録
  3. リバースプロキシ(Nginx or HAProxy)を通じて外部公開
docker network create netlb
docker run --name node1 --net=netlb --net-alias=service ubuntu
docker run --name node2 --net=netlb --net-alias=service ubuntu

# frontendで確認
docker run --net=netlb -it ubuntu ping service

📚 用語まとめ

用語 意味
veth 仮想イーサネットペア。コンテナとホストの橋渡し
Namespace Linuxの隔離技術。プロセスやネットワークの空間分離
Bridge Linuxの仮想スイッチ。vethを接続
iptables パケットフィルタリング/NATの設定に使用
Overlay 複数ホストをまたいだ仮想ネットワーク
Proxy クライアントとサーバの仲介役(Nginx, HAProxy)
DNS (127.0.0.11) Docker内部の名前解決用DNSサーバー

✍️ まとめ

  • Dockerのネットワークは、Linuxの基本技術を活用しつつ柔軟に構成可能。
  • net-aliasやBridgeネットワークを活用することで、複雑なシステム構成も簡易に実現。
  • Nginx・HAProxyを組み合わせれば、信頼性の高いプロキシ/ロードバランシング構成が可能。

Discussion