部署堆栈后将服务添加到堆栈

时间:2018-07-05 20:10:27

标签: docker docker-compose docker-swarm docker-swarm-mode docker-stack

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

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

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

我想首先将堆栈部署到一个集群(通过组合文件),然后定期添加容器,如this article about one-shot containers中所述。这些容器之所以不同,是因为它们执行长时间的有状态操作。他们需要以某种初始状态旋转起来,做他们的工作,然后离开。它们之所以不同,是因为它们不需要复制或负载均衡。

基本上我想做的是:

像这样启动“堆栈”:

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

然后在满足某些条件后的一段时间内,添加如下容器:

docker service create -name statefulservice reponame/imagename

这通常可以达到预期的效果,除了有状态服务无法与我的堆栈中的redis对话。

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

可能相关或不相关的进一步细节是,从群内的容器发出创建新服务的命令。使用适用于docker的go sdk会发生这种情况,而我使用的是one-shot container article described

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

2 个答案:

答案 0 :(得分:3)

当您像这样部署堆栈时:

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

答案 1 :(得分:1)

有一个可行的例子会有所帮助,但是:

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

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