Docker

docker stack deploy 如何工作?

  • October 25, 2019

我是 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 總是啟動在 node1 上執行,在 node2 上執行 Redis

我認為最快的方法是對node.hostname服務設置放置約束。請注意,我僅使用 compose v3.7on對此進行了測試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

這具有需要在撰寫文件中指定實際主機名的缺點。我注意到您還可以根據這些標籤標記節點並設置位置,但是我發現這裡的文件有些差,並且在進行快速測試時,它的表現並不像預期的那樣,但這可能只是我自己匆忙。

引用自:https://serverfault.com/questions/989426