Docker CI/CD 与生产实践
1. 标准链路
text
commit -> test -> build -> scan/SBOM/provenance -> push
-> sign digest -> UAT by digest -> approve -> production by same digestBuild once、promote by digest;不要在 UAT 和生产分别重建。
2. 标识与测试
bash
IMAGE_REPO='registry.example.internal/team/api'
GIT_SHA="$(git rev-parse HEAD)"
IMAGE_REF="${IMAGE_REPO}:git-${GIT_SHA}"
docker build --check .
docker buildx build --target test --progress=plain .校验变量非空、Registry 在 allowlist、commit 符合发布策略;不把不可信分支名直接拼成 tag。
最终镜像还需以非 root、只读文件系统和真实健康端点做启动冒烟;失败时先保存 logs/inspect。
3. 构建发布
bash
docker buildx create \
--driver docker-container --use --bootstrap
docker buildx build \
--pull \
--platform linux/amd64,linux/arm64 \
--cache-from "type=registry,ref=${IMAGE_REPO}:buildcache" \
--cache-to "type=registry,ref=${IMAGE_REPO}:buildcache,mode=max" \
--sbom=true \
--provenance=mode=max \
--tag "$IMAGE_REF" \
--push .
docker buildx imagetools inspect "$IMAGE_REF"私有依赖使用 --secret/--ssh,日志不输出 Secret。不可信 PR 不接触生产 token,也不写受信任共享 cache。
4. 发布记录与门禁
记录 Git commit、image ref/digest、builder 版本、目标平台、测试/扫描、SBOM/provenance/signature、审批、迁移与回滚。
门禁包括:base/依赖锁定,单元、集成和冒烟测试,漏洞策略与有期限的例外,对 digest 签名,以及部署侧验证来源、签名和证明材料。
5. Registry 认证
bash
printf '%s' "$REGISTRY_TOKEN" \
| docker login registry.example.internal \
--username "$REGISTRY_USER" \
--password-stdintoken 短期化、按仓库/动作最小授权,作业结束清理 runner 和临时凭据。
6. 数据迁移
迁移需幂等或有保护、兼容新旧应用、先备份并验证恢复、单独记录日志与退出码。Compose:
bash
docker compose run --rm api ./migrate应用回滚不能自动撤销不可逆数据变化。
7. 发布与回滚
部署清单固定:
yaml
services:
api:
image: registry.example.internal/team/api@sha256:REPLACE_WITH_APPROVED_DIGEST拉取批准 digest → 新实例健康 → 冒烟 → 切流 → 观察错误/延迟/资源/业务指标。保留旧 digest 到回滚窗口结束。
8. 生产基线
- 非 root、drop ALL、no-new-privileges;
- 只读根文件系统,明确 tmpfs/volume;
- CPU、内存、PID、ulimit;
- healthcheck、停止超时、restart policy;
- 日志轮转与集中采集;
- 最小端口与分层网络;
- 不挂 socket,不用 privileged/host namespace;
- 数据备份与恢复演练。
9. 验收
- [ ] commit 可追溯,test target、镜像冒烟、多平台清单通过
- [ ] 漏洞策略通过,SBOM/provenance/signature 可验证
- [ ] 生产使用批准 digest,运行安全基线生效
- [ ] 迁移有备份,回滚 digest 与 runbook 可用
10. 官方参考
继续阅读
- 知识专题
- 命令
- 命令