Docker Swarm overlay 和 docker_gwbridge

发布于:2025-06-12 ⋅ 阅读:(24) ⋅ 点赞:(0)

在 Docker Swarm 中,容器需要同时连接 overlay 网络docker_gwbridge 网络,这是为了满足不同层面的通信需求,并确保服务的高可用性和外部可达性。


1 Overlay 网络:跨节点通信与服务发现

  • 作用

    • Overlay 网络(如用户自定义的 my-network 或系统自动生成的 ingress 网络)负责 跨节点容器间的通信,支持服务发现、DNS 解析和负载均衡 。
    • 所有服务容器通过 overlay 网络实现 内部通信,即使容器分布在不同节点上也能直接互通。
    • 例如,服务 A 调用服务 B 时,流量通过 overlay 网络传输,无需经过 NAT 或外部网络 。
  • 关键特性

    • 服务发现:通过内置 DNS,容器可以直接通过服务名解析目标容器的 IP。
    • 负载均衡:使用 VIP(虚拟 IP)或 DNSRR(DNS 轮询)模式,将请求均匀分配到后端容器。
    • 安全性:支持加密(--opt encrypted),保护跨节点数据传输 。

2 docker_gwbridge 网络:外部通信与端口映射

  • 作用

    • docker_gwbridge 是默认的 桥接网络,负责将容器连接到宿主机的物理网络,主要解决以下问题:
      1. 外部访问:容器需要访问互联网或外部服务时,通过 docker_gwbridge 实现 NAT 出站 。
      2. 端口发布:当服务通过 -p 发布端口时,外部流量先到达宿主机的 docker_gwbridge,再转发到 overlay 网络中的容器 。
      3. 负载均衡入口ingress 网络(一种特殊的 overlay 网络)依赖 docker_gwbridge 处理外部请求的初始转发 。
  • 关键特性

    • NAT 功能:为容器提供私有 IP 到宿主机公网 IP 的地址转换。
    • 动态管理:Swarm 初始化或加入节点时自动创建,但支持自定义子网、MTU 等参数 。

3 两者协作的典型场景

场景 1:外部客户端访问服务
  1. 客户端请求发送到宿主机的公开端口(如 80)。
  2. 请求通过 docker_gwbridge 网络进入节点。
  3. Docker 的 IPVS 模块将流量路由到 ingress 网络(overlay 类型)。
  4. ingress 网络将请求转发到目标容器的 overlay 网络接口。
  5. 容器响应通过反向路径返回客户端 。
场景 2:容器访问外部网络
  1. 容器发起对外请求(如 apt-get update)。
  2. 请求通过 docker_gwbridge 网络进行 NAT 转换。
  3. 流量经宿主机的物理网卡发送到外部网络 。
场景 3:服务间内部通信
  1. 服务 A 调用服务 B 的服务名(如 redis)。
  2. 内置 DNS 解析出服务 B 的 VIP 或具体容器 IP。
  3. 流量通过 overlay 网络直接传输,不经过 docker_gwbridge

4 设计优势

  • 解耦内外通信:overlay 网络专注于内部服务通信,docker_gwbridge 专注于外部交互,避免单点瓶颈。
  • 灵活扩展:用户可通过自定义 overlay 网络划分服务,同时依赖默认网络处理通用需求。
  • 高可用性ingress 网络结合 docker_gwbridge 实现跨节点负载均衡,确保服务对外可达 。

5 路由表解析

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 路由优先级
  • 匹配规则:数据包的目标地址会优先匹配最具体的路由(子网掩码最长的条目),最后匹配默认路由。
  • 示例
    1. 如果目标地址是 10.0.5.100(属于 10.0.5.0/24 子网),则通过 eth0 直接发送。
    2. 如果目标地址是 172.19.0.100(属于 172.19.0.0/16 子网),则通过 eth1 直接发送。
    3. 如果目标地址是 8.8.8.8(不属于任何子网),则通过 eth1 发送到网关 172.19.0.1


6 总结

网络 核心职责 典型用途 是否必须
Overlay 跨节点通信、服务发现、负载均衡 服务间通信、VIP/DNSRR 是(服务依赖)
docker_gwbridge 外部访问、端口发布、NAT 转换 容器出站访问、外部入站 是(Swarm 自动创建)

这种双网络模型是 Docker Swarm 实现高效服务编排和网络管理的关键设计 。