@levinzhang
2019-11-10T15:54:15.000000Z
字数 5664
阅读 633
by
在本文中,我们将会看到CNAB打包格式如何帮助应用提供商和开发人员提供将多组件应用程序安装到分布式计算环境中,这种应用程序支持多个可执行单元,通过这种方式能够更容易地跨团队、组织和市场交付应用。
CNAB包格式包括一个定义应用的bundle定义文件(bundle.json),以及安装应用的调用(invocation)镜像。
最新的Docker App发布版本实现了当前的CNAB规范。通过实现该CNAB规范,Docker App可以用来构建适用于Compose的CNAB bundle,同时还能安装、更新和卸载任意其他的CNAB bundle。
云原生应用通常会使用不同的技术,每种技术都有自己的打包格式。举例来说,如果你使用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(Cloud Native Application Bundle,CNAB)是一个开源、云中立的规范,致力于打包和运行分布式应用。该规范是由微软、Docker、HashiCorp、Bitnami、Pivotal和很多其他公司创立的。它将跨不同工具链的多服务、分布式应用进行统一管理,将其放到一个一站式的打包格式中。
收益 | 描述 |
---|---|
简化复杂的部署 | 借助CNAB,我们可以打包多服务、多格式的分布式应用。所以,部署很容易就能得到简化。 |
开源、云中立 | CNAB bundle可以适应我们所需的各种基础设施组件或服务。对于多云策略来讲,CNAB是正确的选择。 |
可分享的应用 | 能够让开发人员/应用提供商跨团队、组织和市场共享/交付应用。 |
CNAB的主要收益
按照CNAB规范,CNAB打包格式能够带来如下功能:
CNAB_bundle定义_文件包含了如下的信息:
CNAB调用镜像包含了一个标准化的文件系统布局,其中存储了元数据和安装数据。
基于Docker compose构建的容器应用不易于跨团队和在不同的环境之间共享和管理。
为了克服这一点,最新版本的Docker App实现了目前的CNAB规范。通过实现CNAB规范,Docker App既可以用来为Compose构建bundle,也可以安装、升级和卸载任意其他的CNAB bundle。同样的CNAB bundle可以在任何兼容CNAB的客户端中使用。
在下一部分的内容中,我们看一下如何将已有的Docker compose应用转换成新的Docker Application Package。
我们有两种方式来安装Docker App,要么独立安装,要么作为CLI插件。针对Windows、Linux和macOS的预构建静态二进制文件可以在GitHub发布页面获取。在这里,我使用Linux版本,并将Docker app安装成一个独立的工具。
图:Docker App安装
图:Docker App安装成功
在下面的样例中,我们将会看到如何将已有的Compose应用转换为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 Application Package之前,我们检查一下是否一切正常。
图:探查Docker App
Docker App还提供了一个validate命令,能够用来检查语法和配置的其他方面。我们跳过这一步,直接渲染应用。
render命令将会使用默认值展示compose文件。
图:渲染Docker App
下一步就是部署Docker App项目。在这里,我们有两个可选方案,要么将其启动为Docker原生app应用,要么将其启动为Compose app应用。
我们采用Compose app方案,随后将应用推送至DockerHub注册中心。
图:启动Docker App
图:Docker App的输出
尽管Docker Compose配置有默认的端口和文本值,但是我们可以在运行时设置这些值并部署它们。
下面,我们尝试为端口和文本设置不同的值。
图:通过不同的配置来启动Docker App
图:Docker App的输出
我们可以通过docker app status <app-name>命令检查应用的状态。
新的Docker应用打包好之后,带有默认值的compose配置可以推送至DockerHub,在开发者/团队之间共享。
图:在DockerHub上共享Docker App
应用可以通过运行docker app deploy进行安装,或者使用渲染后的版本并运行docker stack deploy render/docker-compose.yml或docker-compose –f up。
图:安装Docker App
Application Package推送至DockerHub或其他注册中心之后,我们就可以使用像install、upgrade、uninstall这样的命令了。
图:升级Docker App
图:卸载Docker App
在接下来的章节中,我们会看另外一个例子,它使用了Angular、SpringBoot和PostgreSQL技术栈,我们看一下如何为它创建Docker Application Package。
如下展示了我们将要使用的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.yml或docker-compose –f up
图:安装Application Package
Compose文件难以在不同的环境或跨团队共享,Docker Application Packages解决了这些问题,使得Compose应用能够跨不同环境(开发/QA/Staging/生产)实现重用。Docker App目前还处于体验模式阶段,不能在生产环境中使用。
Karthikeyan Shanmugam(Karthik)是一位经验丰富的解决方案架构师,在银行、金融服务、医疗保健和航空领域的企业应用程序设计和开发方面拥有超过18年以上的经验。目前,他主要从事技术咨询,为应用转换(Application Transformation)领域提供解决方案。
查看英文原文:Using Docker Application Packages to Deliver Apps Across Teams