一、基础检查流程
1. 服务状态检查
-
Docker服务状态 :
systemctl status docker或service 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测试外网 -
主机到容器 :
telnet、nc -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 df、du -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 logs、docker inspect、docker exec、docker stats、docker system prune。 -
预防措施:定期清理、监控资源、配置健康检查、备份重要数据。
-
推荐工具 :
ctop(监控)、nicolaka/netshoot(网络诊断)、docker scan(安全)。