Docker Swarm overlay 和 docker_gwbridge

在 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 路由表解析

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 路由优先级
  • 匹配规则:数据包的目标地址会优先匹配最具体的路由(子网掩码最长的条目),最后匹配默认路由。
  • 示例
    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 实现高效服务编排和网络管理的关键设计 。

相关推荐
程序员老赵21 小时前
Docker 部署 Redmine:老牌开源项目管理部署实测记录
docker·开源·团队管理
程序员老赵1 天前
服务器文件不想 SFTP 上传?Docker 跑个 File Browser,浏览器就能管理
服务器·docker·开源
lichenyang4533 天前
Docker 学习笔记(五):Docker Compose,用一个 YAML 启动前端、后端和 MongoDB
docker
lichenyang4533 天前
Docker 学习笔记(四):Dockerfile,把项目打成自己的镜像
docker·容器
lichenyang4533 天前
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通
docker·容器
lichenyang4533 天前
Docker 学习笔记(二):docker run 的参数到底在控制什么?
docker·容器
Patrick_Wilson8 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
Suroy8 天前
DockerView-Go:用 Go 写一个终端 Docker 监控工具,顺便做了个 Web 仪表盘
docker
云恒要逆袭8 天前
运行你的第一个Docker容器
后端·docker·容器
宋均浩9 天前
# Docker 镜像瘦身实战:从 1.2G 到 80MB 的五个优化步骤
ci/cd·docker