Skip to content
返回部署

Docker 安全

安全容器最佳实践 — 非 root、最小基础、扫描、签名。

容器高级

为什么

容器安全减少攻击面:非 root 用户、最小基础镜像、漏洞扫描和镜像签名(cosign)防篡改和利用。Docker is used by 59% of professional developers per the Stack Overflow 2024 survey,Kubernetes 在生产中运行 60% 的容器化工作负载(CNCF 2024 调查)。

容器编排通过声明式滚动发布将部署相关事故减少 35%。

何时使用

所有生产容器应用 — 安全非可选。 简单静态站点跳过容器 — CDN + 静态导出更便宜更快。10 人以下团队避免 Kubernetes;运维开销不合理。

如何做

1. 非 root — Dockerfile 中 USER 1000 2. 最小 — distroless 或 alpine 基础 3. 扫描 — trivy、grype 或 docker scout 4. 签名 — cosign 做 Sigstore 签名 5. 只读 — compose 中 read_only: true 6. 无能力 — cap_drop: [ALL] 7. 密钥 — Docker secrets 或外部

示例

# Dockerfile — 安全 FROM node:20-alpine RUN addgroup -S app && adduser -S app -G app WORKDIR /app COPY --chown=app:app . . USER app # 非 root CMD ["node", "server.js"] # docker-compose.yml — 加固 services: app: image: myapp:latest user: "1000:1000" read_only: true cap_drop: [ALL] security_opt: [no-new-privileges:true] tmpfs: [/tmp] # 扫描 trivy image myapp:latest # cosign 签名 cosign sign --key cosign.key myapp:latest cosign verify --key cosign.pub myapp:latest

常见问题

  • ⚠容器以 root 运行 — 默认,加 USER 指令非 root
  • ⚠基础镜像有漏洞 — 定期扫描,CVE 时更新基础
  • ⚠环境间配置漂移 — 使用基础设施即代码(Terraform/Pulumi)保持 dev/staging/prod 一致

最佳实践

  • ✓非 root 用户运行 — USER 1000,消除多数提权
  • ✓用 distroless 基础 — 无 shell、无包管理器,最小攻击面
  • ✓设置健康检查和优雅关闭 — 处理 SIGTERM 以在退出前排空进行中的请求

常见问题解答