docker swarm内置负载均衡通过服务发现、dns轮询与vip机制实现轻量自动分发,依赖ingress网络和ipvs,默认轮询算法,需用docker service create部署并配置--publish启用,避免host模式或dnsrr导致失效。

用 Docker 自带负载均衡解决分布式容器连接瓶颈,核心是利用 Docker 内置的 swarm 模式服务发现 + 内置 DNS 轮询 + VIP(虚拟 IP)机制,而非额外部署 Nginx 或 HAProxy。它不依赖外部组件,轻量、自动、与容器生命周期同步,特别适合服务间调用场景。
启用 Swarm 并发布服务时开启内置负载均衡
Docker 的负载均衡能力只在 Swarm mode 下激活。单机 docker run 不具备该能力。
- 初始化 Swarm:执行
docker swarm init(或加入已有集群) - 部署服务时使用
docker service create,而非docker run - 指定副本数(如
--replicas 3),Swarm 会自动在可用节点上调度多个实例 - 暴露端口必须用
--publish published=8080,target=80,mode=ingress(默认 mode=ingress,启用 VIP 和负载分发)
理解 ingress 网络下的三层分发机制
当服务以 mode=ingress 发布时,Docker 在所有集群节点上开放 published 端口,并通过内置的 IPVS + iptables 规则 + 内置 DNS 实现透明负载:
- 客户端访问任意节点的 8080 端口,请求被本机 ingress 网络拦截
- 请求经 VIP(10.255.0.0/16 段内)转发到后端容器,由 IPVS 做 L4 轮询(RR 默认)
- 同一服务名(如
myapp)在集群内可通过内置 DNS 解析为 VIP,其他服务直接curl http://myapp:80即可,自动负载 - 注意:DNS 解析结果不是具体容器 IP,而是固定 VIP —— 这正是实现稳定入口的关键
规避常见连接瓶颈点
即使启用了 Swarm 负载,仍可能因配置不当导致连接堆积或单点压力:
-
避免 host 模式发布:若用
--publish mode=host,将绕过 ingress 网络,失去负载能力,仅绑定到单个节点 - 慎用 --endpoint-mode dnsrr:它禁用 VIP,改用 DNS 轮询返回全部容器 IP —— 客户端需自行重试失败连接,易引发连接雪崩
-
检查健康检查配置:添加
--health-cmd和--health-interval,确保不健康的实例被 ingress 自动剔除 - 连接池适配 VIP:应用层 HTTP 客户端(如 Go net/http、Java OkHttp)默认复用连接;若长连接指向 VIP,需确认底层 TCP 层支持连接故障自动迁移(推荐启用 keepalive + timeout)
验证与调试负载是否生效
不要只看 docker service ps,要验证实际流量分发:
- 在服务容器内打印日志中的
$HOSTNAME或ip addr show eth0,连续发起 10 次请求,观察是否轮转到不同实例 - 执行
docker network inspect ingress查看 VIP 分配(Subnet 中的IPAM.Config和Services字段) - 从另一容器执行
nslookup myapp,应返回单一 VIP 地址(如 10.255.0.3),而非多个 A 记录 - 用
iptables -t nat -L -n | grep 8080在任意 worker 节点上确认 DNAT 规则存在,指向 IPVS 后端
这套机制不复杂但容易忽略细节,关键是坚持用 service 而非 container,信任 ingress 网络的透明分发能力,把注意力放在健康探活和连接语义适配上。











