Docker 作为主流的容器化技术,在安装、部署、运行、网络 / 存储等环节常出现各类问题,以下整理了高频常见问题 + 原因 + 解决方案,覆盖新手到进阶场景:
一、安装与启动类问题
1. Docker 启动失败(Linux)
现象 :执行systemctl start docker报错,或docker ps提示连接失败。常见原因:
- 系统内核版本过低(Docker 要求 Linux 内核≥3.10);
- 防火墙 / SELinux 拦截;
- Docker 配置文件错误;
- 挂载的 overlay2 存储驱动异常。解决方案:
bash
运行
# 1. 检查内核版本
uname -r # 低于3.10需升级内核
# 2. 临时关闭SELinux
setenforce 0
# 3. 重启Docker并查看日志定位问题
systemctl restart docker
journalctl -u docker -f # 查看启动日志
# 4. 重置存储驱动(若报overlay2错误)
rm -rf /var/lib/docker/* # 注意:会清空所有镜像/容器,谨慎操作
systemctl restart docker
2. Windows/macOS 安装后 Docker Desktop 卡死
现象 :Docker Desktop 启动后卡在 "Starting",或闪退。原因:
- Hyper-V/Windows Subsystem for Linux (WSL2) 未开启;
- 资源分配不足;
- 旧版本残留配置冲突。解决方案:
- Windows:开启 WSL2(管理员运行
wsl --install),重启电脑后重新安装; - macOS:关闭 "文件保险箱",或重置 Docker(点击 Docker Desktop 设置→Reset→Reset to Factory Defaults);
- 分配更多资源(设置→Resources,CPU≥2 核,内存≥4GB)。
二、镜像操作类问题
1. 拉取镜像超时 / 失败(如docker pull ubuntu)
现象 :提示 "Timeout""no basic auth credentials" 或镜像拉取中断。原因:
- 官方镜像源(Docker Hub)访问慢;
- 网络代理 / 防火墙拦截;
- 私有镜像仓库认证失败。解决方案:
bash
运行
# 1. 配置国内镜像源(Linux修改/etc/docker/daemon.json)
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://hub-mirror.c.163.com", "https://mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload && systemctl restart docker
# 2. 私有仓库认证(若拉取私有镜像)
docker login [私有仓库地址] # 输入用户名密码
2. 镜像体积过大,清理困难
现象 :docker system df显示镜像占用大量磁盘空间,删除后空间未释放。原因 :未清理悬空镜像(dangling images)、未使用的中间层。解决方案:
bash
运行
# 1. 清理悬空镜像(无标签的镜像)
docker rmi $(docker images -f "dangling=true" -q)
# 2. 一键清理未使用的镜像、容器、网络、卷(谨慎:会删除停止的容器)
docker system prune -a -f
# 3. 清理卷(需确认无重要数据)
docker volume prune -f
三、容器运行类问题
1. 容器启动后立即退出(docker run后docker ps -a显示 Exited)
现象 :执行docker run [镜像名]后容器快速退出,无日志输出。原因:
- 容器无前台运行的进程(Docker 容器需保持一个前台进程才不会退出);
- 命令执行失败(如脚本错误、端口被占用);
- 权限不足(如挂载目录无读写权限)。解决方案:
bash
运行
# 1. 查看容器日志定位原因
docker logs [容器ID/名称]
# 2. 强制前台运行(以ubuntu为例)
docker run -it --rm ubuntu /bin/bash # -it交互模式,--rm退出后删除容器
# 3. 端口冲突解决(替换8080为未占用端口)
docker run -p 8081:80 nginx # 主机8081映射容器80
2. 容器内无法访问外网
现象 :容器内ping baidu.com失败,或无法下载依赖。原因:
- Docker 网桥(docker0)配置异常;
- 容器 DNS 配置错误;
- 主机 iptables 规则拦截。解决方案:
bash
运行
# 1. 进入容器修改DNS(临时)
docker exec -it [容器ID] /bin/bash
echo "nameserver 8.8.8.8" > /etc/resolv.conf
# 2. 永久配置DNS(修改daemon.json)
cat > /etc/docker/daemon.json << EOF
{
"dns": ["8.8.8.8", "114.114.114.114"]
}
EOF
systemctl restart docker
四、网络与端口类问题
1. 端口映射失败(docker run -p提示端口被占用)
现象 :执行docker run -p 80:80 nginx报错 "port is already allocated"。原因 :主机端口已被其他进程(如 nginx、Apache)占用。解决方案:
bash
运行
# 1. 查找占用端口的进程
netstat -tulpn | grep 80 # Linux
lsof -i :80 # macOS/Windows(需安装lsof)
# 2. 杀死占用进程(谨慎)
kill -9 [进程ID]
# 3. 更换映射端口
docker run -p 8080:80 nginx
2. 容器间无法通信(同一网络下 ping 不通)
现象 :两个容器在自定义网络中,互相 ping 容器名 / IP 失败。原因:
- 未加入同一自定义网络(默认 bridge 网络不支持容器名解析);
- 容器防火墙拦截;
- 网络驱动异常。解决方案:
bash
运行
# 1. 创建自定义网络
docker network create my-network
# 2. 启动容器时加入该网络
docker run -d --name nginx1 --network my-network nginx
docker run -d --name nginx2 --network my-network nginx
# 3. 测试通信(进入nginx1 ping nginx2)
docker exec -it nginx1 ping nginx2 # 可通过容器名解析
五、数据持久化(卷挂载)问题
1. 挂载目录后容器内无文件 / 权限拒绝
现象 :docker run -v /host/path:/container/path nginx后,容器内 /container/path 无文件,或提示 "Permission denied"。原因:
- 主机目录不存在(Docker 不会自动创建);
- 主机目录权限过低(如 700,容器进程无访问权限);
- SELinux 限制(Linux)。解决方案:
bash
运行
# 1. 创建主机目录并赋予权限
mkdir -p /host/path
chmod 777 /host/path # 测试用,生产环境按需设置(如755)
# 2. 关闭SELinux(临时)
setenforce 0
# 3. 重新挂载
docker run -v /host/path:/container/path nginx
六、进阶问题:Docker Compose 相关
1. docker-compose up报错 "service not found"
现象 :执行docker-compose up提示 "ERROR: Service 'xxx' not found"。原因:
- docker-compose.yml 文件语法错误(如缩进、字段拼写错误);
- 未在 yml 文件所在目录执行命令;
- Compose 版本与 yml 语法不兼容(如 v2 vs v3)。解决方案:
bash
运行
# 1. 检查yml语法
docker-compose config # 验证配置文件语法
# 2. 切换到yml所在目录
cd /path/to/compose/file
# 3. 指定yml文件(若文件名不是docker-compose.yml)
docker-compose -f my-compose.yml up