我是 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 总是启动在 node1 上运行,在 node2 上运行 Redis
我认为最快的方法是对
node.hostname
服务设置放置约束。请注意,我仅使用 composev3.7
on对此进行了测试Docker version 19.03.2
:请注意,如果您取消注释
replicas
(在工作节点或其他情况下可能会取消注释),所有副本都应部署到指定节点。手动验证:
这具有需要在撰写文件中指定实际主机名的缺点。我注意到您还可以根据这些标签标记节点并设置位置,但是我发现这里的文档有些差,并且在进行快速测试时,它的行为并不像预期的那样,但这可能只是我自己匆忙。