在堆栈部署后向堆栈添加服务

Par*_*tra 9 docker docker-compose docker-swarm docker-swarm-mode docker-stack

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

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

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

我想首先将一个堆栈部署到一个 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 中的容器发出的。这是使用 go sdk for docker 发生的,我正在按照一次性容器文章描述的方式使用它

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

Par*_*tra 11

当您像这样部署堆栈时:

docker stack deploy --with-registry-auth --compose-file docker-compose.yml my-stack
Run Code Online (Sandbox Code Playgroud)

它创建了一个名为的网络 my-stack_default

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

docker service create -name statefulservice --network my-stack_default reponame/imagename
Run Code Online (Sandbox Code Playgroud)