镜像优化
优化镜像可以减少存储空间、加快部署速度、提高安全性。
优化策略
1. 选择轻量级基础镜像
# ❌ 不好:使用完整镜像FROM ubuntu:22.04 # ~77MB
# ✅ 好:使用 alpineFROM alpine:3.18 # ~7MB
# ✅ 更好:使用语言特定的精简版FROM node:18-alpine # ~177MB vs node:18 ~1GBFROM python:3.11-slim # ~130MB vs python:3.11 ~900MB2. 多阶段构建
详见 多阶段构建。
3. 合并 RUN 指令
# ❌ 不好:每个 RUN 创建一层RUN apt-get updateRUN apt-get install -y curlRUN apt-get install -y vim
# ✅ 好:合并为一层RUN apt-get update && \ apt-get install -y \ curl \ vim && \ rm -rf /var/lib/apt/lists/*4. 及时清理
# AlpineRUN apk add --no-cache python3
# Ubuntu/DebianRUN apt-get update && \ apt-get install -y python3 && \ rm -rf /var/lib/apt/lists/*
# Python pipRUN pip install --no-cache-dir flask
# Node.js npmRUN npm install && npm cache clean --force5. 使用 .dockerignore
创建 .dockerignore:
node_modules.git.env*.md.vscode.ideacoveragedistbuild6. 只复制必要文件
# ❌ 不好COPY . .
# ✅ 好COPY package.json package-lock.json ./RUN npm installCOPY src ./src实战示例
优化前
FROM node:18WORKDIR /appCOPY . .RUN npm installRUN npm run buildEXPOSE 3000CMD ["npm", "start"]镜像大小:1.2GB
优化后
# 构建阶段FROM node:18-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ci --only=production && \ npm cache clean --forceCOPY . .RUN npm run build
# 运行阶段FROM node:18-alpineWORKDIR /appCOPY --from=builder /app/dist ./distCOPY --from=builder /app/node_modules ./node_modulesUSER nodeEXPOSE 3000CMD ["node", "dist/server.js"]镜像大小:150MB(减少 87.5%)
分析镜像
使用 docker history
docker history myapp:latest使用 dive
# 安装 divebrew install dive
# 分析镜像dive myapp:latest优化清单
- 使用轻量级基础镜像
- 实施多阶段构建
- 合并 RUN 指令
- 清理缓存和临时文件
- 使用 .dockerignore
- 只安装必要依赖
- 压缩静态资源
- 使用非 root 用户