Docker
docker stack deploy 如何工作?
我是 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
服務設置放置約束。請注意,我僅使用 composev3.7
on對此進行了測試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
這具有需要在撰寫文件中指定實際主機名的缺點。我注意到您還可以根據這些標籤標記節點並設置位置,但是我發現這裡的文件有些差,並且在進行快速測試時,它的表現並不像預期的那樣,但這可能只是我自己匆忙。