您的位置:首页 > 运维架构 > Docker

用 Label 控制 Service 的位置 - 每天5分钟玩转 Docker 容器技术(106)

2017-12-15 08:16 821 查看
上一节我们讨论了 Service 部署的两种模式:global mode 和 replicated mode。无论采用 global mode 还是 replicated mode,副本运行在哪些节点都是由 Swarm 决定的,作为用户我们有没有可能精细控制 Service 的运行位置呢?

答案是:能,使用 label。

逻辑分两步:

为每个 node 定义 label。

设置 service 运行在指定 label 的 node 上。

label 可以灵活描述 node 的属性,其形式是 key=value,用户可以任意指定,例如将
swarm-worker1
作为测试环境,为其添加 label
env=test


docker node update --label-add env=test swarm-worker1




对应的,将
swarm-worker2
作为生产环境,添加 label
env=prod


docker node update --label-add env=prod swarm-worker2

现在部署 service 到测试环境:

docker service create \
--constraint node.labels.env==test \
--replicas 3 \
--name my_web \
--publish 8080:80 \
httpd






--constraint node.labels.env==test
限制将 service 部署到 label=test 的 node,即
swarm-worker1
。从部署结果看,三个副本全部都运行在
swarm-worker1
上。

可以通过
docker service inspect
查看
--constraint
的设置:



更新 service,将其迁移到生产环境:

docker service update --constraint-rm node.labels.env==test my_web
docker service update --constraint-add node.labels.env==prod my_web

删除并添加新的 constraint,设置
node.labels.env==prod
,最终所有副本都迁移到了
swarm-worker2




label 还可以跟 global 模式配合起来使用,比如只收集生产环境中容器的日志。

docker service create \
--mode global \
--constraint node.labels.env==prod \
--name logspout \
--mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock \
gliderlabs/logspout

只有
swarm-worker2
节点上才会运行 logspout。



Label 就讨论到这里,下一节我们学习 Health Check。


书籍:

1.《每天5分钟玩转Docker容器技术》
https://item.jd.com/16936307278.html

2.《每天5分钟玩转OpenStack》
https://item.jd.com/12086376.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