长安的Docker教程长安的Docker教程
首页
快速开始
编程指南
首页
快速开始
编程指南
  • 🎯 Docker入门篇

    • 快速开始
    • Docker是什么?
    • 为什么要用Docker?
    • 安装Docker
    • 第一个容器
  • 📦 Docker基础篇

    • Docker镜像详解
    • 容器操作详解
    • 编写Dockerfile
    • 数据卷(Volumes)
    • Docker网络
  • ⚡ Docker进阶篇

    • Docker Compose
    • 多阶段构建
    • Docker性能优化
    • Docker最佳实践
  • 🚀 实战项目

    • 实战:部署Node.js应用
    • 实战:搭建数据库环境
    • 实战:微服务架构
  • 💡 常见问题

    • 常见问题排查
    • 实用技巧

常见问题排查

嘿!长安来帮你解决Docker常见问题!遇到问题别慌,这里都有答案!🔧

🐳 Docker安装问题

Q1: Docker Desktop启动失败(Windows)

症状:Docker Desktop一直显示"Starting..."

解决方案:

# 1. 确认WSL 2已安装
wsl --list --verbose

# 2. 更新WSL 2
wsl --update

# 3. 设置默认版本
wsl --set-default-version 2

# 4. 重启Docker Desktop

# 5. 如果还不行,重启电脑

Q2: Docker命令权限问题(Linux)

症状:permission denied while trying to connect to the Docker daemon

解决方案:

# 把当前用户加入docker组
sudo usermod -aG docker $USER

# 重新登录或运行
newgrp docker

# 验证
docker ps

Q3: Mac上Docker Desktop占用内存过高

解决方案:

  1. 打开Docker Desktop设置
  2. Resources → Advanced
  3. 调整Memory(建议4-8GB)
  4. 调整Swap(建议1-2GB)
  5. 点击"Apply & Restart"

🚀 镜像问题

Q4: 拉取镜像超时或失败

症状:Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: i/o timeout

解决方案:

# 配置镜像加速器
# Docker Desktop: Settings → Docker Engine

# 添加镜像源
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ]
}

# 重启Docker

Q5: 镜像构建失败:no space left on device

症状:构建镜像时报磁盘空间不足

解决方案:

# 1. 清理未使用的容器
docker container prune -f

# 2. 清理未使用的镜像
docker image prune -a -f

# 3. 清理构建缓存
docker builder prune -a -f

# 4. 清理数据卷
docker volume prune -f

# 5. 一键清理所有
docker system prune -a --volumes -f

# 6. 查看空间使用
docker system df

Q6: 构建时无法访问外网

症状:npm install 或 pip install 失败

解决方案:

# 方法1:使用国内镜像源

# Node.js
RUN npm config set registry https://registry.npmmirror.com && \
    npm install

# Python
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

# Alpine apk
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
    apk add --no-cache package

🎮 容器运行问题

Q7: 容器启动后立即退出

排查步骤:

# 1. 查看容器状态
docker ps -a

# 2. 查看容器日志
docker logs <container>

# 3. 查看详细信息
docker inspect <container>

# 4. 尝试交互式启动
docker run -it <image> sh

常见原因:

  1. CMD/ENTRYPOINT不是前台进程
# ❌ 错误
CMD service nginx start

# ✅ 正确
CMD ["nginx", "-g", "daemon off;"]
  1. 环境变量缺失
# 检查是否缺少环境变量
docker run -e REQUIRED_VAR=value <image>

Q8: 容器无法访问网络

症状:容器内ping不通外网

解决方案:

# 1. 检查DNS
docker run --rm alpine ping google.com

# 2. 设置DNS
docker run --dns 8.8.8.8 --dns 114.114.114.114 <image>

# 或在Docker配置中设置
# Docker Desktop: Settings → Docker Engine
{
  "dns": ["8.8.8.8", "114.114.114.114"]
}

# 3. 检查防火墙
# Linux
sudo iptables -L

Q9: 端口映射不生效

症状:无法通过localhost访问容器

排查步骤:

# 1. 确认端口映射
docker port <container>

# 2. 确认容器内服务已启动
docker exec <container> netstat -tlnp

# 3. 确认防火墙没有拦截
# Windows
netsh advfirewall firewall add rule name="Docker" dir=in action=allow protocol=TCP localport=8080

# 4. 确认没有端口冲突
# Windows
netstat -ano | findstr :8080
# Linux/Mac
lsof -i :8080

Q10: 容器时间不正确

症状:容器内时间和宿主机不一致

解决方案:

# 方法1:挂载时区
docker run -v /etc/localtime:/etc/localtime:ro <image>

# 方法2:设置时区环境变量
docker run -e TZ=Asia/Shanghai <image>

# 方法3:在Dockerfile中设置
FROM alpine
RUN apk add --no-cache tzdata && \
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone

🔗 网络问题

Q11: 容器间无法通信

症状:容器A无法ping通容器B

解决方案:

# 1. 确认在同一网络
docker network inspect <network>

# 2. 使用容器名通信(需要自定义网络)
docker network create my-network
docker run --network my-network --name app1 <image>
docker run --network my-network --name app2 <image>

# 3. app2中可以通过容器名访问
docker exec app2 ping app1

Q12: 无法访问宿主机服务

症状:容器内无法访问宿主机的MySQL

