[关闭]
@levinzhang 2019-11-10T15:54:15.000000Z 字数 5664 阅读 595

使用Docker Application Package实现跨团队交付应用

by

摘要:

在本文中,我们将会看到CNAB打包格式如何帮助应用提供商和开发人员提供将多组件应用程序安装到分布式计算环境中,这种应用程序支持多个可执行单元,通过这种方式能够更容易地跨团队、组织和市场交付应用。


核心要点

云原生应用通常会使用不同的技术,每种技术都有自己的打包格式。举例来说,如果你使用Microsoft Azure的话,那么格式将会是ARM模板,如果使用Kubernetes的话,那就是Helm charts,如果使用AWS的话,那么可能就是CloudFormation等等。

分布式应用通常由可执行单元(executable unit)基于API的支撑服务所组成。可执行单元可能会跨多种环境,比如IaaS(如OpenStack或Azure)、容器编排器(如Kubernetes或Nomad)、容器运行时(如本地Docker或ACI)、云平台服务(如对象存储或数据库即服务)和功能即服务(FaaS,Functions-as-a-Service),同时还有高层级的PaaS服务。除了这些组件外,许多托管云服务,例如负载均衡器、数据库的路由器,都以REST API进行提供和互连。

在我们的行业中,目前还没有解决方案能够定义和打包多服务、多格式的分布式应用。

在本文中,我们将会看一下CNAB打包格式如何为应用供应商和开发人员提供一种将多组件应用安装到分布式计算环境的方式,该格式支持上述的所有类型,使得跨团队、组织和市场交付应用变得更加容易。

云原生应用Bundle(CNAB)简介

云原生应用Bundle(Cloud Native Application Bundle,CNAB)是一个开源、云中立的规范,致力于打包和运行分布式应用。该规范是由微软、Docker、HashiCorp、Bitnami、Pivotal和很多其他公司创立的。它将跨不同工具链的多服务、分布式应用进行统一管理,将其放到一个一站式的打包格式中。

收益 描述
简化复杂的部署 借助CNAB,我们可以打包多服务、多格式的分布式应用。所以,部署很容易就能得到简化。
开源、云中立 CNAB bundle可以适应我们所需的各种基础设施组件或服务。对于多云策略来讲,CNAB是正确的选择。
可分享的应用 能够让开发人员/应用提供商跨团队、组织和市场共享/交付应用。

CNAB的主要收益

按照CNAB规范,CNAB打包格式能够带来如下功能:

  1. 支持面向不同运行时和架构的包。
  2. 内部使用容器来封装安装逻辑,所以能够独立于底层的云环境。
  3. 有一个bundle定义文件bundle.json)和一个调用镜像(invocation image)组成,前者用来定义应用,后者用来安装应用。调用镜像的任务是安装所需的组件到宿主环境中。
  4. CNAB_bundle定义_文件包含了如下的信息:

    • 关于bundle的信息,如名称、bundle版本、描述和关键字
    • 关于调用镜像的信息(installer程序)
    • 本bundle将要安装的可执行镜像的列表
    • 本bundle运行所需的凭证路径或环境变量列表
  5. CNAB调用镜像包含了一个标准化的文件系统布局,其中存储了元数据和安装数据。

    • 文件系统的层级结构在规范中进行了声明
    • 主入口(run tool):可执行文件,用来将动作请求(如安装/更新)转换成任务序列
    • 运行时元数据(比如Helm charts、Terraform模板等)
    • 用来构建镜像的文件(如Dockerfile)

基于Docker compose构建的容器应用不易于跨团队和在不同的环境之间共享和管理。

为了克服这一点,最新版本的Docker App实现了目前的CNAB规范。通过实现CNAB规范,Docker App既可以用来为Compose构建bundle,也可以安装、升级和卸载任意其他的CNAB bundle。同样的CNAB bundle可以在任何兼容CNAB的客户端中使用。

在下一部分的内容中,我们看一下如何将已有的Docker compose应用转换成新的Docker Application Package。

安装Docker App

我们有两种方式来安装Docker App,要么独立安装,要么作为CLI插件。针对Windows、Linux和macOS的预构建静态二进制文件可以在GitHub发布页面获取。在这里,我使用Linux版本,并将Docker app安装成一个独立的工具。

图:Docker App安装

图:Docker App安装成功

在下面的样例中,我们将会看到如何将已有的Compose应用转换为Docker App项目。

创建新的Helloworld Docker App

Docker App搭建完成之后,我们可以使用已有的Docker compose文件(如下所示),它会启动一个HTTP echo服务器,当访问配置好的端口时,服务器会打印指定的文本。

version: '3.2'
services:
  hello:
    image: hashicorp/http-echo
    command: ["-text", "hello world"]
    ports:
      - 5678:5678

图:Hello World Docker compose文件

在compose文件所在的目录中运行docker-app init命令,这样就能创建一个新的Application Package:

docker app init --single-file hello

图:Hello World Docker App已创建

