在 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 路由表解析
bash
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.19.0.1 0.0.0.0 UG 0 0 0 eth1
10.0.5.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
172.19.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
5.1 路由表字段含义
字段 | 说明 |
---|---|
Destination | 目标网络地址(0.0.0.0 表示默认路由) |
Gateway | 网关地址(0.0.0.0 表示本地直连网络) |
Genmask | 子网掩码(决定目标网络的范围) |
Flags | 标志位: - U (Up,路由可用) - G (Gateway,通过网关) |
Metric | 路由优先级(数值越小优先级越高) |
Iface | 出站网络接口(数据包从哪个网卡发出) |
5.2 关键路由条目解析
(1) 默认路由(Default Route)
0.0.0.0 172.19.0.1 0.0.0.0 UG 0 0 0 eth1
- 作用 :所有非本地网络的流量(如访问公网、外部服务)都会通过
eth1
接口转发到网关172.19.0.1
。 - 意义 :
eth1
是 Docker 的 docker_gwbridge 网络(宿主机 NAT 网络),用于容器与外部网络的交互。- 该路由是容器访问外部世界的唯一通道。
(2) 本地 Overlay 网络
10.0.5.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
- 作用 :目标地址为
10.0.5.0/24
子网的流量直接通过eth0
接口发送,无需网关。 - 意义 :
eth0
是 Docker 的 Overlay 网络(跨主机通信网络),用于容器间直接通信。- 该路由确保容器可以通过 Overlay 网络访问同一 Swarm 集群内的其他容器。
(3) docker_gwbridge 子网
172.19.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
- 作用 :目标地址为
172.19.0.0/16
子网的流量直接通过eth1
接口发送,无需网关。 - 意义 :
eth1
是 Docker 的 docker_gwbridge 网络,仅用于当前宿主机内的容器与外部网络交互。- 该网络的 IP(如
172.19.0.14
)在跨主机时不可达,仅用于本地通信。
5.3 路由优先级
- 匹配规则:数据包的目标地址会优先匹配最具体的路由(子网掩码最长的条目),最后匹配默认路由。
- 示例 :
- 如果目标地址是
10.0.5.100
(属于10.0.5.0/24
子网),则通过eth0
直接发送。 - 如果目标地址是
172.19.0.100
(属于172.19.0.0/16
子网),则通过eth1
直接发送。 - 如果目标地址是
8.8.8.8
(不属于任何子网),则通过eth1
发送到网关172.19.0.1
。
- 如果目标地址是
6 总结
网络 | 核心职责 | 典型用途 | 是否必须 |
---|---|---|---|
Overlay | 跨节点通信、服务发现、负载均衡 | 服务间通信、VIP/DNSRR | 是(服务依赖) |
docker_gwbridge | 外部访问、端口发布、NAT 转换 | 容器出站访问、外部入站 | 是(Swarm 自动创建) |
这种双网络模型是 Docker Swarm 实现高效服务编排和网络管理的关键设计 。