Docker Compose 实战教学,教您如何运行、管理和升级分布式应用程序(二)

640?wx_fmt=jpeg

出品丨Docker公司(ID:docker-cn)

编译丨小东

每周一、三、五晚6点10分  与您不见不散!


说在前面


这篇文章是 Windows Dockerfile 系列文章中的一篇,我将介绍使用 Docker Compose 在 Docker 中运行、管理和升级分布式应用程序。 今天我将为大家带来本文的第二部分内容:使用 Docker Compose 在 Docker 中管理和升级分布式应用程序。点击下方标题,查看第一部分内容:


&

用 Compose 部署和管理应用程序


Docker Compose简单易用。 它与 Docker Desktop for Windows 捆绑在一起,您可以使用 Chocolatey 来安装 Docker Compose。


您可以使用“docker-compose”命令行和 Compose YAML 文件来管理您的应用程序。 使用关键命令“up”来部署应用程序、“down”来停止应用程序并删除所有容器以及“build”来构建镜像。


要使用 Compose 来运行应用程序,只需克隆镜像仓库,导航到该目录并使用“docker-compose up”命令即可:


git clone https://github.com/sixeyed/docker-on-windows.git

cd ./docker-on-windows/ch06/ch06-docker-compose
 
docker-compose up -d  

如果未指定文件名,Compose 将查找名为 docker-compose.yml 的文件。 此目录中的 YAML 文件定义了 Docker Hub 上的公开镜像,如果您本地没有该镜像,那么 Compose 将提取 Docker Hub 上的公开镜像。


然后 Compose 按正确的顺序启动所有服务的容器来维护依赖关系。 Compose 中的“–d”命令与容器中的“docker container run - it”命令相同,都是在后台启动该容器。

640?wx_fmt=png


docker-compose.yml 文件未指定任何服务的规模,因此它们都将使用默认值启动,即每个服务分配一个容器。Compose 文件是所需的状态,当你运行“up”时,Compose 会查看 Docker 引擎中的实际状态并创建它到达该状态时所需的状态。


使用“docker container ls”命令来检查正在运行的容器,您可以在这看到整个应用程序堆栈。所有容器都是由 Compose 生成的名称,并将当前目录名称添加到服务名称中,如下图所示:


640?wx_fmt=png


您可以使用 Compose 扩展应用程序的组件,前提是组件能够在多个实例中运行而不会相互影响。 消息处理程序设计为可以在动态环境中扩展运行,因此我们可以轻松地对扩展它们:


docker-compose up -d `  
 --scale nerd-dinner-save-handler=3 `
 --scale nerd-dinner-index-handler=2


这将为 Elasticsearch 索引处理程序添加第二个容器,为 SQL Server 保存处理程序添加另外两个容器。 它们正在运行连接到 NATS 的消息处理程序,由于它们是为扩展而设计的,因此它们将共享消息处理负载。

640?wx_fmt=png


用 Compose 升级应用程序


您可以使用 Docker Compose 和新的 docker-compose-db-upgrade.yml 文件(点击文尾处“阅读原文”查看完整代码)来部署更新:

docker-compose -f docker-compose-db-upgrade.yml up -d 




Compose 重新创建了数据库服务,删除了旧容器并从新镜像标签运行一个新的容器。新容器连接到与旧容器相同的卷,因此 SQL Server 中的所有数据都会保留,并且在数据库容器启动脚本运行时会添加新列。


数据库容器启动脚本请查看:https://github.com/sixeyed/docker-on-windows/blob/master/ch06/ch06-nerd-dinner-db/Initialize-Database.ps1


还有一些定义为依赖于数据库服务的其他服务,因为数据库服务的更改,因此也会重新创建这些服务。在这种情况下,Compose  还会将消息处理程序服务缩减为每个容器。


为什么 Compose 缩减了我已经明确扩展的服务呢?因为 Compose 文件是所需状态,并且我的更新文件没有指定任何服务规模,所以默认值为1。 当 Compose 看到运行状态规模过大时,它将删除容器来使服务符合所需状态。


这是将声明性部署与 Compose 文件混合并使用 –scale 选项进行命令式部署的副作用。


最好坚持声明性部署并通过 Compose 文件进行所有更新。该 Compose 文件与您的 Dockerfiles 和应用程序源一起处于源代码控制中。

640?wx_fmt=png


用 Compose 覆盖拆分关注点


您还可以将应用程序定义拆分成多个 Compose 文件。拆分关注点非常方便,您可以将开发和生产的部署选项列入到单独的文件中,并为核心应用程序定义提供一个主要的文件。


以下就是我将应用程序定义拆分成的多个 Compose 文件:


  • “docker-compose.yml”定义了核心应用程序服务,其中包含适用于每种环境的选项;

  • “docker-compose.build.yml” 为自定义的 Docker 镜像添加了构建定义。这可以用于在开发人员和 CI 管道中的 docker-compose build,但在其他场景中不适用。将它放在一个单独的文件中可以保持核心 Compose 文件的整洁;

  • “docker-compose.local.yml” 添加了在本地运行应用程序的选项,将容器端口发布到主机上的随机端口;

  • “docker-compose.production.yml” 为生产部署添加配置,指定明确的端口进行发布和为卷映射主机目录;


用“-f”将多个文件组合在一起,如果这些文件具有相同配置部分的值,那么最新的文件将覆盖最早的文件。


因此,为了构建整个应用栈,我将运行:

docker-compose `  
 -f docker-compose.yml `
-f docker-compose.build.yml `
build


并在本地运行:

docker-compose `  
 -f docker-compose.yml `
-f docker-compose.local.yml `
up -d


这是构建应用程序定义的一种很好的方法,在一个地方设置所有环境,但每个环境的详细信息是独立的。


最后,您可以使用 Compose 文件将应用程序部署到生产环境。

640?wx_fmt=png


点击下列标题,阅读更多干货



如果本文对你有帮助,欢迎分享到朋友圈!获取更多Docker实用技巧,扫描下图二维码!

     

640?wx_fmt=png


640?wx_fmt=gif点击下方“阅读全文”,了解详情

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值