用 Label 控制 Service 的位置 - 每天5分钟玩转 Docker 容器技术(106)
上一节我们讨论了 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
本文转自CloudMan6 51CTO博客,原文链接:http://blog.51cto.com/cloudman/2050895

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何配置 Health Check?- 每天5分钟玩转 Docker 容器技术(107)
容器状态是 UP 的,应用就是健康的吗? 还真不一定! Docker 只能从容器启动进程的返回代码判断其状态,而对于容器内部应用的运行情况基本没有了解。 执行docker run命令时,通常会根据 Dockerfile 中的 CMD 或 ENTRYPOINT 启动一个进程,这个进程的状态就是docker psSTATUS列显示容器的状态。 命令显示: 有的容器正在运行,状态为UP。 有的容器已经正常停止了,状态是Exited (0)。 有的则因发生故障停止了,退出代码为非 0,例如Exited (137)、Exited (1)等。 即使容器状态是UP,也不能保证应用没有问题。web server 虽然没有崩溃,但如果总是返回HTTP 500 - Internal Server Error,对应用来说这就是很严重的故障。 如何从应用的业务层面检查容器的状态呢? 答案是:Health Check。 Docker 支持的 Health Check 可以是任何一个单独的命令,Docker 会在容器中执行该命令,如果返回 0,容器被认为是healthy,如果返回 1,则为unhealthy。 ...
- 下一篇
replicated vs global mode - 每天5分钟玩转 Docker 容器(105)
Swarm 可以在 service 创建或运行过程中灵活地通过--replicas调整容器副本的数量,内部调度器则会根据当前集群的资源使用状况在不同 node 上启停容器,这就是 service 默认的replicatedmode。在此模式下,node 上运行的副本数有多有少,一般情况下,资源更丰富的 node 运行的副本数更多,反之亦然。 除了replicatedmode,service 还提供了一个globalmode,其作用是强制在每个 node 上都运行一个且最多一个副本。 此模式特别适合需要运行 daemon 的集群环境。比如要收集所有容器的日志,就可以globalmode 创建 service,在所有 node 上都运行gliderlabs/logspout容器,即使之后有新的 node 加入,swarm 也会自动在新 node 上启动一个gliderlabs/logspout副本。 docker service create \ --mode global \ --name logspout \ --mount type=bind,source=/va...
相关文章
文章评论
共有0条评论来说两句吧...