Docker 容器故障排查

一、基础检查流程

1. 服务状态检查

  • Docker服务状态systemctl status dockerservice docker status

  • 守护进程健康docker info(正常返回系统信息,异常显示错误)

  • 容器状态docker ps -a(所有容器)、docker stats --no-stream(资源使用)

  • Docker日志journalctl -u docker 或查看 /var/log/docker.log

2. 容器基础信息

  • 详细配置docker inspect <容器>

  • 容器日志docker logs(可加 -f 实时、--tail 行数、--since 时间)

  • 容器进程docker top <容器>

3. 网络连通性测试

  • 端口映射docker port <容器>

  • 容器内网络docker exec <容器> ping/curl 测试外网

  • 主机到容器telnetnc -zv 测试端口

  • 网络模式docker network inspect bridge


二、配置验证

1. 配置文件检查

  • 守护进程配置/etc/docker/daemon.json,用 docker info 验证生效

  • 容器启动命令docker inspect --format '{``{.Config.Cmd}}' <容器>

  • Dockerfile 语法docker build --no-cache --progress=plain -t test:tmp .

  • docker-compose 配置docker-compose config 检查语法

2. 常见配置问题点

  • 资源限制 :内存(--memory)、CPU(--cpus)是否合理

  • 卷挂载:宿主机路径是否存在、权限是否正确、读写模式

  • 网络配置:端口映射是否冲突、网络模式是否匹配

  • 环境变量:是否遗漏或错误注入敏感信息


三、详细诊断方法

1. 调试模式操作

  • 交互启动docker run -it --rm --entrypoint /bin/sh <镜像>

  • 添加调试工具docker exec -it <容器> apt/yum install -y net-tools

  • 启用守护进程调试 :在 daemon.json 中添加 "debug": true 并重启

2. 容器健康检查矩阵(关键检查项)

测试类型 命令示例 预期结果
基础连接 docker exec <容器> curl localhost:端口 200 OK
卷读写 touch /挂载点/test && rm -f /挂载点/test 无错误
环境变量 `docker exec <容器> env grep 关键变量`
健康状态 docker inspect --format '{``{.State.Health.Status}}' healthy
重启策略 docker inspect --format '{``{.HostConfig.RestartPolicy.Name}}' always/on-failure
镜像完整性 docker image inspect --format '{``{.Id}}' <镜像> 与仓库ID一致

3. 常见错误代码与解决方案

错误信息 含义 解决方案
port is already allocated 端口占用 更换端口或停止占用进程
no space left on device 磁盘不足 docker system prune -a
permission denied 权限不足 检查挂载目录权限或使用 --user
unauthorized: authentication required 仓库认证失败 docker login
container <ID> is not running 容器未运行 docker logs <ID> 查看日志
context deadline exceeded 操作超时 增加超时时间 export DOCKER_CLIENT_TIMEOUT=120

四、高级诊断工具

1. 容器监控

  • ctop:可视化实时监控(需安装)

  • 资源历史docker stats --no-stream --format "table ..."

  • 存储使用docker system dfdu -sh /var/lib/docker/volumes/

2. 网络诊断

  • 容器内抓包 :使用 nicolaka/netshoot 镜像运行 tcpdump

  • 网络命名空间nsenter -t $(docker inspect -f '{``{.State.Pid}}' <容器>) -n netstat -tulnp

  • DNS 测试docker run --rm --net container:<容器> nicolaka/netshoot nslookup

3. 深入容器内部

  • 文件系统变化docker diff <容器>

  • 导出文件系统docker export <容器> | tar -xf - -C /tmp/container-fs

  • 跟踪系统调用 :获取容器 PID 后使用 strace -p $pid


五、常见问题解决方案

1. 容器无法启动

  • 检查docker inspect 查看状态和错误,docker logs 查看日志

  • 可能原因:启动命令错误、依赖未就绪、资源不足、卷挂载失败

  • 解决

    • 手动执行启动命令调试:docker run --rm -it --entrypoint /bin/sh <镜像> -c "<原命令>"

    • 修复卷权限:chown -R 1000:1000 /宿主路径

    • 临时移除资源限制:docker update --memory-remove <容器>

2. 容器网络不通

  • 检查 :DNS 配置(/etc/resolv.conf)、防火墙规则(iptables -L DOCKER-USER)、逐级 ping 测试

  • 解决 :重启 Docker 网络(systemctl restart docker)、重建网络、检查 SELinux/AppArmor

3. 卷挂载问题

  • 检查docker volume inspect、挂载点权限、挂载模式

  • 解决:修复权限、使用命名卷代替绑定挂载、检查路径特殊字符

4. 容器资源耗尽

  • 检查dmesg \| grep -i 'out of memory'docker inspect 查看限制、docker stats 查看实时

  • 解决 :调整资源限制(docker update --memory 2g --cpus 1)、优化应用、配合编排工具自动扩缩容


六、维护检查清单

1. 日常检查

bash

复制代码
docker ps -f "status=exited" -f "exited=1"   # 异常退出的容器
docker images --filter "dangling=true"       # 虚悬镜像
free -h                                      # 内存
df -h /var/lib/docker                        # Docker 磁盘

2. 每周维护

  • 清理无用资源docker system prune -af --volumes(谨慎,会删除未使用的卷)

  • 安全漏洞扫描docker scan <镜像>(需安装插件)

  • 备份数据卷 :使用 alpine 容器打包卷内容

3. 应急工具包

  • 导出容器配置docker inspect <容器> > config_backup.json

  • 保存容器状态docker commit <容器> <镜像>:emergency-backup

  • 快速恢复 :用 jq 解析备份配置重新运行容器


总结

  • 排查思路:服务状态 → 容器状态 → 日志分析 → 配置验证 → 网络/卷/资源深入诊断。

  • 常用命令docker logsdocker inspectdocker execdocker statsdocker system prune

  • 预防措施:定期清理、监控资源、配置健康检查、备份重要数据。

  • 推荐工具ctop(监控)、nicolaka/netshoot(网络诊断)、docker scan(安全)。

相关推荐
Shining05963 小时前
QEMU 编译开发环境搭建
人工智能·语言模型·自然语言处理·云原生·qemu·vllm·华为昇腾
匀泪20 小时前
云原生(Kubernetes service微服务)
微服务·云原生·kubernetes
倔强的胖蚂蚁21 小时前
Ollama Modelfile 配置文件 全指南
云原生·开源
AutoMQ1 天前
AWS 新发布的 S3 Files 适合作为 Kafka 的存储吗?
云原生·消息队列·云计算
MY_TEUCK1 天前
从零开始:使用Sealos Devbox快速搭建云原生开发环境
人工智能·spring boot·ai·云原生·aigc
没有口袋啦2 天前
《基于 GitOps 理念的企业级自动化 CI/CD 流水线》
阿里云·ci/cd·云原生·自动化·k8s
柯西劝我别收敛2 天前
Koordinator-Scheduler 调度器源码解析
后端·云原生
行者-全栈开发2 天前
拆解高可用CRM网站的容灾设计与云原生实践
微服务·云原生·异地多活·监控告警·高可用设计·crm架构·容灾演练
Crazy________2 天前
4.13docker仓库registry
mysql·算法·云原生·eureka