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

相关推荐
gwjcloud10 小时前
Kubernetes从入门到精通(高级篇)04
云原生·容器·kubernetes
阿里云云原生10 小时前
阿里云微服务引擎 MSE 及 API 网关 2026 年 4 月产品动态
微服务·云原生
阿里云云原生11 小时前
从“对话式编程”到“规格驱动”:民生银行企业级AI研发范式重构实践
云原生
苍煜12 小时前
现代生产级微服务+容器治理完整技术栈与架构方案详解(国内主流完整云原生微服务闭环架构)
微服务·云原生·架构
邵奈一13 小时前
OrbStack 环境下 Dify 启动报错完整解决方案教程:validating docker-compose.yaml
docker·容器·eureka
倔强的胖蚂蚁14 小时前
Transformer 大模型原理 完整入门指南
人工智能·深度学习·云原生·transformer
苍煜15 小时前
K8s 核心资源详解(Pod/Deployment/Service 实战)
云原生·容器·kubernetes
sbjdhjd16 小时前
企业级 Docker 镜像仓库建设与运维规范
linux·运维·docker·云原生·容器·eureka·开源
云达闲人17 小时前
搭建DevOps企业级仿真实验环境:010Kubernetes 单节点集群完整搭建指南
云原生·kubernetes·devops·devops 实验环境·k8s 集群·flannel 网络插件·kubernetes集群搭建
Jul1en_17 小时前
【SpringCloud】Eureka、Nacos 简单概念笔记
笔记·spring cloud·eureka