主题
容器化最佳实践
本文汇总从镜像构建到生产运行的容器化总体规范,作为本模块的总纲。各专项细节见对应文档。
镜像构建
- 单进程原则:一个容器只跑一个主进程(PID 1),便于信号处理与生命周期管理。
- 多阶段构建:编译与运行分离,显著减小镜像体积(见 Dockerfile)。
- 最小化基础镜像:优先
alpine/slim/distroless/scratch。 - 固定 tag/digest:生产禁止
latest,用语义版本或提交哈希(见 镜像仓库)。 - 使用
.dockerignore:避免把.git、node_modules、本地日志打入构建上下文。 - exec 形式启动:
CMD ["node","app.js"]而非 shell 形式,便于接收 SIGTERM。
安全
- 非 root 运行:Dockerfile 中
USER 1000或USER nonroot(见 安全)。 - 只读根文件系统:
--read-only+tmpfs,降低被篡改风险。 - 降权:
--cap-drop ALL,按需--cap-add。 - 漏洞扫描:CI 中集成 Trivy/Docker Scout,阻断高危镜像(见 安全)。
- 密钥不入镜像:用 secret / 外部密钥管理。
资源与稳定性
- 设置 requests/limits:K8s 必设,Docker 用
--cpus/--memory(见 Docker 存储)。 - 配置日志轮转:json-file +
max-size/max-file,防磁盘撑满。 - 健康检查:Docker
HEALTHCHECK、K8s liveness/readiness 探针。 - 重启策略:
unless-stopped(Docker)/restart_policy(Swarm)。
网络与存储
- 自定义网络隔离:不同安全域使用不同网络(见 网络)。
- 有状态用 Volume:数据库等挂命名卷,不写可写层。
- 配置只读挂载:
bind mount+:ro。 - 数据库不暴露公网:仅放内部网络。
编排与交付
- 声明式管理:Compose/Swarm 用 YAML,K8s 用
kubectl apply。 - 滚动更新:Swarm
update_config、K8srollout,实现零停机。 - CI/CD 衔接:镜像构建与扫描纳入流水线(见 容器与 CI/CD 集成)。
- 多环境分离:override 文件 / K8s Namespace 区分 prod/test。
可观测性
- 统一日志:容器日志输出 stdout,由采集端收集。
- 指标采集:cAdvisor + Prometheus + Grafana(见 监控体系)。
- 告警:异常自动通知(Alertmanager)。
检查清单(Checklist)
部署前对照:
- [ ] 镜像非 root、已扫描、固定 tag
- [ ] 设置了资源限制与日志轮转
- [ ] 配置了健康检查/探针
- [ ] 有状态数据挂 Volume
- [ ] 密钥使用 secret 机制
- [ ] 滚动更新/回滚策略就绪
- [ ] 日志与指标接入可观测平台