如何在docker-compose中实现默认服务故障时自动启动备用服务
Docker Compose 同文件内服务故障自动切换备用链路实现方案
注意:所有方案都依赖默认链路服务的准确健康检查配置,建议不要仅用进程存活作为判断依据,最好配置可真实验证通信链路可用性的探测逻辑,比如请求业务探测接口、发送链路心跳包等。
方案1:轻量级脚本实现(无额外依赖)
- 第一步:在你的
docker-compose.yml中为默认链路服务添加健康检查配置,示例如下:
services: default-link: # 你的默认链路服务名 # 原有镜像、端口、环境变量等配置保留 healthcheck: test: ["CMD", "curl", "-f", "http://127.0.0.1:你的服务端口/健康探测路径"] interval: 10s # 检查间隔 timeout: 5s # 单次检查超时时间 retries: 3 # 连续失败多少次判定为故障 start_period: 30s # 服务启动后多久开始执行健康检查 backup-link: # 你的备用链路服务名 # 原有配置保留 restart: "no" # 默认不随compose自动启动
- 第二步:编写监控脚本,定期检查默认服务健康状态,故障时自动拉起备用服务,脚本示例:
#!/bin/bash while true; do # 获取默认服务健康状态 DEFAULT_STATUS=$(docker inspect --format='{{.State.Health.Status}}' default-link 2>/dev/null) if [ "$DEFAULT_STATUS" != "healthy" ]; then # 检查备用服务是否未运行,未运行则启动 BACKUP_RUNNING=$(docker inspect --format='{{.State.Running}}' backup-link 2>/dev/null) if [ "$BACKUP_RUNNING" != "true" ]; then docker compose up -d backup-link # 可选:停止故障的默认服务释放资源 # docker compose stop default-link fi fi sleep 10 done
- 第三步:给脚本加执行权限,配置为systemd等后台常驻服务即可使用,适配所有Docker Compose版本。
方案2:autoheal容器实现(无需自定义脚本)
依赖轻量的autoheal容器实现自动监控,适合不想自己维护监控逻辑的场景:
- 在你的
docker-compose.yml中新增autoheal服务配置:
services: # 原有default-link、backup-link配置保留 autoheal: image: willfarrell/autoheal volumes: - /var/run/docker.sock:/var/run/docker.sock environment: - AUTOHEAL_INTERVAL=10 # 检查间隔10秒 - AUTOHEAL_STOP_TIMEOUT=5 # 配置故障触发钩子 command: /bin/sh -c "autoheal & while true; do if [ \"\$(docker inspect --format='{{.State.Health.Status}}' default-link)\" != \"healthy\" ]; then docker compose up -d backup-link; kill %1; exit; fi; sleep 10; done"
- 启动compose后autoheal会自动在后台运行,默认服务健康检查失败后会自动执行启动备用服务的逻辑。
方案3:生产级无感知切换(Traefik反向代理实现)
如果两条链路对外提供相同的服务能力,建议搭配Traefik反向代理实现流量自动切换,无需启停服务,用户无感知:
- 为两个链路服务配置相同的Traefik路由规则,给默认链路设置更高的权重
- Traefik会自动执行后端健康检查,默认链路不健康时自动把所有流量切到备用链路,适合对业务连续性要求高的生产场景。
内容的提问来源于stack exchange,提问作者Adam Krawczyk
相关产品推荐
相关产品推荐

