使用 Docker App 打包微服务模板并发布到内部市场
解读
国内大厂/金融/运营商内部市场(如华为云 SWR、阿里云 ACR 企业版、字节跳动 ArtifactHub 企业实例)普遍要求一次提交、多环境自动分发,并且必须附带国产操作系统适配声明、镜像签名、SBOM 清单。Docker App(CNAB 规范实现)正好把“镜像 + 参数 + 部署逻辑”打成一个不可变包,解决“镜像版本漂移”和“配置散落”两大痛点。面试官问这道题,想看你是否能把开发侧模板化与运维侧市场治理打通,并兼顾信创合规与安全加固。
知识点
- Docker App 与 CNAB 概念:bundle.json、invocation image、参数注入、状态管理
- 国内镜像市场强制要求:Harbor 2.0+ 格式、OCI Index、签名规范(Notary v2/ cosign)、SBOM(SPDX 格式)
- 多阶段构建与最小镜像:distroless/static-debian11、ubi-micro、openanolis/8-minimal,并加入信创 arm64 与 amd64 双架构
- 配置外部化:使用 Helm-style values.yml 注入,敏感项走 Docker Swarm Secret 或 Kubernetes CSI Secret Store
- 发布流程:本地验证 →
docker app push→ 内部市场 Webhook 触发镜像扫描(Trivy、洞见、默安) → 人工审批(OA 工单) → 自动同步到离线仓库(两地三中心) - 回滚策略:CNAB 的 claim 文件记录每版本参数,支持
docker app install --relocation-mapping快速回退
答案
-
准备微服务模板
在项目根创建dockerapp目录,写入metadata.ymlversion: 0.1.0 name: microservice-spring description: 公司内部 Spring Cloud 模板 maintainers: - name: zhangsan email: zhangsan@company.com把
docker-compose.yml拆成dockerapp/docker-compose.yml,镜像全部使用内网 Harbor 域名并加 digest 锁版本,防止外部拉取失败。 -
最小化与多架构
在 Dockerfile 采用多阶段构建:FROM maven:3.9-openjdk-17 as build COPY . /src RUN mvn -f /src package -DskipTests FROM openanolis/8-minimal:8.8 COPY --from=build /src/target/app.jar /app.jar USER 65534:65534 ENTRYPOINT ["java","-XX:MaxRAMPercentage=75","-jar","/app.jar"]使用
docker buildx一次性打出 linux/amd64+linux/arm64 双架构镜像,并推送到harbor.company.com/base/microservice-spring:1.0.0@sha256:xxx。 -
参数化与配置
在dockerapp/parameters.yml定义可覆盖项:replicaCount: 2 datasource_url: jdbc:mysql://{{env "DB_HOST"}}:3306/{{env "DB_NAME"}} log_level: INFO敏感信息
DB_PASS不走文件,安装时通过:echo $DB_PASS | docker secret create db_pass - docker app install --set secret=db_pass ... -
本地验证
docker app validate . docker app install --name test-app用
docker app status test-app查看 claim,确认 Health=Ready 后,执行集成测试脚本(公司统一用 Python+pytest)。 -
打包与签名
docker app push --tag harbor.company.com/market/microservice-spring:0.1.0紧接着用国密 SM2 证书签名:
cosign sign --key sm2://key.pem harbor.company.com/market/microservice-spring:0.1.0生成
sbom.spdx.json并随包上传,满足内部审计。 -
发布到内部市场
登录公司 DevOps 门户 → 选择“模板上架” → 上传*.dockerapp包 → 填写信创适配级别(L2-L4)、高危漏洞自检报告 → 提交 OA 工单。
审批通过后,市场会自动在三大数据中心 Harbor 之间同步,并给业务线发 Webhook 通知,研发即可一键docker app install部署。 -
版本升级与回滚
升级:docker app upgrade test-app --set replicaCount=3回滚:
docker app install --from-claim claim-test-app.json --relocation-mapping
拓展思考
- 如果内部市场未来全面转向 OCI Artifact v1.1,Docker App 包可直接转成 OCI Image Layout,只需把
bundle.json放到artifactType=cnab.io/docker-app层即可,无需改造 CI 脚本。 - 对边缘机房可采用
docker app bundle导出离线 tar,用 U 盘+国密 USBKey 手工导入,解决零信任网络场景。 - 考虑Serverless 容器(如华为 CCI、阿里云 ASK),可把 Docker App 的 compose 服务拆成 Knative Service 模板,用
cnab-to-knative工具自动生成 yaml,实现同一套源模板在虚拟机、Swarm、K8s、Serverless 四栖运行。