🔸 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
ip addr show
iptables -t nat -L -n
※ 上記の内容は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による実運用例
- Dockerネットワーク上に複数のアプリケーションコンテナを配置
-
--net-alias
によってサービス名をDNSに登録
- リバースプロキシ(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
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