Docker Compose中应用挂起或容器崩溃时如何重启容器?是否有类似Kubernetes Readiness的机制及告警方式?
刚好在生产环境里常用这些配置,来给你逐个解决这三个问题:
1. 容器挂起/崩溃时自动重启
Docker Compose 提供了 restart 指令来控制容器退出后的重启行为,完全覆盖你需要的场景,常用的几个选项各有适用场景:
always:不管容器退出状态码是什么,都会持续重启容器(除非你手动停止它)unless-stopped:推荐生产环境使用,会一直重启容器,直到你手动执行docker-compose stop或者 Docker 服务本身停止on-failure[:max-retries]:只有当容器以非0状态退出时才重启,还可以指定最大重试次数(比如on-failure:5表示最多重试5次)
直接在你的docker-compose.yml里加一行就行:
version: '3.8' services: your-app-service: image: your-app-image:latest restart: unless-stopped # 替换成你需要的策略 # 其他配置...
2. 类似Kubernetes Readiness探针的健康检查
Docker Compose 里对应的是 healthcheck 指令,它可以定期检查应用是否处于健康可用状态,和K8s的探针逻辑异曲同工。你可以自定义检查规则——比如发送HTTP请求、检查端口连通性、执行应用内置的健康脚本,一旦连续多次检查失败,Docker会标记容器为不健康状态,结合前面的restart策略就能自动重启异常容器。
举个HTTP接口检查的示例:
version: '3.8' services: your-app-service: image: your-app-image:latest restart: unless-stopped healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:8080/health || exit 1"] interval: 30s # 每30秒执行一次检查 timeout: 10s # 单次检查的超时时间 retries: 3 # 连续3次失败就标记为不健康 start_period: 60s # 容器启动后60秒再开始检查(给应用留初始化时间)
如果你的应用是基于端口的服务,也可以用nc命令检查:test: ["CMD", "nc", "-z", "localhost", "8080"],根据你的应用类型调整就行。
3. 异常状态下的告警通知
Docker本身没有内置告警功能,但有几种实用的实现方式:
- 监听Docker事件:用
docker events命令监听容器的状态变化(比如容器退出、健康状态变为不健康、重启),然后写个简单的脚本把告警信息发送到邮件、Slack、企业微信等平台。比如这个简易监听脚本:
docker events --filter 'event=die' --filter 'event=health_status: unhealthy' | while read event_line; do # 从事件内容里提取容器名称 CONTAINER_NAME=$(echo "$event_line" | awk '{print $NF}') # 发送告警邮件(这里用sendmail做示例,你可以换成自己的通知渠道) echo "容器 $CONTAINER_NAME 状态异常:$event_line" | mail -s "Docker容器告警通知" your-alert-email@example.com done
把这个脚本做成后台服务(比如用systemd管理),就能持续监听并触发告警。
- 用第三方监控工具:比如Prometheus+Grafana、Zabbix这类工具,可以抓取容器的状态指标,设置自定义告警规则,一旦触发就推送通知。
- 可视化管理工具:比如Portainer,它内置了告警功能,可以直接配置当容器状态异常时发送通知到指定渠道。
内容的提问来源于stack exchange,提问作者gamechanger17




