单机用docker compose配keepalived构建高可用网关是轻量级验证场景,可实现容器容错、vip绑定与本地健康检查重启,但无法完成多机vrrp主备切换;需改用lo/dummy接口、关闭vrrp_strict、设state为master,并通过脚本检测nginx状态触发恢复。

单机上用 Docker Compose 配合 Keepalived 构建“高可用服务网关”本质上是一种**模拟或轻量级验证场景**,因为 Keepalived 的 VRRP 协议天然依赖多节点(至少两台主机)才能实现真正的故障转移和 VIP 漂移。但在单机环境下,仍可通过特定方式达成**局部高可用效果**:比如容器级容错、VIP 绑定+健康检查触发的本地服务重启、或为后续扩展到多机打下配置基础。
明确目标与前提限制
单机环境无法运行标准 VRRP 主备选举(无网络隔离下的多播冲突、状态不可靠),所以不能实现“主挂了备自动接管 VIP”的生产级行为。但可以做到:
- Keepalived 容器持续监听本地 Nginx/HAProxy 是否存活
- 一旦网关进程异常退出,Keepalived 执行自定义脚本拉起服务或触发告警
- 虚拟 IP(VIP)成功绑定到宿主机 loopback 或 dummy 接口,供本地测试或内部调用使用
- 所有配置结构与多机部署完全一致,便于一键迁移到真实集群
关键配置要点
核心在于让 Keepalived 在单机中“假装”是 MASTER,并绕过 VRRP 网络校验:
-
interface 改为 lo 或 dummy0:避免依赖物理网卡 eth0,改用本地回环接口。需提前创建 dummy 接口:
ip link add dummy0 type dummy && ip addr add 192.168.100.100/32 dev dummy0 && ip link set dummy0 up -
关闭 vrrp_strict 模式:在 keepalived.conf 开头添加
vrrp_strict off,否则单机多实例会因地址冲突被拒绝启动 - state 必须设为 MASTER,priority 设高(如 150),且 virtual_router_id 在单机内唯一即可(无需跨机协调)
-
health check 使用本地脚本:例如检测 nginx 进程或 curl localhost:80 健康端点,失败时执行
docker-compose restart nginx或发通知
docker-compose.yml 示例(单机可运行)
以下是一个精简可运行的单机组合:
version: '3.8'
services:
nginx:
image: nginx:alpine
ports: ["80:80"]
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./html:/usr/share/nginx/html:ro
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/health"]
interval: 10s
timeout: 5s
retries: 3
<p>keepalived:
image: osixia/keepalived:2.1.5
cap_add:</p>
- NET_ADMIN
- SYS_ADMIN privileged: true volumes:
- ./keepalived.conf:/etc/keepalived/keepalived.conf:ro
- ./check-nginx.sh:/etc/keepalived/check-nginx.sh:ro depends_on:
- nginx
restart: unless-stopped
注意:
check-nginx.sh需有执行权限,内容可为:#!/bin/sh if ! docker ps --filter "name=nginx" --filter "status=running" --format "{{.Names}}" | grep -q "nginx"; then docker-compose restart nginx 2>/dev/null exit 1 fi exit 0
验证是否生效
启动后执行:
-
ip addr show dummy0查看 VIP(如 192.168.100.100)是否已绑定 -
curl http://192.168.100.100/health应返回 200 -
docker stop <nginx></nginx>,等待约 10 秒,观察 keepalived 日志是否执行了重启逻辑(docker logs -f keepalived) - 再次访问 VIP,应能恢复响应
这种方式不提供跨机器故障转移能力,但完成了健康感知、自动恢复、VIP 管理和配置标准化——是单机开发、CI 测试或教学演示中非常实用的高可用网关雏形。











