Skip to content
返回部署

优化 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 以在退出前排空进行中的请求

常见问题解答