如果你查看一下Docker Application Package的 hello.dockerapp,会发现它包含了三个YAML文档:

如果你希望将这三个核心文档放到单独的YAML文件中的话,那么可以移除docker app init command命令上的--single-file选项。这样的话,会创建一个新的目录,而不是单个文件。

图:Docker Application Package文件

编辑元数据

接下来,我们编辑helloworld.dockerapp中的Compose文件部分,引入$text和$port变量。

version: '3.2'
services:
  hello:
    image: hashicorp/http-echo
    command: ["-text", "${text}"]
    ports:
      - ${port}:5678

图:修改后的Docker Application Package文件

探查Docker App

在启动修改后的Docker Application Package之前,我们检查一下是否一切正常。

图:探查Docker App

Docker App还提供了一个validate命令,能够用来检查语法和配置的其他方面。我们跳过这一步,直接渲染应用。

渲染Docker App

render命令将会使用默认值展示compose文件。

图:渲染Docker App

下一步就是部署Docker App项目。在这里,我们有两个可选方案,要么将其启动为Docker原生app应用,要么将其启动为Compose app应用。

我们采用Compose app方案,随后将应用推送至DockerHub注册中心。

启动Docker App

图:启动Docker App

图:Docker App的输出

使用不同的配置来启动Docker App

尽管Docker Compose配置有默认的端口和文本值,但是我们可以在运行时设置这些值并部署它们。

下面,我们尝试为端口和文本设置不同的值。

图:通过不同的配置来启动Docker App

图:Docker App的输出

我们可以通过docker app status <app-name>命令检查应用的状态。

在DockerHub上共享Docker App

新的Docker应用打包好之后,带有默认值的compose配置可以推送至DockerHub,在开发者/团队之间共享。

图:在DockerHub上共享Docker App

安装为Docker原生App

应用可以通过运行docker app deploy进行安装,或者使用渲染后的版本并运行docker stack deploy render/docker-compose.ymldocker-compose –f up

图:安装Docker App

升级Docker App

Application Package推送至DockerHub或其他注册中心之后,我们就可以使用像install、upgrade、uninstall这样的命令了。

图:升级Docker App

卸载Docker App

图:卸载Docker App

在接下来的章节中,我们会看另外一个例子,它使用了Angular、SpringBoot和PostgreSQL技术栈,我们看一下如何为它创建Docker Application Package。

为Angular、SpringBoot和PostgreSQL应用创建Docker App

如下展示了我们将要使用的Angular、SpringBoot和PostgreSQL应用的compose文件。

version: '3'
services:
   ui:
    build:
      context: .
      dockerfile: UIDockerfile
    ports:
      - '4200:4200'
    networks:
      - samplenet
    links:
      - 'api:api'
  api:
   build:
     context: .
     dockerfile: AppDockerfile
   ports:
     - '8080:8080'
   depends_on:
    - db
   networks:
    - samplenet
   links:
    - 'db:db'
  db:
   build:
    context: .
    dockerfile: DBDockerfile
  volumes:
   - 'postgresdb:/var/lib/postgresql/data'
  environment:
   POSTGRES_USER: postgres
   POSTGRES_PASSWORD: postgres
   POSTGRES_DB: testdb
  ports:
   - '5432:5432'
  healthcheck:
   test:
     - CMD-SHELL
     - 'pg_isready -U postgres'
   interval: 10s
   timeout: 5s
   retries: 5
  networks:
   - samplenet
networks:
samplenet: null
volumes:
postgresdb: {}

上面的compose文件定义了如下服务:

在compose文件所在的目录下,运行docker-app init命令,创建一个新的Application Package:

图:创建新的Application Package

图:生成的Application Package

接下来,我们探查一下,看是否一切正常。

图:探查Application Package

接下来,使用Docker Compose up命令并附加render选项来启动应用。

图:渲染Application Package

将其推送至DockerHub之后,我们就可以和团队共享它了,团队成员能够执行像install、upgrade和uninstall这样的任务。

图:推送Application Package到DockerHub

现在,可以通过运行docker app deploy安装应用,或者使用渲染后的版本并运行docker stack deploy render/docker-compose.ymldocker-compose –f up

图:安装Application Package

结论

Compose文件难以在不同的环境或跨团队共享,Docker Application Packages解决了这些问题,使得Compose应用能够跨不同环境(开发/QA/Staging/生产)实现重用。Docker App目前还处于体验模式阶段,不能在生产环境中使用。

参考资料

  1. Cloud Native Application Bundle (CNAB)规范
  2. CNAB bundle样例
  3. Docker App Github

关于作者

Karthikeyan Shanmugam(Karthik)是一位经验丰富的解决方案架构师,在银行、金融服务、医疗保健和航空领域的企业应用程序设计和开发方面拥有超过18年以上的经验。目前,他主要从事技术咨询,为应用转换(Application Transformation)领域提供解决方案。

查看英文原文:Using Docker Application Packages to Deliver Apps Across Teams

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注