当Docker容器报错时,需要系统性地排查问题。以下是常见错误类型及解决方案框架:
典型错误:
ERROR: Container command not found or does not exist
Failed to start container: port already in use
解决方案:
# 检查容器日志(即使未启动成功)
docker logs <container_name>
# 检查端口冲突
netstat -tulnp | grep <port>
# 或
lsof -i :<port>
# 强制删除旧容器
docker rm -f <container_name>
典型错误:
Error response from daemon: pull access denied
解决方案:
# 检查镜像是否存在
docker search <image_name>
# 登录Docker Hub
docker login
# 尝试官方镜像
docker pull library/<image_name>:<tag>
典型错误:
OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:545: container init caused: memory.failcnt
解决方案:
# 启动时增加资源限制
docker run -it --memory="1g" --cpus="1.5" <image_name>
# 查看系统资源
docker stats
典型错误:
Error starting userland proxy: mkdir /port/tcp:0.0.0.0:80:tcp:172.17.0.2:80: input/output error
解决方案:
# 清理Docker存储
docker system prune -a
# 检查存储驱动
docker info | grep "Storage Driver"
# 建议使用overlay2驱动
典型错误:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock
解决方案:
# 检查Docker服务状态
sudo systemctl status docker
# 重启Docker服务
sudo systemctl restart docker
# 权限问题处理
sudo usermod -aG docker $USER
# 检查容器详细配置
docker inspect <container_id>
# 进入故障容器(需容器已运行)
docker exec -it <container_id> /bin/bash
# 查看实时事件流
docker events
# 分析容器文件系统变化
docker diff <container_id>
症状 | 可能原因 | 验证命令 |
---|---|---|
端口不可达 | 端口未暴露/防火墙 | docker port <container> |
持续重启 | 启动命令失败 | docker inspect --format='{{.State.Restarting}}' <container> |
磁盘空间不足 | 镜像/容器堆积 | docker system df |
DNS解析失败 | 网络配置错误 | docker run --dns 8.8.8.8 |
# 按时间过滤日志
docker logs --since 2023-01-01T00:00:00 <container>
# 跟踪最新日志
docker logs -f --tail=50 <container>
# 结合grep过滤
docker logs <container> 2>&1 | grep -i "error"
建议根据具体错误信息选择对应的排查方案。如果问题仍未解决,可以:
1. 提供完整的错误输出
2. 说明Docker版本(docker version
)
3. 描述复现步骤和环境信息(OS、内存等)
需要更具体的解决方案,请提供完整的错误日志和复现步骤。