首页 > 解决方案 > 部署堆栈后向堆栈添加服务

问题描述

在已经部署堆栈后,我正在尝试向堆栈添加服务。但是这个新服务在与堆栈内的服务(redis)通信时遇到了问题。

这是我目前对堆栈和服务的理解,如果有任何不准确之处,请告诉我。

堆栈是服务之上的抽象,它提供有用的实用程序(如 DNS),因此堆栈中的服务可以相互通信。堆栈允许我们在逻辑上分离出可能在同一个 swarm 上运行的服务组(因此不同的开发团队可以共享同一个 swarm)。

我想首先将堆栈部署到 swarm(通过 compose 文件),然后定期添加容器,如本文中关于一次性容器的描​​述。这些容器是不同的,因为它们执行的是长时间的、有状态的操作。他们需要以某种初始状态启动,完成他们的工作,然后离开。它们是不同的,因为它们不需要被复制或负载平衡。

基本上我想做的是:

像这样启动一个“堆栈”:

docker stack deploy --with-registry-auth --compose-file docker-compose.yml my-stack

然后一段时间后,当满足某些条件时,添加一个像这样的容器:

docker service create -name statefulservice reponame/imagename

这通常表现如预期,除了 statefulservice 无法与 my-stack 中的 redis 对话。

我相信 statefulservice 的设计是正确的,因为当它被添加到 docker-compose.yml 时,它的行为符合预期。

另一个可能相关也可能不相关的细节是,创建新服务的命令是从 swarm 中的容器发出的。这是使用 docker 的 go sdk 发生的,我正在按照一次性容器文章描述的方式使用它

我怀疑这不相关的原因:当我仅通过 docker-cli 执行此操作时(并且不使用 docker sdk for go),我仍然遇到此问题。

标签: dockerdocker-composedocker-swarmdocker-swarm-modedocker-stack

解决方案


当您像这样部署堆栈时:

docker stack deploy --with-registry-auth --compose-file docker-compose.yml my-stack

它创建了一个名为my-stack_default

因此,要启动一个可以与其中的服务通信的服务,stack您需要像这样启动它们:

docker service create -name statefulservice --network my-stack_default reponame/imagename

推荐阅读