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

相关推荐
椰椰椰耶6 分钟前
[SpringCloud][12]Nacos配置中心详解,快速上手,Nacos和Eureka的区别
spring·spring cloud·eureka
IT策士17 分钟前
第30篇 k8s之Ingress 基础:域名路由与 Ingress Controller
云原生·容器·kubernetes
Dongwoo Jeong13 小时前
微服务架构(MSA)是如何诞生的?
微服务·云原生·架构
半旧夜夏14 小时前
【保姆级】微服务组件环境搭建(Docker Compose版)
java·linux·spring cloud·微服务·云原生·容器
阿里云云原生14 小时前
实战解析:如何用自然语言驱动混沌工程?Blade AI Agent 实现故障演练全链路自动化
云原生
张忠琳15 小时前
【kubernetes v1.21】(kubelet 1)Kubelet 核心架构与启动流程
云原生·架构·kubernetes·kubelet
宇明一不急16 小时前
k8s HPA storageclass configmap
云原生·容器·kubernetes
ZzzZZzzzZZZzzzz…18 小时前
Docker + K8s集群搭建实战:1 Master+2 Node,含Harbor私有仓库与软路由
docker·云原生·容器·kubernetes·容器编排·集群部署·cri-dockerd
Waay19 小时前
K8s新手实操|emptyDir卷超详细实战(附完整命令+核心理解)
云原生·容器·kubernetes
liux352819 小时前
K8s 核心接口:CNI、CSI、CRI、LB 一篇讲透
云原生·容器·kubernetes