故障排查

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 daemonDocker 未启动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