在部署堆栈后向堆栈添加服务
Adding a service to a stack after the stack has been deployed
我正在尝试在堆栈已部署后将服务添加到堆栈。但是这项新服务在与堆栈内的服务 (redis) 通信时遇到了问题。
这是我目前对栈和服务的理解,如有不妥之处还望指出。
堆栈是服务之上的抽象,提供有用的实用程序(如 DNS),因此堆栈中的服务可以相互通信。堆栈允许我们在逻辑上分离出服务组,这些服务可能 运行 在同一个 swarm 上(因此不同的开发团队可以共享同一个 swarm)。
我想首先将一个堆栈部署到一个群中(通过组合文件),然后定期添加容器,如 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
这通常会按预期运行,除了 statefulservice 无法与 my-stack 中的 redis 通信。
我相信 statefulservice 的设计是正确的,因为当它被添加到 docker-compose.yml 时,它的行为符合预期。
可能相关也可能不相关的进一步细节是创建新服务的命令是从 swarm 中的容器发出的。使用 docker 的 go sdk 会发生这种情况,我正在按照 one-shot container article described
的方式使用它
我怀疑这不相关的原因:当我仅通过 docker-cli 执行此操作时,我仍然 运行 遇到这个问题(并且不使用 docker sdk去)。
有一个工作示例会有所帮助,但是:
我的猜测是您没有在同一个 docker 网络上使用这些服务。即使您没有手动将堆栈服务分配给网络(这很好),stack 命令也会创建一个堆栈中的所有服务都附加到的网络。您需要在后续服务创建命令中指定覆盖网络,以便它们可以在 DNS 中找到彼此并在 swarm 内部进行通信。
例如,如果我创建一个名为 nginx
的堆栈,它会将所有这些服务(除非在堆栈文件中另外配置)添加到一个名为 nginx_default
的覆盖网络中
当您像这样部署堆栈时:
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
我正在尝试在堆栈已部署后将服务添加到堆栈。但是这项新服务在与堆栈内的服务 (redis) 通信时遇到了问题。
这是我目前对栈和服务的理解,如有不妥之处还望指出。
堆栈是服务之上的抽象,提供有用的实用程序(如 DNS),因此堆栈中的服务可以相互通信。堆栈允许我们在逻辑上分离出服务组,这些服务可能 运行 在同一个 swarm 上(因此不同的开发团队可以共享同一个 swarm)。
我想首先将一个堆栈部署到一个群中(通过组合文件),然后定期添加容器,如 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
这通常会按预期运行,除了 statefulservice 无法与 my-stack 中的 redis 通信。
我相信 statefulservice 的设计是正确的,因为当它被添加到 docker-compose.yml 时,它的行为符合预期。
可能相关也可能不相关的进一步细节是创建新服务的命令是从 swarm 中的容器发出的。使用 docker 的 go sdk 会发生这种情况,我正在按照 one-shot container article described
的方式使用它我怀疑这不相关的原因:当我仅通过 docker-cli 执行此操作时,我仍然 运行 遇到这个问题(并且不使用 docker sdk去)。
有一个工作示例会有所帮助,但是:
我的猜测是您没有在同一个 docker 网络上使用这些服务。即使您没有手动将堆栈服务分配给网络(这很好),stack 命令也会创建一个堆栈中的所有服务都附加到的网络。您需要在后续服务创建命令中指定覆盖网络,以便它们可以在 DNS 中找到彼此并在 swarm 内部进行通信。
例如,如果我创建一个名为 nginx
的堆栈,它会将所有这些服务(除非在堆栈文件中另外配置)添加到一个名为 nginx_default
当您像这样部署堆栈时:
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