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