1. 程式人生 > >用 Label 控制 Service 的位置 - 每天5分鐘玩轉 Docker 容器技術(106)

用 Label 控制 Service 的位置 - 每天5分鐘玩轉 Docker 容器技術(106)

docker容器教程swarm

上一節我們討論了 Service 部署的兩種模式:global mode 和 replicated mode。無論采用 global mode 還是 replicated mode,副本運行在哪些節點都是由 Swarm 決定的,作為用戶我們有沒有可能精細控制 Service 的運行位置呢?

答案是:能,使用 label。

邏輯分兩步:

  1. 為每個 node 定義 label。

  2. 設置 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)