docker stack deploy 如何工作?

docker stack deploy 如何工作?

我是 docker swarm 的新手,想了解 docker stack deploy 的工作原理

version: '3'
services:
 web:
image: nginx
ports:
  - "80:80"
redis:
image: "redis:alpine"

当我运行此命令时,它运行良好

$ docker stack deploy -c docker-compose.yml mystack
 Creating network mystack_default
 Creating service mystack_web
 Creating service mystack_redis

为了验证这一点

$ docker stack ps mystack
ID                  NAME                IMAGE               NODE                          
DESIRED STATE       CURRENT STATE           ERROR               PORTS
rcci590y5c6o        mystack_redis.1     redis:alpine        
plakhera1.example.com   Running             Running 9 seconds ago                       
lty84a77b4my        mystack_web.1       nginx:latest        
plakhera2.mylabserver.com   Running             Running 2 seconds ago 

现在我的问题是如何确保每次部署此应用程序/服务时,Redis 都会出现在 plakhera1.example.com 上,而 nginx 会出现在 plakhera2.example.com 上。我认为目前它是随机挑选节点的,那么我如何确保它始终只挑选那些节点呢?

更新:场景是我的 Web 是基本应用程序,但 Redis 做了很多繁重的工作,这就是为什么我总是希望 Redis 位于强大的节点上,有什么方法可以通过 docker stack deploy 指定 Web 始终在节点 1 上启动,而 Redis 在节点 2 上启动

答案1

我认为最快的方法是node.hostname在服务上设置放置约束。注意,我仅使用 compose v3.7on测试了这一点Docker version 19.03.2

version: '3.7'
services:
  redis:
    image: "redis:alpine"
    deploy:
      # replicas: 3
      placement:
        constraints:
          - node.hostname == plakhera1.example.com

请注意,如果取消注释replicas(在工作节点或其他情况下可能会这样做),则所有副本都应部署到指定节点。

手动验证:

docker stack ps mystack

这样做的缺点是需要在 Compose 文件中指定实际的主机名。我注意到,你也可以标签节点并设置根据这些标签展示位置然而,我发现这里的文档稍微差了一点,当进行快速测试时,它的表现并不如预期,但这可能只是我自己太匆忙了。

相关内容