在 Linux 上的 Docker 负载均衡实现路径
- Docker Swarm 内置:基于 DNSRR 的服务发现与基于 VIP + IPVS 的传输层负载均衡,配合 Ingress 路由网格 将节点端口统一暴露与分发,适合多主机集群的一站式方案。
- 反向代理/四层负载均衡:使用 Nginx/HAProxy 对后端容器进行轮询、权重、最少连接等策略的流量分发,适合单机多容器或作为边缘/入口负载均衡。
- 内核级 IPVS 直连:在宿主机上以 IPVS 承载虚拟服务,将请求转发到多个后端容器,适合对性能和灵活性要求更高的场景。
方案一 Docker Swarm 内置负载均衡
- 核心机制
- DNS 轮询(DNSRR):服务名解析为多个容器 IP 列表,客户端通常取首条,天然实现轮询分发。
- VIP + IPVS:为每个服务分配虚拟 IP,借助 iptables/IPVS 做传输层负载均衡到后端任务容器。
- Ingress 路由网格:将服务端口发布到所有节点,通过 ingress overlay 网络 与节点 sandbox 的 iptables/IPVS 将请求负载到后端。
- 快速上手
- 初始化 Swarm 并加入节点
- docker swarm init
- docker swarm join --token :
- 创建 overlay 网络
- docker network create --driver overlay app_net
- 部署服务(内部通信示例,DNSRR)
- docker service create --name vote --network app_net --replicas 3 --endpoint-mode dnsrr your-vote-image
- docker service create --name client --network app_net --replicas 1 your-client-image
- 进入 client 容器执行:for i in {1…10}; do curl -s vote | grep -i “container id”; done(可见不同后端容器响应)
- 对外发布端口(路由网格)
- docker service create --name vote --network app_net --replicas 3 -p 8080:80 your-vote-image
- 任意节点访问 http://:8080 均会被均衡到后端 vote 容器
- 适用场景
- 多主机生产集群、需要“服务发现 + 自动负载 + 统一入口”的场景。
方案二 反向代理 Nginx 或 HAProxy
- 思路
- 启动多个应用容器(不同端口或不同主机),在前端部署 Nginx/HAProxy 作为反向代理,按轮询/权重/最少连接等策略转发到后端。
- 快速上手(单机 Docker Compose 示例)
- docker-compose.yml
- version: “3”
- services:
- app1: image: httpd:alpine; ports: [“8081:80”]
- app2: image: httpd:alpine; ports: [“8082:80”]
- nginx: image: nginx:alpine; ports: [“80:80”]; volumes: [“./nginx.conf:/etc/nginx/nginx.conf:ro”]
- nginx.conf(核心片段)
- http { upstream backend { server app1:80; server app2:80; }
- server { listen 80; location / { proxy_pass http://backend; } } }
- 启动与验证
- docker-compose up -d
- 多次访问 http://localhost 观察返回来自不同后端
- 适用场景
- 单机多容器、已有 Nginx/HAProxy 运维体系、需要灰度/权重/熔断等高级策略。
方案三 内核级 IPVS 直连负载均衡
- 思路
- 在宿主机启用 IPVS(L4 负载均衡器),为虚拟服务配置后端容器 IP:Port,实现高性能分发;可与 Keepalived 配合做 VIP 漂移。
- 快速上手(宿主机操作)
- 安装工具与内核模块
- apt-get update && apt-get install -y ipvsadm
- modprobe ip_vs && modprobe ip_vs_rr(按需加载更多调度算法模块)
- 创建虚拟服务(示例:轮询)
- ipvsadm -A -t 10.0.0.100:80 -s rr
- 添加后端容器(示例)
- ipvsadm -a -t 10.0.0.100:80 -r <CONTAINER1_IP>:80 -m
- ipvsadm -a -t 10.0.0.100:80 -r <CONTAINER2_IP>:80 -m
- 验证
- 适用场景
- 对吞吐与延迟敏感、希望绕过用户态代理、需要自定义调度与大规模后端池的场景。
选型与对比
| 方案 |
部署复杂度 |
性能与延迟 |
对外发布 |
典型场景 |
| Docker Swarm 内置 |
低 |
中-高(内核 IPVS) |
简单(-p 发布到所有节点) |
多主机集群、一体化编排 |
| Nginx/HAProxy |
中 |
中(用户态) |
简单(宿主机端口) |
单机多容器、边缘入口 |
| IPVS 直连 |
中-高 |
高(内核 L4) |
需配合 VIP/路由 |
高性能、大规模后端池 |
- 实践建议
- 小规模或快速验证:优先 Nginx/HAProxy。
- 多主机生产集群:优先 Docker Swarm 内置(DNSRR/VIP/Ingress)。
- 极致性能与可控性:使用 IPVS,必要时结合 Keepalived 实现高可用。