解决方案:

# 不要用localhost或127.0.0.1

# Windows/Mac
# 使用特殊域名
host.docker.internal

# 例如
mysql -h host.docker.internal -u root -p

# Linux
# 使用docker0网卡的IP
ip addr show docker0
# 或使用网关IP
docker inspect bridge | grep Gateway

💾 数据问题

Q13: 数据卷权限问题

症状:Permission denied 读写数据卷

解决方案:

# 方法1:使用具名数据卷(推荐)
docker run -v mydata:/data <image>

# 方法2:修改文件权限
sudo chown -R $(id -u):$(id -g) ./data

# 方法3:在Dockerfile中设置权限
RUN chown -R user:user /data
USER user

Q14: 数据卷数据丢失

症状:容器删除后数据也没了

原因:没有使用数据卷或使用了匿名数据卷

解决方案:

# ✅ 使用具名数据卷
docker run -v mysql-data:/var/lib/mysql mysql

# ❌ 不要这样(匿名数据卷)
docker run -v /var/lib/mysql mysql

# 查看数据卷
docker volume ls

# 备份数据卷
docker run --rm \
  -v mysql-data:/data \
  -v $(pwd):/backup \
  alpine tar -czf /backup/backup.tar.gz -C /data .

🏃 性能问题

Q15: 容器运行很慢(Mac/Windows)

原因:Mac/Windows上Docker运行在虚拟机中

解决方案:

# 1. 使用volume而不是bind mount
# ❌ 慢
-v $(pwd):/app

# ✅ 快
-v app-code:/app

# 2. 增加分配给Docker的资源
# Docker Desktop: Settings → Resources

# 3. 清理未使用的资源
docker system prune -a

# 4. 使用:cached选项(Mac)
-v $(pwd):/app:cached

Q16: 构建镜像很慢

解决方案:

# 1. 利用构建缓存
# 先复制依赖文件
COPY package*.json ./
RUN npm install
# 再复制代码
COPY . .

# 2. 使用缓存挂载(BuildKit)
RUN --mount=type=cache,target=/root/.npm \
    npm install

# 3. 使用多阶段构建
FROM node:18 AS builder
# 构建...

FROM node:18-alpine
# 只复制必要文件
COPY --from=builder /app/dist ./dist

# 4. 启用BuildKit
export DOCKER_BUILDKIT=1
docker build -t myapp .

🔍 调试技巧

通用调试流程

# 1. 查看容器状态
docker ps -a

# 2. 查看日志
docker logs --tail 100 -f <container>

# 3. 进入容器
docker exec -it <container> sh

# 4. 查看资源使用
docker stats <container>

# 5. 查看详细信息
docker inspect <container>

# 6. 查看进程
docker top <container>

# 7. 查看端口映射
docker port <container>

# 8. 查看网络
docker network inspect <network>

# 9. 查看数据卷
docker volume inspect <volume>

日志分析

# 实时查看日志
docker-compose logs -f

# 查看特定服务
docker-compose logs -f app

# 查看最后N行
docker logs --tail 100 <container>

# 查看时间范围
docker logs --since 2024-12-01T10:00:00 <container>
docker logs --since 1h <container>

# 导出日志
docker logs <container> > app.log 2>&1

💡 最佳实践

避免常见坑

# 1. 总是指定版本
FROM node:18-alpine  # ✅
FROM node:latest     # ❌

# 2. 使用.dockerignore
node_modules
.git
.env

# 3. 使用健康检查
HEALTHCHECK CMD curl -f http://localhost/ || exit 1

# 4. 不要用root用户
USER node

# 5. 清理构建缓存
RUN apt-get update && \
    apt-get install -y package && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# 6. 设置重启策略
restart: unless-stopped

# 7. 限制资源
deploy:
  resources:
    limits:
      cpus: '1'
      memory: 512M

🚨 紧急情况处理

容器全部停止响应

# 1. 重启Docker服务
# Windows/Mac: 重启Docker Desktop
# Linux:
sudo systemctl restart docker

# 2. 清理僵尸进程
docker ps -a | grep "Exited" | awk '{print $1}' | xargs docker rm

# 3. 清理网络
docker network prune -f

磁盘满了

# 1. 查看使用情况
docker system df

# 2. 清理
docker system prune -a --volumes -f

# 3. 清理日志
sudo sh -c "truncate -s 0 /var/lib/docker/containers/**/*-json.log"

💡 小结

今天长安帮你解决了常见的Docker问题:

问题分类

  1. 安装问题:WSL、权限、资源
  2. 镜像问题:拉取失败、构建失败
  3. 容器问题:启动失败、网络不通
  4. 数据问题:权限、丢失
  5. 性能问题:运行慢、构建慢

调试技巧

  • 查看日志:docker logs
  • 进入容器:docker exec
  • 查看详情:docker inspect
  • 查看资源:docker stats

🚀 下一步

还有其他问题?看 实用技巧!


💬 长安的排查经验:

遇到问题别慌,90%的问题都能通过查看日志解决!

我的排查流程:

  1. 看日志(docker logs)
  2. 进容器(docker exec)
  3. Google错误信息
  4. 看官方文档
  5. 问社区

记住:耐心是调试的第一要素!

加油,你一定能解决问题的!💪

在 GitHub 上编辑此页
Next
实用技巧