Docker守护进程不自带自动报警功能,需结合events监听启动失败、HEALTHCHECK巡检状态、Stats API监控资源指标,并统一接入钉钉或邮件通知。

Docker 守护进程本身不提供开箱即用的异常自动报警功能,但可通过其内置机制(如事件流、健康检查、Stats API)配合外部脚本或工具构建完整的“状态监控→异常识别→自动通知”闭环。关键在于利用守护进程暴露的能力,而非等待它主动告警。
监听 docker events 实时捕获启动失败
Docker 守护进程持续输出容器生命周期事件,docker events 是最轻量、最直接的状态监控入口。启动失败通常表现为 start 后极短时间内触发 die 事件。
- 基础过滤:运行
docker events --filter 'event=die' --format '{{.Actor.Attributes.name}} {{.Status}}'可捕获所有异常退出容器 - 精准识别启动失败:需关联 start 和 die 时间戳。例如用临时文件记录某容器 start 时间,5 秒内若出现同名 die 事件,即可判定为启动失败(常见于端口占用、配置错误、镜像拉取失败)
- 建议搭配简单去重逻辑(如按容器名+时间窗口缓存),避免同一失败反复触发告警
启用 HEALTHCHECK 并定期巡检健康状态
在 Dockerfile 或 docker-compose.yml 中定义健康检查,让容器自己“汇报状态”,比被动监听更可靠。
- 示例配置:
HEALTHCHECK --interval=10s --timeout=3s --start-period=40s --retries=2 CMD curl -f http://localhost:8080/health || exit 1 - 独立巡检脚本每 10–15 秒执行一次:
docker inspect --format='{{.State.Health.Status}}' container_name - 连续 2 次返回
unhealthy或长期卡在starting,即调用通知函数;none状态说明健康检查未启用,也应纳入告警范围
调用 Docker Stats API 获取资源级异常指标
当容器仍在运行但已失能(如 CPU 占满、内存 OOM 前兆、网络中断),仅靠事件或健康检查可能滞后。Stats API 提供实时资源快照。
- Python 示例:使用
docker-py库获取容器 stats,计算内存使用率:stats['memory_stats']['usage'] / stats['memory_stats']['limit'] - 设定阈值(如内存 >90%、CPU 持续 >95% 超过 60 秒),触发告警并附带具体数值和容器标签
- 注意:Stats API 流式响应需设置超时与重连,避免监控服务因单个容器阻塞而失效
统一接入通知通道(如钉钉/邮件)
所有检测路径最终应汇聚到同一通知出口,便于维护和审计。
- 钉钉机器人需开启「自定义关键词」(如“Docker 异常”),并在请求 body 中包含该词,否则消息会被拦截
- cURL 示例:
curl -H "Content-Type: application/json" -d '{"msgtype":"text","text":{"content":"⚠️ 容器 api-gateway 内存使用率达 94%,已持续 90 秒"}}' https://oapi.dingtalk.com/robot/send?access_token=xxx - 邮件通知建议封装为 shell 函数,复用 SMTP 配置,避免在多个脚本中硬编码账号密码











