出品丨Docker公司(ID:docker-cn)
编译丨小东
每周一、三、五晚6点10分 与您不见不散
说在前面
Docker Compose 在开发人员中非常流行,它用来描述应用程序。目前,GitHub 上有超过30万个 Docker Compose 文件。通过在 docker-compose.yml 文件中对一组服务进行描述,就可以在 Docker 上用一条命令轻松的启动一个复杂的多服务应用程序(或简单的单服务应用程序)。这种易用性使得 Docker Compose 非常适合开发团队快速开展项目。
&
随着时间的推移,Compose 不断发展并添加了许多功能可以在将相同的应用程序部署到生产环境时提供帮助,例如,指定大量副本、内存资源限制或自定义系统日志服务器。但这些属性可能会跟您自己的环境有所差异。有许多不同的策略来解决这个问题,但是最常见的就是依赖于复制和粘贴。例如,为在不同环境中运行的同一应用程序维护多个 Compose 文件是相当常见的,但这会导致了两个问题:
我们一直都在分享 Docker 镜像,但却没有一个很好的方法来共享使用它们的多服务应用程序;
开发人员和运维人员很难围绕 Compose 文件进行协作。这淡化了在代码中描述应用程序的其中一项关键优势 —— 即开发人员和操作人员使用同一个 Compose 文件的机会,并在产品投入生产之前捕获配置问题;
介绍 docker-app
解决这个问题的一种方法是通过构建一个与 Compose 相辅相成的工具来使它更容易用于共享和协作。请注意,这是实验性的,还有很多工作正在进行中,但我们希望获得早期采用者的反馈和意见,这会:
使基于Compose 的应用程序可以共享在 Docker Hub 和 DTR 上;
支持在应用程序描述和每个环境设置之间更紧密的关注点分离;
该实现包含一些额外的元数据文件和一个小型命令行工具。让我们来举个简单的例子。
使用下面的 Compose 文件。它启动一个HTTP服务器,当触发配置的端口时,它会显示出指定的文本。
version: '3.6'
services:
hello:
image: hashicorp/http-echo
command: ["-text", "hello world"]
ports:
- 5678:5678
用 docker-app 命令安装,让我们基于这个 Compose 文件创建一个应用程序包:
$ docker-app init --single-file hello
$ ls
docker-compose.yml
hello.dockerapp
这个应用程序包只是一个文本文件(或者是一个目录),在这个例子中叫做 hello.dockerapp。它包含三个YAML文档:
一些元数据
Compose 文件
应用程序的一些设置
它应该是这样的:
# This section contains your application metadata.
version: 0.1.0
name: hello
description: ""
maintainers:
- name: yourusername
email: ""
targets:
swarm: true
kubernetes: true
--
# This section contains the Compose file that describes your application services.
version: '3.6'
services:
hello:
image: hashicorp/http-echo
command: ["-text", "hello world"]
ports:
- 5678:5678
--
# This section contains the default values for your application settings.
{}
让我们编辑设置部分(替换 {})并为我们的应用程序添加以下默认值:
port: 5678
text: hello development
version: latest
然后修改 Compose 文件部分,添加一些变量:
version: '3.6'
services:
hello:
image: hashicorp/http-echo:${version}
command: ["-text", "${text}"]
ports:
- ${port}:5678
最后,您可以通过使用所提供的默认值渲染 Compose 文件来进行测试。
$ docker-app render
version: "3.6"
services:
hello:
command:
- -text
- hello development
image: hashicorp/http-echo:latest
ports:
- mode: ingress
target: 5678
published: 5678
protocol: tcp
请注意,这些变量已经被设置值替换。之后,您可以像使用其他 Compose 文件一样来使用该 Compose 文件了。您可以将其保存到磁盘或 Docker 应用栈中亦或是使用 docker-compose 命令来启动应用程序。
$ docker-app render | docker-compose -f – up
这就是它有趣的地方。我们可以在运行时使用 --set 选项来覆盖这些设置。让我们指定不同的选项并再次运行渲染:
$ docker-app render --set version=0.2.3 --set port=4567 --set text="hello production"
version: "3.6"
services:
hello:
command:
- -text
- hello production
image: hashicorp/http-echo:0.2.3
ports:
- mode: ingress
target: 5678
published: 4567
protocol: tcp
请注意在生成的 Compose 文件中对端口和版本进行更改。
如果你愿意,你可以创建一个独立的配置文件来存储这些设置。 让我们用以下内容创建`prod.yml`:
version: 0.2.3
text: hello production
port: 4567
然后,您可以使用该配置文件显示 Compose 文件,如下所示:
$ docker-app render -f prod.yml
这样就可以很容易地为不同的环境单独的设置文件了,从而减少了复制整个 Compose 文件的需要。
如果您想要超越hello world,我们还准备了一些更高级的例子。
您可以在 Docker Compose 中使用环境变量支持来实现与上述类似的内容,但需要您自己编写工具来提供一个不错的用户界面。有了上述惯例,我们可以在上面创建更有趣的东西。 例如,我们可以构建相当有趣的自省工具,就像下面所示的那样,我们计划将简单的变量替换转换为更复杂的模板。
检查和部署应用程序包
docker-app 命令不仅提供了用不同设置来渲染 Compose 文件的方法。它还提供了一些实用工具来与它们进行交互。例如,如果有人给你一个 .dockerapp,这时你可以很容易地了解它的信息,特别是在运行时发现哪些设置是可用的,而不需要读取任何包代码。
$ docker-app inspect
hello 0.1.0
Maintained by: gareth
A hello world example of a Docker application package.
Setting Default
------- -------
port 8080
text hello world
version latest
一旦准备好部署应用程序的一个版本,您就可以使用子命令进行部署了。它的工作方式与 docker 应用栈的部署命令完全相同,因此您应该很熟悉这一点。例如,如果您使用的是Docker Desktop 或 Docker EE,那么您就可以将应用程序部署到 Kubernetes,同时覆盖一些暴露的设置。
$ docker-app deploy --set port=4567 --orchestrator=kubernetes
docker-app 还有很多实用的工具,你可以在内置的帮助信息中找到,或者等待后续的文章推送。
感兴趣吗?
如果您感兴趣的话,可以点击文尾处“阅读原文”访问 GitHub 仓库。您将会看到基本的文档和几个示例,以及下载最新版本(针对Windows、macOS或Linux)和应用程序源代码的说明。如果您在有任何问题、想法都可以在这个镜像仓库中提交给我们。
点击下列标题,阅读更多干货
Docker EE 统一应用程序管理功能大揭秘,你想要的都在这里!
DockerCon 成功案例系列丨Liberty Mutual 保险公司
DockerCon 大会第一天回顾,三大新功能先睹为快!
最佳实践系列丨Docker EE 供应链安全加固指南(三)
如果本文对你有帮助,欢迎分享到朋友圈!获取更多Docker实用技巧,扫描下图二维码!
点击下方“阅读全文”,了解详情!