Docker 故障排查
本章将介绍 Docker 常见问题的诊断方法和解决方案,帮助你快速定位和修复容器化应用中的故障。
诊断工具
查看容器状态
bash
# 查看所有容器(包括已停止的)
docker ps -a
# 查看容器详细信息
docker inspect <container>
# 查看容器日志
docker logs <container>
docker logs --tail 100 -f <container>
# 查看容器进程
docker top <container>
# 查看容器资源使用
docker stats <container>
# 查看容器文件系统变更
docker diff <container>查看系统信息
bash
# Docker 系统信息
docker info
# Docker 版本
docker version
# 磁盘使用情况
docker system df
docker system df -v
# 查看 Docker 事件
docker events
docker events --since "2024-01-01"容器启动问题
容器立即退出
症状:容器启动后立即变为 Exited 状态。
bash
# 查看退出码
docker ps -a --filter "name=myapp"
# 查看日志
docker logs myapp常见原因和解决方案:
| 退出码 | 含义 | 解决方案 |
|---|---|---|
| 0 | 正常退出 | 检查 CMD/ENTRYPOINT 是否为前台进程 |
| 1 | 应用错误 | 查看日志排查应用错误 |
| 137 | OOM Killed | 增加内存限制 -m |
| 139 | 段错误 | 检查应用代码 |
| 143 | SIGTERM | 正常停止信号 |
bash
# 容器立即退出的常见修复
# 确保主进程在前台运行
docker run -d nginx # ✅ nginx 默认前台运行
docker run -d ubuntu sleep infinity # ✅ 保持容器运行
docker run -d ubuntu # ❌ 没有前台进程,立即退出容器无法启动
bash
# 查看详细错误
docker logs myapp
# 以交互模式调试
docker run -it --entrypoint /bin/sh myimage
# 检查镜像是否正常
docker inspect myimage网络问题
容器无法访问外网
bash
# 检查 DNS 配置
docker exec myapp cat /etc/resolv.conf
# 测试网络连通性
docker exec myapp ping 8.8.8.8
docker exec myapp nslookup google.com
# 检查 iptables 规则
sudo iptables -L -n -t nat解决方案:
bash
# 配置 DNS
docker run --dns 8.8.8.8 myapp
# 或在 daemon.json 中配置
{
"dns": ["8.8.8.8", "8.8.4.4"]
}容器间无法通信
bash
# 检查容器是否在同一网络
docker network inspect bridge
# 使用自定义网络(推荐)
docker network create mynet
docker run -d --name app1 --network mynet nginx
docker run -d --name app2 --network mynet nginx
# 测试通信
docker exec app1 ping app2端口冲突
bash
# 查看端口占用
docker ps --format "table {{.Names}}\t{{.Ports}}"
# 检查宿主机端口占用(Linux)
ss -tlnp | grep :80
# 检查宿主机端口占用(Windows)
netstat -ano | findstr :80存储问题
磁盘空间不足
bash
# 查看 Docker 磁盘使用
docker system df
# 清理未使用的资源
docker system prune -a
# 清理悬空镜像
docker image prune
# 清理未使用的数据卷
docker volume prune
# 清理已停止的容器
docker container prune
# 清理构建缓存
docker builder prune数据卷问题
bash
# 查看数据卷列表
docker volume ls
# 查看数据卷详情
docker volume inspect myvolume
# 检查数据卷挂载
docker inspect -f '{{json .Mounts}}' myapp | python3 -m json.tool镜像问题
镜像拉取失败
bash
# 检查网络连接
ping registry-1.docker.io
# 配置镜像加速器
# 编辑 /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
# 重启 Docker
sudo systemctl restart docker镜像构建失败
bash
# 查看构建详细输出
docker build --progress=plain -t myapp .
# 不使用缓存重新构建
docker build --no-cache -t myapp .
# 检查 Dockerfile 语法
# 确保 COPY 的文件在构建上下文中
# 检查 .dockerignore 是否排除了必要文件Docker Daemon 问题
Docker 服务无法启动
bash
# 检查服务状态
sudo systemctl status docker
# 查看详细日志
sudo journalctl -xu docker.service
# 检查配置文件语法
cat /etc/docker/daemon.json | python3 -m json.tool
# 重启 Docker
sudo systemctl restart dockerDocker 命令无响应
bash
# 检查 Docker socket
ls -la /var/run/docker.sock
# 检查 Docker 进程
ps aux | grep dockerd
# 重启 Docker Daemon
sudo systemctl restart docker性能问题
容器 CPU 使用过高
bash
# 查看容器资源使用
docker stats
# 进入容器查看进程
docker exec -it myapp top
# 限制 CPU
docker update --cpus 1 myapp容器内存泄漏
bash
# 监控内存使用
docker stats --format "table {{.Name}}\t{{.MemUsage}}\t{{.MemPerc}}"
# 设置内存限制(超出会被 OOM Kill)
docker update -m 512m myapp
# 查看 OOM 事件
docker inspect myapp | grep -i oom
dmesg | grep -i oomDocker Compose 问题
bash
# 查看服务状态
docker compose ps
# 查看服务日志
docker compose logs
docker compose logs <service-name>
# 重建服务
docker compose up -d --build
# 重新创建容器
docker compose up -d --force-recreate
# 验证配置文件
docker compose config常用排查流程
1. docker ps -a → 查看容器状态
2. docker logs <id> → 查看容器日志
3. docker inspect <id> → 查看容器配置
4. docker exec -it <id> sh → 进入容器调试
5. docker stats → 查看资源使用
6. docker system df → 查看磁盘使用
7. docker events → 查看系统事件本章小结
Docker 故障排查的核心是善用 docker logs、docker inspect 和 docker stats 等诊断工具。大多数问题可以归类为启动问题、网络问题、存储问题和性能问题,按照系统化的排查流程可以快速定位和解决。