HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

  • 2019-12-04
  • 本文字数:4340 字

    阅读完需:约 14 分钟

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

本文要点

  • 目前,尚没有解决方案能够定义和打包在任意主机上运行的多服务、多格式的分布式应用。

  • 云原生应用 bundle(Cloud-Native Application Bundle,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(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 定义_文件包含了如下的信息:

  5. 关于 bundle 的信息,如名称、bundle 版本、描述和关键字

  6. 关于调用镜像的信息(installer 程序)

  7. 本 bundle 将要安装的可执行镜像的列表

  8. 本 bundle 运行所需的凭证路径或环境变量列表

  9. CNAB 调用镜像包含了一个标准化的文件系统布局,其中存储了元数据和安装数据。

  10. 文件系统的层级结构在规范中进行了声明

  11. 主入口(run tool):可执行文件,用来将动作请求(如安装/更新)转换成任务序列

  12. 运行时元数据(比如 Helm charts、Terraform 模板等)

  13. 用来构建镜像的文件(如 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 文档:


  • 第一部分包含了元数据,如名称、版本、描述和维护者。

  • 第二部分描述了应用,实际上就是我们的 Compose 文件

  • 第三部分是应用的参数


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



图:Docker Application Package 文件

编辑元数据

接下来,我们编辑 helloworld.dockerapp 中的 Compose 文件部分,引入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 命令检查应用的状态。

在 DockerHub 上共享 Docker App

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



图:在 DockerHub 上共享 Docker App

安装为 Docker 原生 App

应用可以通过运行 docker app deploy 进行安装,或者使用渲染后的版本并运行 docker stack deploy render/docker-compose.yml docker-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:   - samplenetnetworks:samplenet: nullvolumes:postgresdb: {}
复制代码


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


  • ui:运行在 4200 端口上,服务于 Angular 应用。

  • api:运行在 8080 端口上,服务于 Spring Boot 应用。

  • db:运行在 5432 端口上,服务于 postgresdb 应用。

  • 上述的服务都使用了 samplenet network

  • 持久化卷 postgresdb 定义是用于 db 服务的。

  • db 服务添加了额外的健康检查部分,以便于跟踪数据库的健康状况。

  • depends_on 阐明了服务的依赖关系。当启动服务的时候,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 目前还处于体验模式阶段,不能在生产环境中使用。

参考资料

  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


2019-12-04 08:003732

评论

发布
暂无评论
发现更多内容

Android 使用微信开放平台分享内容到微信,apm性能监控系统

android 程序员 移动开发

Android 四大组件全解读,kotlin极简教程

android 程序员 移动开发

android 对不同日期和时间的格式方法的封装,46道面试题带你了解高级Android面试

android 程序员 移动开发

Android Volley 源码解析(一),ffmpeg音视频开发实战2019下载

android 程序员 移动开发

Android WebView判定网页加载的错误,androidtv开发者模式

android 程序员 移动开发

Android wifi属性简介 及 wifi信息获取(wifi列表、配置信息

android 程序员 移动开发

Android 启动优化: JetPack App Startup 使用及源码浅析

android 程序员 移动开发

Android 实现水印背景效果,kotlin教程

android 程序员 移动开发

软件测试面试屡屡失败,面试官总是说逻辑思维混乱,怎么办?

六十七点五

学习方法 面试 软件测试 自动化测试 测试工程师

Android UI- PullToRrefresh自定义下拉刷新动画,android开发入门书

android 程序员 移动开发

百度人脸活体检测系统通过信通院“护脸计划”首批优秀级安全防护能力评估

百度大脑

信通院 人脸活体检测

Android 可控制概率家务转盘,移动端跨平台开发大型项目

android 程序员 移动开发

Android 如何从应用深入到Framework (一),2018移动应用开发前景

android 程序员 移动开发

Android 内存性能优化,灵魂一问-如何彻底防止APK反编译

android 程序员 移动开发

Android 实现双Launcher的无缝切换,flutter免费视频教程

android 程序员 移动开发

Tailwind CSS 入门和实践

全象云低代码

CSS 大前端 低代码开发

Android View Binding使用详解,阿里巴巴安卓面试题答案

android 程序员 移动开发

Android Zygote 从何而来?揭开Android系统启动的面纱,flutter真机调试

android 程序员 移动开发

Android 使用Face++ SDK进行人脸识别和年龄检测,android开发网络框架

android 程序员 移动开发

Android 单元测试之 Mockk,idea开发android教程

android 程序员 移动开发

CDP客户数据管理平台体系化搭建

CRM 客户数据平台 CDP DSP DMP

Android 可能你想要的APK瘦身笔记,2021最新安卓大厂面试题来袭

android 程序员 移动开发

Android 存储进化:分区存储,2021最新Android笔试题及答案

android 程序员 移动开发

Android UI - 实现广告Banner轮播效果(1),Android进阶

android 程序员 移动开发

Android UI - 实现广告Banner轮播效果,Android大厂74道高级面试合集

android 程序员 移动开发

Android WebView与Native通信总结,Android中高级面试必知必会

android 程序员 移动开发

Android _《看完不忘系列》之Retrofit,flutter下载文件

android 程序员 移动开发

Android ViewPager2 & TabLayout,fluttertextfield高度

android 程序员 移动开发

Android 存储空间的最佳实践,【金九银十】

android 程序员 移动开发

使用桥接模式设计复杂的消息系统

Tom弹架构

Java 架构 设计模式

Android 屏幕适配方案,安卓开发

android 程序员 移动开发

使用Docker Application Package实现跨团队交付应用_软件工程_Karthikeyan Shanmugam_InfoQ精选文章