Appearance
常见问题 FAQ
安装问题
Q: Docker 安装后 docker run 提示 Permission denied
A: 将当前用户加入 docker 组:
bash
sudo usermod -aG docker $USER
newgrp docker
# 或退出重新登录Q: Docker Desktop 在 Windows 上无法启动
A: 检查以下几点:
- 确认 BIOS 开启了虚拟化(VT-x/AMD-V)
- 确认 Hyper-V 已启用(或 WSL 2 已安装)
- 尝试以管理员权限运行
- 重置 Docker Desktop:Settings → Troubleshoot → Reset to factory defaults
Q: 拉取镜像很慢或超时
A: 配置国内镜像加速,参见镜像加速配置。
容器问题
Q: 容器启动后立即退出
A: 查看容器退出原因:
bash
# 查看退出码
docker inspect mycontainer --format '{{.State.ExitCode}}'
# 查看日志
docker logs mycontainer
# 交互式运行排查
docker run -it myimage bash常见原因:
- CMD 命令执行后退出(正常退出)
- 启动命令找不到(exit code 127)
- 应用启动失败(查看日志)
Q: 无法连接到容器内的服务
A: 检查:
- 容器是否在运行:
docker ps - 端口是否映射:
docker port mycontainer - 应用是否监听
0.0.0.0而非127.0.0.1 - 防火墙是否阻止
bash
# 检查端口映射
docker port mycontainer
# 进入容器检查服务
docker exec -it mycontainer netstat -tlnp
docker exec -it mycontainer curl localhost:3000Q: 容器间无法通信
A: 确认两个容器在同一用户定义网络中:
bash
# 查看容器网络
docker inspect container1 --format '{{json .NetworkSettings.Networks}}'
docker inspect container2 --format '{{json .NetworkSettings.Networks}}'
# 如果在不同网络,连接到同一网络
docker network connect mynet container1
docker network connect mynet container2
# 验证通信
docker exec container1 ping container2Q: exec: no such file or directory
A: 镜像内没有该命令(尤其是 Alpine 只有 sh,没有 bash):
bash
# 使用 sh 代替 bash
docker exec -it mycontainer sh
# 或安装 bash(Alpine)
docker exec -it mycontainer apk add bash数据和存储问题
Q: 容器删除后数据丢失
A: 必须使用数据卷或绑定挂载:
bash
# 使用数据卷
docker run -d -v mydata:/var/lib/mysql mysql:8.0
# 验证数据卷存在
docker volume lsQ: 宿主机文件挂载到容器后权限被拒绝
A:
bash
# 方法一:修改宿主机目录权限
chmod 777 ./mydir # 不推荐
# 方法二:以指定 UID 运行
docker run --user $(id -u):$(id -g) myapp
# 方法三:在容器内修改权限
docker run -d myapp
docker exec -u root myapp chown -R appuser:appuser /app镜像问题
Q: 构建镜像时没有使用缓存
A: Docker 缓存按层依赖,某层变化后所有后续层都重新构建。优化:
dockerfile
# 把变化频率低的层放在前面
COPY package*.json ./ # 依赖不常变
RUN npm install # 利用缓存
COPY . . # 代码经常变,放最后Q: 构建后的镜像体积很大
A: 参考镜像优化与瘦身章节。常见优化:
- 使用 Alpine 版本基础镜像
- 多阶段构建
- 安装后清理缓存
Q: cannot connect to the Docker daemon
A:
bash
# 检查 Docker 是否运行
systemctl status docker
sudo systemctl start docker
# macOS/Windows: 确认 Docker Desktop 已启动Docker Compose 问题
Q: docker compose up 提示找不到 docker-compose.yml
A: 确认在 docker-compose.yml 所在目录执行,或使用 -f 指定:
bash
docker compose -f /path/to/docker-compose.yml up -dQ: 修改了 docker-compose.yml 但容器没有更新
A:
bash
# 重新创建容器(不重建镜像)
docker compose up -d --force-recreate
# 重新构建镜像并重启
docker compose up -d --buildQ: depends_on 但依赖服务还没准备好
A: depends_on 只等待容器启动,不等待服务就绪。解决方案:
- 使用健康检查 +
condition: service_healthy:
yaml
depends_on:
db:
condition: service_healthy- 应用层实现重试逻辑
性能问题
Q: macOS 上 Docker 很慢,IO 性能差
A:
- 在 Docker Desktop → Settings → General → 开启 VirtioFS 文件共享
- 将
node_modules等大目录用匿名卷覆盖(不从宿主机同步):bashdocker run -v $(pwd):/app -v /app/node_modules node:20 npm start
Q: 容器占用内存越来越多
A:
- 检查应用是否有内存泄漏
- 设置内存限制:
--memory 512m - 查看内存使用:
docker stats mycontainer
网络问题
Q: 容器内无法访问外网
A:
bash
# 检查 DNS
docker exec mycontainer nslookup google.com
# 如果 DNS 失败,配置 DNS
# /etc/docker/daemon.json
{
"dns": ["8.8.8.8", "8.8.4.4"]
}
# 检查防火墙是否阻止转发
sudo iptables -L FORWARDQ: 容器内无法访问宿主机服务
A:
bash
# 使用 host.docker.internal(macOS/Windows Docker Desktop)
curl http://host.docker.internal:3000
# Linux 上获取宿主机 IP
ip route show default | awk '/default/ {print $3}'
# 或使用 host 网络模式
docker run --network host myapp清理问题
Q: Docker 占用磁盘太多,怎么清理
A:
bash
# 查看磁盘使用情况
docker system df
# 清理停止的容器、悬空镜像、未使用网络
docker system prune
# 清理所有未使用的镜像(含运行中容器未使用的)
docker system prune -a
# 强制清理不提示
docker system prune -a -f
# 只清理特定类型
docker container prune # 停止的容器
docker image prune -a # 未使用的镜像
docker volume prune # 未使用的卷
docker network prune # 未使用的网络