描述問題
比如我們有worker1,worker2,worker3三個docker host另外加一個manager1(它是swarm的master)來管理它們。
如果在manager1上直接docker service create某一個容器的話,比如nginx容器,那么master會來決定挑哪一個node作為nginx容器的運行的host。
如果我要nginx容器只跑在worker1上面的話,應該怎么辦呢?
解決方案
簡單來說就是給每一個node打標簽。
docker node update --label-add func=nginx worker1
上面這句話的意思是master給worker1的docker打上了功能是nginx的標簽。func和nginx是你可以自己定的鍵值對。
然后在運行docker service create 的時候,指定–constraint參數即可
docker service create --name my_nginx --constraint 'node.labels.func == nginx' nginx
這樣nginx的容器就會在worker1上啟動,而不會在其他node上啟動了。
補充
我的好奇心讓我使了一個壞。我把worker1打上func=nginx的標簽后,在docker service create的constraint參數上故意寫成node.labels.func == nginx111。
這個時候用docker service ls和docker service ps nginx都可以看到service已經注冊了,但是它的CURRENT STATE顯示Pending , 并且也沒有任何分配到node。
我不停止這個service,然后直接把worker2的標簽寫為nginx111,奇跡般地,在worker2上就自己啟動了nginx的容器。master還是很智能的。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。