Overlay 网络场景
面试题
Docker Overlay 网络是什么?在什么场景下使用?底层是如何实现的?
标准答案
Overlay 网络是 Docker 的跨主机网络方案,它让不同宿主机上的容器可以像在同一台机器上一样通信。Overlay 网络必须配合 Docker Swarm 模式使用。
核心概念
Overlay 网络在现有物理网络(Underlay)之上建立一层虚拟网络,将不同宿主机上的容器连接在同一个二层网络中。数据包在宿主机间传输时被封装(VXLAN),到达目标宿主机后解封。
宿主机 A 宿主机 B
┌──────────────┐ ┌──────────────┐
│ 容器 A │ │ 容器 B │
│ 10.0.0.2 │ │ 10.0.0.3 │
│ └────┬──────┘ │ └────┬──────┘
│ │ │ │
│ ┌────┴──────────┐ │ ┌────┴──────────┐
│ │ Overlay 网络 │ │ │ Overlay 网络 │
│ │ VXLAN 封装 │ │ │ VXLAN 解封 │
│ └────┬──────────┘ │ └────┬──────────┘
│ │ │ │
│ ┌────┴──────────┐ │ ┌────┴──────────┐
│ │ 物理网络 │══════════│ 物理网络 │
│ │ 192.168.1.10 │ │ │ 192.168.1.20 │
│ └───────────────┘ │ └───────────────┘
└──────────────────────┘ └──────────────────────┘
数据包路径:
容器 A → 容器 B: 10.0.0.2 → 10.0.0.3
↓
VXLAN 封装,外层目标地址为 192.168.1.20
↓
物理网络传输
↓
宿主机 B 收到,VXLAN 解封
↓
容器 B 收到原始包
启用 Overlay 网络
Overlay 网络必须在 Swarm 模式下使用:
# 1. 初始化 Swarm 集群
docker swarm init --advertise-addr 192.168.1.10
# 2. 其他节点加入
docker swarm join --token SWMTKN-... 192.168.1.10:2377
# 3. 创建 Overlay 网络
docker network create \
--driver overlay \
--subnet 10.0.0.0/16 \
--gateway 10.0.0.1 \
my-overlay
# 4. 使用 Overlay 网络部署服务
docker service create \
--name web \
--network my-overlay \
--replicas 3 \
nginx
# 或用于容器(仅 Swarm 服务容器,不支持普通 docker run)
docker run -d --name test --network my-overlay alpine sleep 3600
两种 Overlay 模式
1. 全局范围(Global Scope)
# 默认模式,所有 Swarm 节点都能使用
docker network create --driver overlay --scope global my-overlay
2. 交换范围(Swarm Scope)
# 仅限于 Swarm 服务使用
docker network create --driver overlay --scope swarm my-overlay
应用场景
场景一:多节点微服务
version: '3.8'
services:
api:
image: myapi:latest
networks:
- overlay-net
deploy:
replicas: 3
placement:
constraints: [node.role == worker]
web:
image: nginx:alpine
networks:
- overlay-net
ports:
- 80:80
deploy:
replicas: 2
networks:
overlay-net:
driver: overlay
服务发现自动生效:任意节点上的 api 服务可以通过服务名访问另一个节点上的 web。
场景二:数据库主从复制
# 跨主机的数据库同步
docker service create \
--name mysql-primary \
--network overlay-net \
--replicas 1 \
-e MYSQL_ROOT_PASSWORD=secret \
mysql:8
docker service create \
--name mysql-replica \
--network overlay-net \
--replicas 2 \
-e MYSQL_REPLICATION_MODE=slave \
mysql:8
场景三:混合部署
# 部分容器在 Overlay 上跨主机通信
# 部分容器只在本地通信
docker network create --driver overlay public-net
docker network create --driver bridge private-net
docker service create \
--name api \
--network public-net \
--network private-net \
myapi:latest
底层原理:VXLAN
Overlay 网络使用 VXLAN(Virtual Extensible LAN)技术封装数据包:
原始数据包(容器内):
┌─────┬────────────┬──────┬──────────┐
│ MAC │ IP(容器) │ UDP │ Payload │
└─────┴────────────┴──────┴──────────┘
VXLAN 封装后(物理网络传输):
┌─────┬────────────┬──────┬──────────────┬──────────┐
│ MAC │ IP(宿主机) │ UDP │ VXLAN Header │ 原始包 │
└─────┴────────────┴──────┴──────────────┴──────────┘
协议栈:
- 外层的 MAC/IP:宿主机之间的通信地址
- VXLAN Header:VNI(VXLAN Network Identifier)
- 内层:原始容器通信数据
Overlay 网络的性能
| 指标 | 原生通信 | Overlay 网络 |
|---|---|---|
| 延迟 | 无额外开销 | 加 0.1-0.5ms(封装/解封) |
| 吞吐量 | 线速 | 约 90-95%(CPU 非 offload) |
| CPU 开销 | 无 | 中等(封装处理) |
| MTU | 1500 | 1450(50 字节 VXLAN 头) |
常见问题
Q:Overlay 网络需要额外配置吗?
基础配置不需要。但需要注意:
– 集群节点间的 4789/UDP 端口必须互通(VXLAN 端口)
– 推荐启用 GRO/GSO 卸载以提高性能
– MTU 可能需要调整
Q:Overlay 网络的安全如何保证?
# 启用加密传输
docker network create \
--driver overlay \
--opt encrypted \
my-secure-overlay
# 使用 IPsec 加密 VXLAN 流量
Q:普通 docker run 可以使用 Overlay 网络吗?
只有 Swarm 服务(docker service create)才支持 Overlay 网络。普通 docker run 虽然也能连接到 Overlay 网络,但不建议这么做,因为网络会随着 Swarm 的 Leader 选举等操作发生抖动。
调试技巧
# 查看 Overlay 网络信息
docker network inspect my-overlay
# 在 Swarm 节点上查看 VXLAN 接口
ip link show | grep vxlan
# 查看 VXLAN 隧道
ip -d link show | grep vxlan
# 检查 VXLAN 端口是否可通
nc -uvz 192.168.1.20 4789
总结
Overlay 网络解决的是跨主机容器通信的问题,底层通过 VXLAN 封装实现。核心场景是 Swarm 集群中的多节点部署。理解 VXLAN 的封装/解封原理有助于排查跨主机通信的性能和连通性问题。


暂无评论内容