关键在于将容器状态变化转化为可采集、可告警、可追溯的数据流,通过 docker events 实时监听、inspect/stats 定期快照、prometheus+cadvisor 长期分析三层手段覆盖全生命周期,并结合健康检查与重启策略实现自愈闭环。

直接监控 Docker 容器生命周期,关键不是只看“容器在不在”,而是把状态变化变成可采集、可告警、可追溯的数据流。核心在于结合命令行观察、事件监听和指标聚合三层手段,覆盖从创建到删除的完整链路。
用 docker events 实时捕获状态变更
这是最轻量、最接近内核的生命周期监控方式。Docker daemon 会持续广播容器事件,比如 start、die、pause、unpause、oom 等。
- 运行
docker events --filter event=start --filter event=die --filter event=oom可实时看到关键动作 - 配合
--format '{{json .}}'输出结构化日志,便于接入 ELK 或 Loki - 注意:默认只监听本地 daemon;多节点环境需在每台宿主机部署监听 agent,或统一接入 Swarm/Engine API
定期轮询 inspect + stats 获取状态快照
适用于需要精确状态值(如退出码、OOM 标记、启动时间)和资源上下文的场景。
-
docker inspect -f '{{.State.Status}} {{.State.ExitCode}} {{.State.OOMKilled}}' <id></id>返回类似exited 137 true,能明确区分是主动退出还是被 OOM 杀掉 -
docker stats --no-stream --format "{{.Container}}: {{.Status}} (CPU: {{.CPUPerc}}, Mem: {{.MemPerc}})"把运行态和资源使用合并输出 - 建议每 5–10 秒执行一次,避免高频调用影响宿主机性能
对接 Prometheus + cAdvisor 做长期趋势分析
单一容器的状态瞬时值价值有限,真正有用的是“某容器连续三次重启”“某服务在 pause 状态停留超 2 分钟”这类模式。
- cAdvisor 自动暴露
/metrics,提供container_last_seen、container_status、container_start_time_seconds等指标 - Prometheus 抓取后,可用 PromQL 查询异常行为,例如:
count by (container_label_com_docker_compose_service) (changes(container_last_seen[1h]) == 0)找出一小时没更新的“僵尸容器” - 搭配 Alertmanager 设置规则:当
container_status{state="exited"} == 1持续 60 秒,且container_state_reason{reason="OOMKilled"} == 1,立即触发内存告警
用健康检查 + restart policy 构建自愈闭环
监控不只是“看见”,更要推动自动响应。Docker 原生支持基于状态的恢复机制。
- 启动时加
--health-cmd "curl -f http://localhost/health || exit 1" --health-interval=30s --restart=on-failure:3 - 容器健康失败后,Docker 会按策略重启;配合
docker ps --filter health=unhealthy可快速定位问题实例 - 注意:health check 是应用层逻辑,而
OOMKilled属于内核层终止,两者需分开配置告警和处理路径











