You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动