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(安全)。

相关推荐
江畔柳前堤4 小时前
GO01-Go 语言与主流编程语言深度对比
开发语言·人工智能·后端·微服务·云原生·golang·go
探索云原生9 小时前
终于搞懂 Kueue:5 个核心对象一次讲透
linux·docker·ai·云原生·kubernetes
月落星还在10 小时前
Spring MVC 与 Spring Boot:从“手动挡”到“自动驾驶”的进化论,兼谈前后端分离的哲学
spring boot·spring·云原生·mvc
Database_Cool_13 小时前
数据库性能不够用,升级到什么方案好?阿里云 PolarDB(云原生数据库领导者,兼容 MySQL/PostgreSQL/Oracle)平滑升级与百倍弹性
数据库·阿里云·云原生
霸道流氓气质13 小时前
微服务架构核心概念业务示例
微服务·云原生·架构
ai_coder_ai14 小时前
编写自动化脚本,在自己后端服务中使用云原生Baas服务进行数据库相关操作
数据库·云原生·自动化
AOwhisky15 小时前
Python 学习笔记(第六期)——函数:定义、参数传递与作用域
笔记·python·学习·云原生·运维开发·函数·参数传递
小小龙学IT15 小时前
Tigris:下一代无服务器数据库
数据库·云原生·serverless
ai_coder_ai17 小时前
论模型驱动分析方法及应用
微服务·云原生·架构
Hiyajo pray17 小时前
云原生场景下:sdn 访问控制优化方案
云原生