场景
生产环境中,Docker容器可能因多种原因突然停止、无法启动或表现出异常行为。常见场景包括:容器反复重启(CrashLoopBackOff)、内存泄漏导致OOMKill、磁盘空间耗尽、以及挂载卷权限错误。
症状
- 容器状态为Exited或CrashLoopBackOff(在Kubernetes中)
- 主机日志显示“out of memory”或“cannot allocate memory”
docker ps输出为空或容器列表不完整- 应用无法响应,但容器仍在运行(僵死进程)
诊断
1. 检查容器状态
docker ps -a | grep <container-name>
docker inspect <container-id> --format '{{.State.Status}}'
2. 查看日志
docker logs --tail 100 <container-id>
docker logs --since 5m <container-id>
3. 检查资源使用
docker stats --no-stream <container-id>
4. 分析宿主机资源
free -h
df -h
top -bn1 | head -20
5. 检查Docker守护进程
journalctl -u docker --since "5 minutes ago"
命令
- 重启容器:
docker restart <container-id>(临时缓解) - 删除并重建:
docker rm -f <container-id>然后重新运行 - 进入容器调试:
docker exec -it <container-id> /bin/sh(如果容器仍在运行) - 导出容器文件系统:
docker export <container-id> > container.tar
风险控制
- 在生产环境执行
docker restart前,确保已启用健康检查(healthcheck)并配置了优雅停机(stop_grace_period)。 - 使用
docker rm -f会立即终止进程,可能丢失未持久化的数据。优先使用docker stop给予容器时间处理信号。 - 在Kubernetes中,避免直接使用docker命令操作Pod的容器,应使用
kubectl以避免编排状态不一致。
回滚
- 如果是镜像更新导致的问题,回退到上一个稳定标签:
bash docker pull <image>:<previous-tag> docker-compose up -d (如果使用Compose) - 在Kubernetes中,使用
kubectl rollout undo deployment/<name>回滚到上一个版本。
验证
- 确认容器状态为
Up:docker ps或kubectl get pods - 应用健康检查端点返回200:
curl http://localhost:<port>/health - 资源使用稳定:
docker stats显示内存和CPU在预期范围内 - 日志无错误:
docker logs --tail 50 <container-id>末尾无异常
何时提交OpsGlobal工单
当您遇到以下情况时,请立即提交工单并由我们的SRE团队介入:
- 执行上述步骤后容器仍无法恢复
- 涉及Docker的存储驱动(如overlay2)损坏,需要修复文件系统
- 多个宿主机的Docker守护进程同时出现故障
- 需要分析Docker daemon的coredump或调试模式(-D)日志
- 需要评估和调整Docker的运行时参数(如 --default-ulimit 或 --oom-score-adjust)
适用场景
适合正在处理 DevOps、Docker, 容器运行时, 故障排查, SRE 相关问题的团队,用于快速建立排查路径和交付标准。
问题背景
深入探讨实际的Docker运行时问题,从容器崩溃到资源耗尽,包含诊断命令、风险控制措施以及OpsGlobal的升级路径。
排查步骤
先确认影响范围和最近变更,再收集日志、配置、指标和链路数据,最后按风险从低到高执行修复。
命令示例
示例命令请替换为你的真实资源名,并使用环境变量保存账号、密码、token 等敏感信息。
风险说明
生产环境操作前需要确认备份、权限边界、变更窗口和回滚路径,避免扩大故障影响。
回滚方案
保留原配置和发布版本;如修复后指标异常,立即回退配置、镜像或数据库变更并复核日志。
交付清单
问题定位记录、关键命令、修复步骤、验证结果、后续优化建议。
遇到类似技术问题?
如果你的服务器、K8s、Docker、CI/CD、数据库或监控系统出现类似问题,可以提交日志和配置文件,我们帮你远程诊断。