高可用HAProxy需配合Keepalived实现VIP漂移,而非仅运行单个容器;通过--net host模式运行容器、配置健康检查与VRRP脚本,确保主备切换时流量自动转移。

用 Docker 部署高可用 HAProxy,核心不是单个容器跑起来,而是解决“单点失效”问题——即当一台 HAProxy 宕机时,流量能自动切到另一台。单纯运行一个 haproxy 容器只是负载均衡,谈不上高可用;必须配合 Keepalived 实现 VIP(虚拟 IP)漂移,才能真正落地高可用。
拉取镜像并准备配置文件
先确保基础环境就绪:
- 执行
docker pull haproxy获取官方镜像 - 在宿主机创建配置目录,例如:
mkdir -p /etc/haproxy - 新建
/etc/haproxy/haproxy.cfg,内容需包含frontend、backend和健康检查(如option mysql-check user haproxy或httpchk GET /health) - 若用于 MySQL 负载,
mode必须设为tcp;若代理 Web,则用mode http并启用option forwardfor
启动主备 HAProxy 容器
两台服务器(如 192.168.1.10 和 192.168.1.11)各自运行一个 HAProxy 容器,配置完全一致,仅靠 Keepalived 决定谁持有 VIP:
- 容器启动命令示例:
docker run -d --name haproxy-node --net host -v /etc/haproxy:/usr/local/etc/haproxy haproxy -f /usr/local/etc/haproxy/haproxy.cfg - 使用
--net host是关键:避免 NAT 层干扰 Keepalived 的 ARP 通告和 VIP 绑定 - 不要映射端口(如
-p 80:80),所有监听直接走宿主机网络栈
部署 Keepalived 实现故障切换
HAProxy 容器本身不处理高可用,这个任务交给宿主机上的 Keepalived:
- 在两台机器上都安装 Keepalived:
yum install -y keepalived(CentOS)或apt install -y keepalived(Ubuntu) - 主节点(priority 100)配置
/etc/keepalived/keepalived.conf中state MASTER,备节点设为BACKUP,priority 90 - 定义
vrrp_script检查 HAProxy 进程是否存活,例如:vrrp_script chk_haproxy { script "killall -0 haproxy" interval 2 } - 在
vrrp_instance VI_1中绑定 VIP(如 192.168.1.20),并关联上述检测脚本
验证与监控要点
上线后重点确认三件事是否闭环:
- VIP 能被客户端稳定访问,且始终只响应一台机器(
ip a | grep 192.168.1.20) - 手动停掉主节点的 HAProxy 容器,观察 VIP 是否在 2–3 秒内自动漂移到备节点
- 打开 HAProxy 自带的统计页(如配置了
listen stats在 8888 端口),确认后端服务器状态为UP,且连接数随请求均匀分发 - 注意:MySQL 类 TCP 服务需在后端节点创建专用健康检查账号(
CREATE USER 'haproxy'@'%' IDENTIFIED BY '';),否则option mysql-check会失败


















