Skip to content

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应用错误查看日志排查应用错误
137OOM Killed增加内存限制 -m
139段错误检查应用代码
143SIGTERM正常停止信号
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 docker

Docker 命令无响应

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 oom

Docker 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 logsdocker inspectdocker stats 等诊断工具。大多数问题可以归类为启动问题、网络问题、存储问题和性能问题,按照系统化的排查流程可以快速定位和解决。

延伸阅读