Skip to content

性能优化

资源限制配置

合理限制容器资源,避免单个容器耗尽宿主机资源:

bash
# 内存限制
docker run -d \
  --memory 512m \            # 最大内存
  --memory-reservation 256m \ # 软限制(内存不足时)
  --memory-swap 512m \        # 与 memory 相同则禁用 swap
  myapp

# CPU 限制
docker run -d \
  --cpus 1.5 \               # 最多使用 1.5 个 CPU
  --cpu-shares 512 \         # 相对权重(默认 1024)
  myapp

# 磁盘 IO 限制
docker run -d \
  --device-read-bps /dev/sda:10mb \   # 读速度限制
  --device-write-bps /dev/sda:10mb \  # 写速度限制
  myapp

在 Compose 中配置:

yaml
services:
  api:
    deploy:
      resources:
        limits:
          cpus: "1.0"
          memory: 512M
        reservations:
          cpus: "0.5"
          memory: 256M

构建性能优化

利用构建缓存

dockerfile
# 将变化频率低的层放在前面
COPY package*.json ./     # 依赖变化少 → 缓存稳定
RUN npm install
COPY . .                  # 代码变化频繁 → 放在后面

使用 BuildKit 并行构建

bash
# 开启 BuildKit(Docker 23.0+ 默认开启)
DOCKER_BUILDKIT=1 docker build -t myapp .

# 并行构建多个阶段
docker buildx build \
  --cache-from type=registry,ref=myapp:buildcache \
  --cache-to type=registry,ref=myapp:buildcache,mode=max \
  -t myapp:latest .

构建缓存持久化(CI/CD)

yaml
# GitHub Actions 示例
- name: Build with cache
  uses: docker/build-push-action@v5
  with:
    cache-from: type=gha
    cache-to: type=gha,mode=max

镜像体积优化

bash
# 查看镜像大小
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"

# 使用 dive 分析
dive myapp:latest

# 清理构建缓存
docker builder prune

容器启动性能

bash
# 使用 init 处理僵尸进程(推荐)
docker run --init myapp

# 或在 Dockerfile 中使用 tini
FROM node:20-alpine
RUN apk add --no-cache tini
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["node", "app.js"]

网络性能

bash
# host 网络(最高性能,无 NAT)
docker run --network host nginx

# 增大 SO_RCVBUF(网络缓冲区)
docker run --sysctl net.core.rmem_max=16777216 myapp

# macOS 开发性能优化(Docker Desktop)
# 在 Settings → Resources → Advanced 中选择 VirtioFS 文件共享

存储性能

bash
# 确认使用 overlay2 存储驱动(推荐)
docker info | grep "Storage Driver"

# 使用数据卷替代绑定挂载(macOS 上性能更好)
# 开发时对于 node_modules 等,使用匿名卷覆盖
docker run -v $(pwd):/app -v /app/node_modules node:20 npm start

监控资源使用

bash
# 实时监控
docker stats

# 格式化输出
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}"

# 集成 Prometheus + cAdvisor
docker run -d \
  --name cadvisor \
  --volume /:/rootfs:ro \
  --volume /var/run:/var/run:ro \
  --volume /sys:/sys:ro \
  --volume /var/lib/docker/:/var/lib/docker:ro \
  -p 8080:8080 \
  gcr.io/cadvisor/cadvisor:latest

日常维护

bash
# 清理无用资源(释放磁盘空间)
docker system prune        # 清理停止的容器、悬空镜像、未使用网络
docker system prune -a     # 同上 + 未使用的镜像
docker system prune -a -f  # 不提示确认

# 查看磁盘使用
docker system df

# 定期清理
# 可加入 crontab,每周清理一次
0 0 * * 0 docker system prune -a -f

总结

性能优化的关键点:

  1. 合理限制资源:防止资源争抢
  2. 优化构建:合理利用缓存,使用多阶段构建
  3. 最小化镜像:使用 alpine/slim,减少拉取时间
  4. 定期清理:防止磁盘空间耗尽
  5. 监控资源:及时发现性能问题