出品丨Docker公司(ID:docker-cn)
编译丨小东
每周一、三、五晚6点10分 与您不见不散!
这篇文章是 Windows Dockerfile 系列文章中的一篇,我将介绍使用 Docker Compose 在 Docker 中运行、管理和升级分布式应用程序。 今天我将为大家带来本文的第二部分内容:使用 Docker Compose 在 Docker 中管理和升级分布式应用程序。点击下方标题,查看第一部分内容:
- Docker Compose 实战教学,教您如何运维分布式应用程序(一)
用 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”命令相同,都是在后台启动该容器。
该 docker-compose.yml 文件未指定任何服务的规模,因此它们都将使用默认值启动,即每个服务分配一个容器。Compose 文件是所需的状态,当你运行“up”时,Compose 会查看 Docker 引擎中的实际状态并创建它到达该状态时所需的状态。
使用“docker container ls”命令来检查正在运行的容器,您可以在这看到整个应用程序堆栈。所有容器都是由 Compose 生成的名称,并将当前目录名称添加到服务名称中,如下图所示:
您可以使用 Compose 扩展应用程序的组件,前提是组件能够在多个实例中运行而不会相互影响。 消息处理程序设计为可以在动态环境中扩展运行,因此我们可以轻松地对扩展它们:
docker-compose up -d `
--scale nerd-dinner-save-handler=3 `
--scale nerd-dinner-index-handler=2
这将为 Elasticsearch 索引处理程序添加第二个容器,为 SQL Server 保存处理程序添加另外两个容器。 它们正在运行连接到 NATS 的消息处理程序,由于它们是为扩展而设计的,因此它们将共享消息处理负载。
用 Compose 升级应用程序
您可以使用 Docker Compose 和新的 docker-compose-db-upgrade.yml 文件(浏览 https://github.com/sixeyed/docker-on-windows/blob/master/ch06/ch06-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 和应用程序源一起处于源代码控制中。
用 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 文件将应用程序部署到生产环境。