性能优化 #

性能优化概述 #

优化方向 #

text
┌─────────────────────────────────────────────────────┐
│                   性能优化方向                       │
├─────────────────────────────────────────────────────┤
│                                                     │
│  1. 镜像优化 - 减小镜像体积,加快部署               │
│  2. 构建优化 - 加快镜像构建速度                     │
│  3. 运行时优化 - 提升容器运行性能                   │
│  4. 网络优化 - 降低网络延迟                         │
│  5. 存储优化 - 提高IO性能                           │
│                                                     │
└─────────────────────────────────────────────────────┘

镜像优化 #

选择合适的基础镜像 #

dockerfile
# 不推荐: 完整镜像
FROM ubuntu:22.04          # ~77MB

# 推荐: slim镜像
FROM python:3.11-slim      # ~150MB

# 更推荐: alpine镜像
FROM python:3.11-alpine    # ~50MB

# 最小: scratch
FROM scratch               # 0MB

使用多阶段构建 #

dockerfile
# 构建阶段
FROM golang:1.20 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# 运行阶段
FROM alpine:3.18
COPY --from=builder /app/myapp /myapp
CMD ["./myapp"]

减少镜像层数 #

dockerfile
# 不推荐
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y vim

# 推荐
RUN apt-get update && apt-get install -y \
    curl \
    vim \
    && rm -rf /var/lib/apt/lists/*

清理缓存 #

dockerfile
# 清理apt缓存
RUN apt-get update && apt-get install -y \
    curl \
    && rm -rf /var/lib/apt/lists/*

# 清理npm缓存
RUN npm ci --only=production && npm cache clean --force

# 清理pip缓存
RUN pip install --no-cache-dir -r requirements.txt

使用.dockerignore #

text
# .dockerignore
node_modules
npm-debug.log
Dockerfile
.dockerignore
.git
.gitignore
*.md
.env
coverage

构建优化 #

利用构建缓存 #

dockerfile
# 先复制依赖文件
COPY package*.json ./
RUN npm ci

# 再复制源代码
COPY . .
RUN npm run build

使用BuildKit #

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

# 使用并行构建
docker buildx build --platform linux/amd64,linux/arm64 -t myapp .

外部缓存 #

bash
# 使用远程缓存
docker build \
  --cache-from myapp:latest \
  -t myapp:v1.0 .

# 使用registry缓存
docker buildx build \
  --cache-from type=registry,ref=myapp:cache \
  --cache-to type=registry,ref=myapp:cache \
  -t myapp:v1.0 .

运行时优化 #

资源限制 #

bash
# 设置合理的资源限制
docker run \
  --cpus=1 \
  --memory=1g \
  --memory-swap=2g \
  --memory-reservation=512m \
  --cpu-shares=1024 \
  myapp

使用host网络 #

bash
# 高性能网络
docker run --network host myapp

# 注意: 无网络隔离

调整ulimit #

bash
# 设置ulimit
docker run --ulimit nofile=65535:65535 myapp
docker run --ulimit nproc=65535 myapp

使用tmpfs #

bash
# 高性能临时存储
docker run --tmpfs /tmp:rw,size=1g myapp

存储优化 #

选择存储驱动 #

json
// /etc/docker/daemon.json
{
  "storage-driver": "overlay2"
}

使用数据卷 #

bash
# 使用数据卷提高IO性能
docker run -v myvolume:/app/data myapp

# 使用绑定挂载
docker run -v /data:/app/data myapp

磁盘IO限制 #

bash
# 限制磁盘IO
docker run \
  --device-read-bps=/dev/sda:50mb \
  --device-write-bps=/dev/sda:50mb \
  myapp

网络优化 #

使用host网络 #

bash
# 最高性能
docker run --network host myapp

调整MTU #

json
// /etc/docker/daemon.json
{
  "mtu": 1400
}

使用DNS缓存 #

bash
# 设置DNS
docker run --dns 8.8.8.8 --dns 8.8.4.4 myapp

# 使用本地DNS缓存
docker run --dns 127.0.0.1 myapp

监控与分析 #

资源监控 #

bash
# 实时监控
docker stats

# 查看特定容器
docker stats mycontainer

# 不刷新显示
docker stats --no-stream

性能分析 #

bash
# 使用perf
docker run --privileged --pid=host -it \
  -v /lib/modules:/lib/modules \
  -v /usr/src:/usr/src \
  -v /sys/kernel/debug:/sys/kernel/debug \
  brendangregg/perf

# 使用sysdig
docker run -it --rm --name sysdig \
  --privileged \
  -v /var/run/docker.sock:/host/var/run/docker.sock \
  -v /dev:/host/dev \
  -v /proc:/host/proc:ro \
  -v /boot:/host/boot:ro \
  -v /lib/modules:/host/lib/modules:ro \
  -v /usr:/host/usr:ro \
  sysdig/sysdig

cAdvisor监控 #

bash
# 启动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 \
  --publish=8080:8080 \
  google/cadvisor

性能基准测试 #

容器性能对比 #

text
┌─────────────────────────────────────────────────────┐
│               容器 vs 虚拟机性能                     │
├─────────────────────────────────────────────────────┤
│                                                     │
│  指标          虚拟机        容器                   │
│  ─────────────────────────────────────────────────  │
│  CPU性能       ~95%         ~99%                   │
│  内存性能      ~95%         ~99%                   │
│  网络性能      ~90%         ~95%                   │
│  磁盘IO        ~85%         ~95%                   │
│  启动时间      分钟级       秒级                   │
│  内存占用      GB级         MB级                   │
│                                                     │
└─────────────────────────────────────────────────────┘

压力测试 #

bash
# CPU压力测试
docker run --rm progrium/stress --cpu 4 --timeout 60s

# 内存压力测试
docker run --rm progrium/stress --vm 4 --vm-bytes 256M --timeout 60s

# IO压力测试
docker run --rm progrium/stress --io 4 --timeout 60s

优化清单 #

镜像优化清单 #

text
┌─────────────────────────────────────────────────────┐
│                 镜像优化清单                         │
├─────────────────────────────────────────────────────┤
│                                                     │
│  [ ] 使用最小基础镜像                               │
│  [ ] 使用多阶段构建                                 │
│  [ ] 减少镜像层数                                   │
│  [ ] 清理缓存文件                                   │
│  [ ] 使用.dockerignore                              │
│  [ ] 利用构建缓存                                   │
│  [ ] 使用BuildKit                                   │
│                                                     │
└─────────────────────────────────────────────────────┘

运行时优化清单 #

text
┌─────────────────────────────────────────────────────┐
│                 运行时优化清单                       │
├─────────────────────────────────────────────────────┤
│                                                     │
│  [ ] 设置资源限制                                   │
│  [ ] 使用合适的网络模式                             │
│  [ ] 调整ulimit                                     │
│  [ ] 使用数据卷                                     │
│  [ ] 配置健康检查                                   │
│  [ ] 设置日志轮转                                   │
│  [ ] 监控资源使用                                   │
│                                                     │
└─────────────────────────────────────────────────────┘

小结 #

本节学习了Docker性能优化:

  • 镜像优化方法
  • 构建优化技巧
  • 运行时优化配置
  • 存储和网络优化
  • 监控与分析工具

下一步 #

接下来,让我们学习 Web应用容器化,了解实际的容器化案例。