使用 Docker App 打包微服务模板并发布到内部市场

解读

国内大厂/金融/运营商内部市场(如华为云 SWR、阿里云 ACR 企业版、字节跳动 ArtifactHub 企业实例)普遍要求一次提交、多环境自动分发,并且必须附带国产操作系统适配声明、镜像签名、SBOM 清单。Docker App(CNAB 规范实现)正好把“镜像 + 参数 + 部署逻辑”打成一个不可变包,解决“镜像版本漂移”和“配置散落”两大痛点。面试官问这道题,想看你是否能把开发侧模板化运维侧市场治理打通,并兼顾信创合规安全加固

知识点

  1. Docker App 与 CNAB 概念:bundle.json、invocation image、参数注入、状态管理
  2. 国内镜像市场强制要求:Harbor 2.0+ 格式、OCI Index、签名规范(Notary v2/ cosign)、SBOM(SPDX 格式)
  3. 多阶段构建与最小镜像:distroless/static-debian11、ubi-micro、openanolis/8-minimal,并加入信创 arm64 与 amd64 双架构
  4. 配置外部化:使用 Helm-style values.yml 注入,敏感项走 Docker Swarm SecretKubernetes CSI Secret Store
  5. 发布流程:本地验证 → docker app push → 内部市场 Webhook 触发镜像扫描(Trivy、洞见、默安)人工审批(OA 工单) → 自动同步到离线仓库(两地三中心)
  6. 回滚策略:CNAB 的 claim 文件记录每版本参数,支持 docker app install --relocation-mapping 快速回退

答案

  1. 准备微服务模板
    在项目根创建 dockerapp 目录,写入 metadata.yml

    version: 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 锁版本,防止外部拉取失败。

  2. 最小化与多架构
    在 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

  3. 参数化与配置
    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 ...
    
  4. 本地验证

    docker app validate .
    docker app install --name test-app
    

    docker app status test-app 查看 claim,确认 Health=Ready 后,执行集成测试脚本(公司统一用 Python+pytest)。

  5. 打包与签名

    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 并随包上传,满足内部审计。

  6. 发布到内部市场
    登录公司 DevOps 门户 → 选择“模板上架” → 上传 *.dockerapp 包 → 填写信创适配级别(L2-L4)高危漏洞自检报告 → 提交 OA 工单。
    审批通过后,市场会自动在三大数据中心 Harbor 之间同步,并给业务线发 Webhook 通知,研发即可一键 docker app install 部署。

  7. 版本升级与回滚
    升级:

    docker app upgrade test-app --set replicaCount=3
    

    回滚:

    docker app install --from-claim claim-test-app.json --relocation-mapping
    

拓展思考

  1. 如果内部市场未来全面转向 OCI Artifact v1.1,Docker App 包可直接转成 OCI Image Layout,只需把 bundle.json 放到 artifactType=cnab.io/docker-app 层即可,无需改造 CI 脚本
  2. 边缘机房可采用 docker app bundle 导出离线 tar,用 U 盘+国密 USBKey 手工导入,解决零信任网络场景。
  3. 考虑Serverless 容器(如华为 CCI、阿里云 ASK),可把 Docker App 的 compose 服务拆成 Knative Service 模板,用 cnab-to-knative 工具自动生成 yaml,实现同一套源模板在虚拟机、Swarm、K8s、Serverless 四栖运行。