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