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