Docker容器运行时故障排查SRE
场景
你正在值班,收到告警:一个关键容器化应用启动后立即崩溃,或陷入重启循环。该容器运行在生产环境的 Docker 主机上,应用日志无明显错误。
症状
- 容器退出码为 137(OOMKilled)、139(段错误)或 1(通用错误)。
- 在 Kubernetes 中容器状态显示 CrashLoopBackOff,Docker 中显示 restarting。
docker logs <容器>输出为空或不完整。
诊断
- 检查容器退出码:
docker inspect <容器> --format '{{.State.ExitCode}}' - 检查资源限制:
docker inspect <容器> --format '{{.HostConfig.Memory}}'以及 CPU 份额。 - 查看系统日志:
journalctl -u docker.service -n 100 --no-pager寻找 OOM 杀死或驱动错误。 - 使用
dmesg | grep -i kill查看内核 OOM 杀手消息。 - 测试运行时健康:
docker run --rm -it --runtime=runc hello-world - 检查存储驱动问题:
docker info | grep "Storage Driver"
关键命令
- 安全重启 Docker 守护进程:
systemctl restart docker(需谨慎)。 - 清理卡住的容器:
docker rm -f <容器> - 调整容器内存限制:
docker update --memory=512m --memory-swap=512m <容器> - 使用 cgroups 调试:
find /sys/fs/cgroup/memory/docker -name "memory.limit_in_bytes" -exec cat {} \;
风险控制
- 重启 Docker 前,先排空节点负载或确保有副本(若使用 Kubernetes)。
- 避免强制杀死关键事务中的容器;优先优雅关闭。
- 所有变更先在预发环境测试。
回滚
- 还原内存限制:
docker update --memory=2g --memory-swap=2g <容器>(恢复原始值)。 - 恢复旧镜像:
docker pull <镜像>:旧标签 && docker stop <容器> && docker rm <容器> && docker run --restart=always ... - 若 Docker 重启导致问题,可通过
systemctl reload docker或发送 HUP 信号重新加载配置。
验证
- 变更后,通过
docker events --since 5m监控容器启停。 - 运行
docker stats --no-stream查看资源使用。 - 使用 curl 检查应用健康端点。
何时提交 OpsGlobal 工单
- 调整资源后仍持续出现运行时错误。
- Docker overlay 文件系统损坏,需要数据恢复。
- 出现内核或 Docker 引擎 bug,需要供应商升级。
适用场景
适合正在处理 DevOps、Docker, 容器运行时, 故障排查, SRE 相关问题的团队,用于快速建立排查路径和交付标准。
问题背景
深入解析 Docker 容器运行时问题的常见场景、症状、诊断步骤、命令、风险控制、回滚及验证方法,以及何时联系 OpsGlobal 专家。
排查步骤
先确认影响范围和最近变更,再收集日志、配置、指标和链路数据,最后按风险从低到高执行修复。
命令示例
示例命令请替换为你的真实资源名,并使用环境变量保存账号、密码、token 等敏感信息。
风险说明
生产环境操作前需要确认备份、权限边界、变更窗口和回滚路径,避免扩大故障影响。
回滚方案
保留原配置和发布版本;如修复后指标异常,立即回退配置、镜像或数据库变更并复核日志。
交付清单
问题定位记录、关键命令、修复步骤、验证结果、后续优化建议。
遇到类似技术问题?
如果你的服务器、K8s、Docker、CI/CD、数据库或监控系统出现类似问题,可以提交日志和配置文件,我们帮你远程诊断。