无Dockerfile的运行中镜像如何用docker-autoheal实现故障自动重启
无侵入式容器故障自愈实现方案
针对无法修改业务镜像、无法重建容器、无法内置healthcheck规则的运行中业务容器,可通过以下两类零侵入方案实现停止/故障时的自动重启,全程不需要改动业务容器的任何内部配置:
方案1:使用docker-autoheal实现事件驱动的自愈
常规文档提到的需要配置healthcheck是autoheal的健康状态检测模式,实际上该工具支持直接监听Docker原生事件流实现异常退出检测,完全不需要业务容器做任何配置,启动命令如下:
docker run -d \ --name autoheal \ --restart=always \ -v /var/run/docker.sock:/var/run/docker.sock \ willfarrell/autoheal \ --monitor-only-exited=true \ --restart-timeout=0 \ --ignore-manual-stop=true
参数说明:
- 挂载
/var/run/docker.sock仅用于让autoheal读取Docker daemon的事件流,不会侵入业务容器的文件系统、运行环境 --monitor-only-exited=true关闭对容器内置healthcheck的依赖,直接监听容器异常退出的die事件,只要容器非手动停止就会触发重启逻辑--restart-timeout=0设置检测到异常后立刻执行重启,无等待延迟--ignore-manual-stop=true会识别用户手动触发的容器停止操作,日常运维手动停容器时不会被自动拉起,避免影响维护操作
如果需要覆盖「进程存活但服务假死」的故障场景,可以给autoheal追加外部探测规则,比如定时对业务端口做tcp探测、对业务健康接口做curl请求,探测逻辑完全运行在autoheal容器侧,不需要往业务容器里加任何配置,探测失败时直接调用Docker接口重启业务容器即可。
方案2:Docker原生重启策略(无额外工具依赖)
如果不需要检测假死场景,仅需要容器停止/退出时自动重启,可直接用Docker自带的热更新能力给运行中容器在线配置重启策略,操作全程不中断现有业务、不需要重启容器、不需要修改镜像,执行命令如下:
# 异常退出始终自动重启 docker update --restart=always <你的业务容器ID或名称> # 推荐日常维护用策略:异常退出自动重启,手动停止后不会随Docker服务重启自动拉起 docker update --restart=unless-stopped <你的业务容器ID或名称>
配置生效后,Docker daemon会持续监控容器状态,只要容器异常退出、宿主机重启、Docker服务重启,都会自动将业务容器拉起,不需要部署任何额外监控组件。
注意:以上所有操作均在业务容器外部完成,不会修改业务容器的内部配置、不会重启当前运行的业务进程,完全满足不能改动现有业务镜像/容器的约束。
内容的提问来源于stack exchange,提问作者Sado
相关产品推荐
相关产品推荐

