Docker Compose:将 docker-compose.yml 中的不同服务部署到不同的主机集

Posted

技术标签:

【中文标题】Docker Compose:将 docker-compose.yml 中的不同服务部署到不同的主机集【英文标题】:Docker Compose: deploying different services from docker-compose.yml to different set of hosts 【发布时间】:2016-11-18 15:03:17 【问题描述】:

假设我有一个docker-compose.yml 文件,其中包含 3 个不同的服务(s1、s2、s3)。 然后,如果我在一台主机上部署它们,比如 AWS ECS(例如)集群,所有三个 containers 都将转到该主机。如果我扩展集群 2 台主机,然后是第二台主机,那么第二台主机也将获得全部三个 containers

理想情况下,我希望 不同 clusters 对应不同的 services,以便它们可以独立缩放。我希望我的 database 容器与我的 backend 容器在同一个集群上,因为它们都有不同的扩展需求。

我将如何使用 docker compose 实现这种行为?

Kubernetes 有 pods 的概念,它提供了这种抽象,但是由于它不是 docker 的一部分,我想知道 *如何在 docker 中开发多服务应用程序,其中每个 service(定义在 docker-compose.yml 中)可以独立缩放。 *

【问题讨论】:

【参考方案1】:

让我们在这里直接了解术语:

docker-compose 在单个主机上部署 docker containers

docker-swarm 是用于在多个主机上部署containers 的工具。

一般来说,cluster 是一组主机(或节点),可以是物理机或虚拟机,它们一起工作。

Pod 不是集群:它是一组保证在单个节点上运行的容器,它们组合在一起并通过 localhost 进行通信。

Kubernetes 中,部署将根据复制策略、节点资源和亲和性在所有可用的 nodes 上调度容器,因此您无需定义容器的去向:Kubernetes 为你。

然后您可以通过 2 种方式进行缩放:

通过简单地增加其复制因子来扩展容器的实例数量(或者您也可以使用定义策略的自动扩展) 通过添加新节点(物理或虚拟机)来扩展集群,从而向集群添加资源。

【讨论】:

【参考方案2】:

对于 ECS,您需要创建多个集群(即,如果您坚持通过 compose 进行部署,则为每个基础架构部分创建一个集群),或者只创建多个任务。每个任务都应该是堆栈中的一个层(即 api 或 web 等)。然后,您可以独立缩放图层。

您会发现 ECS 和 K8S 之间的最大区别在于,由于 ECS 使用主机端口映射,因此您不能让 2 个不同的任务暴露同一个端口并在同一个主机上运行。

也请查看这篇 aws 文章:http://docs.aws.amazon.com/AmazonECS/latest/developerguide/application_architecture.html

【讨论】:

“如果您坚持通过 compose 进行部署,则为基础架构的每个部分创建一个集群” - 但如果我使用了解 docker-compose.yml 的 ecs-cli,那么它只会创建一个集群对于一个 compose.yml 文件。 对,如果您通过 docker-compose 进行部署,那么这是您的限制。我建议您创建单独的任务,而不是通过 compose 部署来解决问题。 是的,这似乎是正确的方法。另外,一个 ECS task 可以有多个容器,这是 docker-compose 不支持的。

以上是关于Docker Compose:将 docker-compose.yml 中的不同服务部署到不同的主机集的主要内容,如果未能解决你的问题,请参考以下文章

centos8.0安装docker & docker-compose

centos8.0安装docker & docker-compose

docker-compose常用命令安装删除

使用 Docker Compose 将主机的 SSH 密钥注入 Docker Machine

Docker-compose部署gitlab中文版

docker-compose部署nginx#yyds干货盘点#