11

在已经部署堆栈后,我正在尝试向堆栈添加服务。但是这个新服务在与堆栈内的服务(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),我仍然遇到此问题。

4

2 回答 2

14

当您像这样部署堆栈时:

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
于 2018-07-07T18:10:47.010 回答
2

有一个工作示例会有所帮助,但是:

我的猜测是您在同一个 docker 网络上没有这些服务。即使您不手动将堆栈服务分配给网络(这很好),stack 命令也会创建一个附加到该堆栈中的所有服务的网络。您需要在后续服务创建命令中指定覆盖网络,以便它们可以在 DNS 中找到彼此并在 swarm 内部进行通信。

例如,如果我创建一个名为 的堆栈nginx,它会将所有这些服务(除非在堆栈文件中另外配置)添加到一个名为nginx_default

于 2018-07-06T06:03:09.447 回答