性能优化 #
性能优化概述 #
优化方向 #
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应用容器化,了解实际的容器化案例。