15.6.6 多主机网络与Overlay
多主机网络用于让不同宿主机上的容器处于同一虚拟二层网络中,实现跨主机通信与服务发现。Overlay 网络通常基于 VXLAN 隧道封装,通过控制平面分发网络信息,数据平面完成转发,常用于 Docker Swarm 或与第三方网络插件结合使用。
原理草图(控制面/数据面)
核心概念与工作机制
- Overlay/VXLAN:在三层网络上构建二层虚拟网络,封装与解封装由宿主机内核与 Docker 完成。
- 控制平面:分发网络、节点、端点信息(Swarm 内置或 Consul/etcd)。
- 数据平面:宿主机通过 VXLAN(UDP 4789)建立隧道。
- 服务发现:Overlay 内置 DNS(127.0.0.11),支持服务名解析与 VIP/负载均衡。
安装与前置准备(两台宿主机示例)
# 在两台宿主机安装 Docker(Ubuntu示例)
sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl enable --now docker
# 验证版本
docker version
# 说明:
# docker.io 为发行版仓库包,便于快速部署测试;
# 生产环境可使用官方仓库版本以获得最新功能。
Swarm Overlay 网络创建与使用(可执行示例)
# 1) 管理节点初始化(Manager)
docker swarm init --advertise-addr 192.168.10.11
# 说明:
# --advertise-addr 指定其他节点加入时使用的管理地址
# 预期输出:含 join token 的提示
# 2) 在工作节点加入集群(Worker)
docker swarm join --token SWMTKN-1-xxxx 192.168.10.11:2377
# 说明:
# 2377/tcp 为管理面端口
# 3) 创建 Overlay 网络(Manager执行)
docker network create -d overlay --attachable prod-net
# 说明:
# --attachable 允许非service容器直接加入该网络
# 4) 启动跨主机服务
docker service create --name web --replicas 2 --network prod-net nginx:1.25
# 说明:
# Swarm 会将副本调度到不同节点
# 5) 启动普通容器加入 Overlay(任意节点)
docker run -d --name app1 --network prod-net busybox sleep 3600
# 6) 验证服务发现(任意节点)
docker run --rm --network prod-net busybox nslookup web
# 预期:解析出 web 服务的 VIP 或任务IP列表
端口与依赖(需放通)
- Swarm 控制面:2377/tcp
- 节点发现/心跳:7946/tcp、7946/udp
- Overlay 数据面:4789/udp
# 防火墙放行示例(Ubuntu ufw)
sudo ufw allow 2377/tcp
sudo ufw allow 7946/tcp
sudo ufw allow 7946/udp
sudo ufw allow 4789/udp
关键命令与解释
docker network ls
# 查看网络列表
docker network inspect prod-net
# 查看Overlay网络详情:子网、网关、连接端点
docker service ls
# 查看服务运行状态
docker service ps web
# 查看服务副本分布在哪些节点
ip -d link show | grep vxlan
# 查看VXLAN设备(需root)
配置示例:MTU 调整(避免分片)
# /etc/docker/daemon.json
{
"mtu": 1450
}
# 说明:
# VXLAN 封装会增加开销,MTU 过大可能导致分片,影响性能与稳定性
# 重启 Docker 生效
sudo systemctl restart docker
常见故障排查(含命令)
- 跨主机不通
# 检查端口可达性(在A上测试B)
nc -u -z -v 192.168.10.12 4789
nc -z -v 192.168.10.12 7946
# 若失败,检查防火墙/安全组/路由
- DNS 解析失败
docker exec -it app1 cat /etc/resolv.conf
# 预期包含 127.0.0.11
docker exec -it app1 nslookup web
# 若失败,确认容器是否加入同一 Overlay
- 节点掉线
docker node ls
# STATUS 为 Down/Unreachable 时,检查网络与系统时间同步
journalctl -u docker --since "10 min ago"
# 查看 Docker 服务日志
- 服务不分发
docker service ps web --no-trunc
# 查看调度失败原因(资源不足/端口冲突等)
性能与稳定性建议
- 为 Overlay 规划独立网段,避免与物理网冲突。
- 在高并发场景下评估 --opt encrypted 的性能损耗。
- 合理设置 MTU(1450/1440)以避免分片。
- 生产环境建议独立管理网络与数据网络。
安全与隔离
# 加密 Overlay(需要 Swarm)
docker network create -d overlay --opt encrypted secure-net
练习
1. 在两台主机创建 prod-net,部署 web 服务 2 副本,验证 nslookup web 解析结果。
2. 手动阻断 4789/udp,观察跨主机通信失败现象,并用 nc 验证端口恢复后通信恢复。
3. 调整 MTU 为 1500 与 1450,对比 ping -M do -s 1472 的表现差异。