Skip to content

常见问题 FAQ

安装问题

Q: Docker 安装后 docker run 提示 Permission denied

A: 将当前用户加入 docker 组:

bash
sudo usermod -aG docker $USER
newgrp docker
# 或退出重新登录

Q: Docker Desktop 在 Windows 上无法启动

A: 检查以下几点:

  1. 确认 BIOS 开启了虚拟化(VT-x/AMD-V)
  2. 确认 Hyper-V 已启用(或 WSL 2 已安装)
  3. 尝试以管理员权限运行
  4. 重置 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: 检查:

  1. 容器是否在运行:docker ps
  2. 端口是否映射:docker port mycontainer
  3. 应用是否监听 0.0.0.0 而非 127.0.0.1
  4. 防火墙是否阻止
bash
# 检查端口映射
docker port mycontainer

# 进入容器检查服务
docker exec -it mycontainer netstat -tlnp
docker exec -it mycontainer curl localhost:3000

Q: 容器间无法通信

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 container2

Q: 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 ls

Q: 宿主机文件挂载到容器后权限被拒绝

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 -d

Q: 修改了 docker-compose.yml 但容器没有更新

A:

bash
# 重新创建容器(不重建镜像)
docker compose up -d --force-recreate

# 重新构建镜像并重启
docker compose up -d --build

Q: depends_on 但依赖服务还没准备好

A: depends_on 只等待容器启动,不等待服务就绪。解决方案:

  1. 使用健康检查 + condition: service_healthy
yaml
depends_on:
  db:
    condition: service_healthy
  1. 应用层实现重试逻辑

性能问题

Q: macOS 上 Docker 很慢,IO 性能差

A:

  1. 在 Docker Desktop → Settings → General → 开启 VirtioFS 文件共享
  2. node_modules 等大目录用匿名卷覆盖(不从宿主机同步):
    bash
    docker run -v $(pwd):/app -v /app/node_modules node:20 npm start

Q: 容器占用内存越来越多

A:

  1. 检查应用是否有内存泄漏
  2. 设置内存限制:--memory 512m
  3. 查看内存使用: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 FORWARD

Q: 容器内无法访问宿主机服务

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     # 未使用的网络