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