优化 Docker 镜像
更小、更快、更安全 Docker 镜像的技术。
容器进阶
为什么
优化镜像拉取快、用盘少、漏洞少。关键技术:.dockerignore、层缓存、distroless 和 BuildKit。
何时使用
始终优化生产镜像 — 更快部署、更低成本、更好安全。 简单静态站点跳过容器 — CDN + 静态导出更便宜更快。10 人以下团队避免 Kubernetes;运维开销不合理。
如何做
1. .dockerignore — 排除 node_modules、.git、tests
2. 层顺序 — 先复制 package.json,后源码
3. Distroless — gcr.io/distroless/nodejs20,无 shell
4. BuildKit — DOCKER_BUILDKIT=1 并行 + 缓存
5. 精简基础 — alpine 或 debian-slim
6. 多架构 — docker buildx amd64 + arm64
7. 扫描 — docker scout 或 trivy 查漏洞
示例
# .dockerignore
node_modules
.git
*.test.ts
dist
.env
# Dockerfile — 优化层顺序
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./ # 先依赖,缓存
RUN npm ci --omit=dev
COPY . . # 后源码,常变
CMD ["node", "server.js"]
# Distroless(最小最安全)
FROM node:20 AS build
WORKDIR /app
COPY . .
RUN npm ci && npm run build
FROM gcr.io/distroless/nodejs20
COPY --from=build /app/dist /dist
CMD ["/dist/server.js"]
# BuildKit 缓存挂载
# syntax=docker/dockerfile:1
FROM node:20-alpine
RUN --mount=type=cache,target=/root/.npm npm ci
常见问题
- ⚠镜像大 — 无 .dockerignore,含 node_modules 和 .git
- ⚠构建慢 — 层顺序错,源码复制使依赖缓存失效
- ⚠环境间配置漂移 — 使用基础设施即代码(Terraform/Pulumi)保持 dev/staging/prod 一致
最佳实践
- ✓源码前复制 package.json — 依赖层缓存除非依赖变
- ✓生产用 distroless — 无 shell、无包管理器,最小攻击面
- ✓设置健康检查和优雅关闭 — 处理 SIGTERM 以在退出前排空进行中的请求