在swarm集群中的特定节点上运行docker容器

在swarm集群中的特定节点上运行docker容器,docker,docker-swarm,docker-swarm-mode,Docker,Docker Swarm,Docker Swarm Mode,我正在尝试建立一个备份系统。此系统要求在备份特定节点时执行docker容器。不幸的是,我无法让它在所需的节点上执行 这是我在docker swarm manager节点上使用和执行的命令。它正在swarm manager节点上创建容器,而不是约束中指定的容器。我错过了什么 docker run --rm -it --network cluster_02 -v "/var/lib:/srv/toBackup" \ -e BACKUPS_TO_KEEP="5" \ -e S3_BUCKE

我正在尝试建立一个备份系统。此系统要求在备份特定节点时执行docker容器。不幸的是,我无法让它在所需的节点上执行

这是我在docker swarm manager节点上使用和执行的命令。它正在swarm manager节点上创建容器,而不是约束中指定的容器。我错过了什么

docker run --rm -it --network cluster_02 -v "/var/lib:/srv/toBackup" \
   -e BACKUPS_TO_KEEP="5" \
   -e S3_BUCKET="backup" \
   -e S3_ACCESS_KEY="" \
   -e S3_SECRET_KEY="" \
   -e constraint:node.hostname==storageBeta \
   comp/backup create $BACKUP_NAME

您正在使用较旧的经典Swarm方法来尝试运行容器,但几乎可以肯定使用Swarm模式。如果使用
docker swarm init
安装swarm,并且可以在管理器上看到带有
docker node ls
的节点,则情况就是这样

经典Swarm作为一个容器运行,实际上是多个docker引擎的反向代理,拦截对命令的调用,如
docker run
,并将它们发送到适当的节点。通常建议避免这种较旧的swarm实现,除非您有特定的用例,并花时间在每个docker主机上配置MTL

Swarm模式提供了一个HA管理器,使用Raft for quorum(与etcd相同),处理所有管理请求的加密,配置覆盖网络,并使用声明性模型,给出目标状态,而不是运行命令。这是一个与经典Swarm非常不同的模型。值得注意的是,Swarm模式仅适用于服务和堆栈,完全忽略了
docker run
和其他本地命令,例如:

docker service create \
  --name backup \
  --constraint node.hostname==storageBeta \
  --network cluster_02 \
  -v "/var/lib:/srv/toBackup" \
  -e BACKUPS_TO_KEEP="5" \
  -e S3_BUCKET="backup" \
  -e S3_ACCESS_KEY="" \
  -e S3_SECRET_KEY="" \
  comp/backup create $BACKUP_NAME
请注意,在Swarm模式下,作业还没有得到很好的支持(有一个公开的问题,需要社区反馈是否包含此功能)。它目前的重点是运行除非出现错误否则通常不会退出的持久性服务。如果您的命令预计将退出,您可以包括一个选项,如
--restart max attempts 0
,以防止swarm模式重新启动它。如果网络不是swarm范围,您可能还需要做额外的工作


我还建议将其转换为
docker compose.yml
文件,并使用
docker stack deploy
进行部署,以便更好地将服务记录为配置文件。

感谢您的详细解释。我们已经在为集群使用swarm,现在希望从swarm manager启动备份。我看使用--restartmax尝试是否对我们有效。您知道它在失败时是否会抛出正确的错误/解决方法,以便我们可以执行类似于
/home/user/backup.sh&&curl-fsS的操作--重试3https://hc-ping.com/62241e9e-a4aa-40e6-8ad1-15f21d884f87 >/dev/null
@user2693017这是您希望在环境中测试的内容。我通常避免使用重启策略,因为我运行的是服务而不是作业,在这种情况下,容器重启策略可能与swarm调度器冲突。你有什么建议吗?我可以在远程服务器上打开一个shell来执行此操作,但希望尽可能避免这种情况。@user2693017通过在您的环境中进行测试,我认为您可以创建具有不同重启策略标志的各种服务,以查看是否可以获得所需的行为。服务可能会故意使您无法测试错误处理。