用 Label 控制 Service 的位置 - 每天5分鐘玩轉 Docker 容器技術(106)
答案是:能,使用 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
用 Label 控制 Service 的位置 - 每天5分鐘玩轉 Docker 容器技術(106)