Docker Swarm overlay 和 docker_gwbridge
在 Docker Swarm 中,容器需要同时连接 overlay 网络 和 docker_gwbridge 网络,这是为了满足不同层面的通信需求,并确保服务的高可用性和外部可达性。以下是具体原因:
1. Overlay 网络:跨节点通信与服务发现
-
作用:
- Overlay 网络(如用户自定义的
my-network
或系统自动生成的ingress
网络)负责 跨节点容器间的通信,支持服务发现、DNS 解析和负载均衡 。 - 所有服务容器通过 overlay 网络实现 内部通信,即使容器分布在不同节点上也能直接互通。
- 例如,服务 A 调用服务 B 时,流量通过 overlay 网络传输,无需经过 NAT 或外部网络 。
- Overlay 网络(如用户自定义的
-
关键特性:
- 服务发现:通过内置 DNS,容器可以直接通过服务名解析目标容器的 IP。
- 负载均衡:使用 VIP(虚拟 IP)或 DNSRR(DNS 轮询)模式,将请求均匀分配到后端容器。
- 安全性:支持加密(
--opt encrypted
),保护跨节点数据传输 。
2. docker_gwbridge 网络:外部通信与端口映射
-
作用:
docker_gwbridge
是默认的 桥接网络,负责将容器连接到宿主机的物理网络,主要解决以下问题:- 外部访问:容器需要访问互联网或外部服务时,通过
docker_gwbridge
实现 NAT 出站 。 - 端口发布:当服务通过
-p
发布端口时,外部流量先到达宿主机的docker_gwbridge
,再转发到 overlay 网络中的容器 。 - 负载均衡入口:
ingress
网络(一种特殊的 overlay 网络)依赖docker_gwbridge
处理外部请求的初始转发 。
- 外部访问:容器需要访问互联网或外部服务时,通过
-
关键特性:
- NAT 功能:为容器提供私有 IP 到宿主机公网 IP 的地址转换。
- 动态管理:Swarm 初始化或加入节点时自动创建,但支持自定义子网、MTU 等参数 。
3. 两者协作的典型场景
场景 1:外部客户端访问服务
- 客户端请求发送到宿主机的公开端口(如
80
)。 - 请求通过
docker_gwbridge
网络进入节点。 - Docker 的 IPVS 模块将流量路由到
ingress
网络(overlay 类型)。 ingress
网络将请求转发到目标容器的 overlay 网络接口。- 容器响应通过反向路径返回客户端 。
场景 2:容器访问外部网络
- 容器发起对外请求(如
apt-get update
)。 - 请求通过
docker_gwbridge
网络进行 NAT 转换。 - 流量经宿主机的物理网卡发送到外部网络 。
场景 3:服务间内部通信
- 服务 A 调用服务 B 的服务名(如
redis
)。 - 内置 DNS 解析出服务 B 的 VIP 或具体容器 IP。
- 流量通过 overlay 网络直接传输,不经过
docker_gwbridge
。
4. 设计优势
- 解耦内外通信:overlay 网络专注于内部服务通信,
docker_gwbridge
专注于外部交互,避免单点瓶颈。 - 灵活扩展:用户可通过自定义 overlay 网络划分服务,同时依赖默认网络处理通用需求。
- 高可用性:
ingress
网络结合docker_gwbridge
实现跨节点负载均衡,确保服务对外可达 。
5. 总结
网络 | 核心职责 | 典型用途 | 是否必须 |
---|---|---|---|
Overlay | 跨节点通信、服务发现、负载均衡 | 服务间通信、VIP/DNSRR | 是(服务依赖) |
docker_gwbridge | 外部访问、端口发布、NAT 转换 | 容器出站访问、外部入站 | 是(Swarm 自动创建) |
这种双网络模型是 Docker Swarm 实现高效服务编排和网络管理的关键设计 。