故障排查
12.1 Docker Daemon 无法启动
# 查看 Docker 服务状态
sudo systemctl status docker
# 查看详细日志
sudo journalctl -u docker.service -f --no-pager -n 100
# 常见原因及解决
# 1. 端口冲突(2375/2376)
sudo lsof -i :2375
# → 杀掉占用进程或修改 daemon.json 中的 hosts
# 2. daemon.json 语法错误
cat /etc/docker/daemon.json | python3 -m json.tool
# → 修复 JSON 语法
# 3. 磁盘空间不足
df -h
docker system df
docker system prune -af
# 4. 存储驱动问题
sudo ls -la /var/lib/docker/
# → 检查权限
# 5. cgroups 问题
sudo mount | grep cgroup
# → 确保 cgroup 已挂载
12.2 容器启动失败
# 查看容器日志
docker logs <container_name>
# 查看容器退出码
docker inspect <container_name> --format '{{.State.ExitCode}}'
# 退出码含义
# 0 → 正常退出
# 1 → 应用错误
# 126 → 命令不可执行(权限问题)
# 127 → 命令找不到(路径错误)
# 137 → 被 SIGKILL(内存不足 OOM)
# 139 → 段错误 SIGSEGV
# 143 → 被 SIGTERM(docker stop)
# 常见原因
# 1. 端口已被占用
docker port <container>
sudo lsof -i :8080
# → 改用其他端口或停止占用进程
# 2. 依赖服务未启动
docker compose ps
docker compose logs db
# → 先启动依赖服务
# 3. 配置文件错误
docker exec <container> cat /etc/nginx/nginx.conf
# → 检查配置文件语法
# 4. 权限问题
docker exec <container> ls -la /app
# → 检查文件权限和 USER 指令
# 5. 环境变量缺失
docker exec <container> env
# → 确保所有必需的环境变量已设置
12.3 网络问题
# 容器间无法通信
docker network inspect bridge
docker exec web ping db
# → 确保在同一网络中
# DNS 解析失败
docker exec web nslookup db
docker exec web cat /etc/resolv.conf
# → 检查 DNS 配置
# 端口映射不生效
docker port web
# → 检查 -p 参数格式:宿主:容器
# 容器无法访问外网
docker exec web ping google.com
# → 检查宿主机网络和 iptables
sudo iptables -L -n | grep DOCKER
# 网络重置
docker network prune
docker compose down
docker compose up -d
12.4 存储问题
# 磁盘空间不足
docker system df
docker system df -v
# → 清理未使用资源
docker system prune -a --volumes
# Volume 数据丢失
docker volume ls
docker volume inspect <volume_name>
# → 检查 Volume 是否被误删
# 权限拒绝
docker exec web ls -la /data
# → 检查 Volume 挂载权限
docker run --user $(id -u):$(id -g) -v mydata:/data alpine
# 存储驱动问题
docker info | grep "Storage Driver"
# → 确保使用 overlay2
12.5 构建失败
# 缓存失效导致构建慢
docker build --no-cache -t myapp .
# → 检查 Dockerfile 顺序
# 依赖下载超时
docker build --build-arg HTTP_PROXY=http://proxy:8080 -t myapp .
# → 配置代理
# Dockerfile 语法错误
docker build -t myapp . 2>&1 | head -20
# → 逐行检查 Dockerfile
# 构建上下文太大
ls -la .
du -sh node_modules/ .git/
# → 添加 .dockerignore
12.6 性能问题
# 容器 CPU 占用高
docker stats
docker top <container>
# → 检查容器内进程
# 内存 OOM
dmesg | grep -i "oom\|killed"
docker inspect <container> --format '{{.State.OOMKilled}}'
# → 增加内存限制或优化应用
# I/O 瓶颈
docker stats
# → 使用 Volume 而非 Bind Mount
# → 检查宿主机磁盘 I/O
iotop
12.7 常见错误速查表
| 错误信息 | 原因 | 解决方案 |
|---|
Cannot connect to the Docker daemon | Docker 未启动 | sudo systemctl start docker |
permission denied while trying to connect | 用户不在 docker 组 | sudo usermod -aG docker $USER |
port is already allocated | 端口被占用 | sudo lsof -i :端口 并停止占用进程 |
no space left on device | 磁盘空间不足 | docker system prune -af |
image not found | 镜像不存在 | 检查镜像名和标签 |
network not found | 网络不存在 | docker network create mynet |
volume not found | 卷不存在 | docker volume create mydata |
container is not running | 容器已停止 | docker start <container> |
OCI runtime create failed | 运行时错误 | 检查内核版本和存储驱动 |
manifest unknown | 标签不存在 | 检查远程仓库中的标签 |
toomanyrequests | 请求过多(Docker Hub 限速) | 使用镜像加速器或等待 |
TLS handshake timeout | 网络超时 | 配置镜像加速器或代理 |
name is already in use | 容器名冲突 | docker rm <旧容器> 或用新名 |
Error processing tar file | 镜像损坏 | 重新拉取镜像 |
12.8 调试技巧
# 进入容器调试
docker exec -it <container> sh
# 查看容器详细信息
docker inspect <container>
# 查看容器资源使用
docker stats --no-stream
# 查看容器文件系统变化
docker diff <container>
# 复制文件出来分析
docker cp <container>:/app/logs ./logs
# 查看 Docker daemon 日志
sudo journalctl -u docker.service -f
# 使用 Docker events 监控
docker events --since 1h