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