注意
以下內(nèi)容完全摘自Docker官方文檔寝凌,僅為學(xué)習(xí)及技術(shù)分享所用狮含,切勿用于商業(yè)用途顽悼,轉(zhuǎn)載請注明出處。
以下為正文
了解Stack
在Docker中几迄,我們把一組相互關(guān)聯(lián)蔚龙、相互依賴、共同協(xié)作完成某些業(yè)務(wù)功能的服務(wù)稱為一個Stack(服務(wù)棧)映胁。一個Stack應(yīng)該可以定義和完成整個應(yīng)用程序的功能木羹,當(dāng)然一些較復(fù)雜的應(yīng)用程序可以由多個Stack構(gòu)成。簡而言之:Stack就是一組服務(wù)的集合解孙。
接下來坑填,我們在學(xué)完 Service 和Swarm 的基礎(chǔ)上,利用之前編寫的docker-compose.yml和swarm集群弛姜,添加另外兩個服務(wù):visualizer和redis脐瑰,實現(xiàn)可視化顯示集群中container的狀態(tài)和存儲集群訪問次數(shù)的功能,組成我們的第一個Stack廷臼。
添加visualizer服務(wù)
visualizer是Docker官方開發(fā)的一個服務(wù)苍在,利用它可以可視化顯示集群中container的調(diào)度情況绝页。如果想了解更多,可以到visualizer的github寂恬。
打開docker-compose.yml续誉,將內(nèi)容替換成以下代碼:
version: "3"
services:
web:
image: username/repo:tag
deploy:
replicas: 5
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
ports:
- "80:80"
networks:
- webnet
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
- webnet
networks:
webnet:
這里,我們?yōu)閣eb服務(wù)添加了一個監(jiān)聽服務(wù): visualizer初肉。我們?yōu)関isualizer服務(wù)指定了兩個鍵值酷鸦,volumes和deploy。volumes映射容器中/var/run/docker.sock到宿主機(jī)的/var/run/docker.sock文件中牙咏,deploy鍵通過添加contraints:[node.role==manager]指定visualizer只會部署在swarm manager節(jié)點上臼隔,而不會部署在worker節(jié)點上。因為只有在swarm manager上眠寿,才可以對整個集群進(jìn)行管理躬翁,才能監(jiān)聽到整個集群的狀態(tài)焦蘑。
接下來盯拱,我們把這個新的docker-compose.yml發(fā)送到myvm1這臺虛機(jī)上。
docker-machine scp docker-compose.yml myvm1:~
然后重新部署應(yīng)用
$ docker-machine ssh myvm1 "docker stack deploy -c docker-compose.yml getstartedlab"
Updating service getstartedlab_web (id: angi1bf5e4to03qu9f93trnxm)
Updating service getstartedlab_visualizer (id: l9mnwkeq2jiononb5ihz9u7a4)
可以看到例嘱,兩個服務(wù)組件都得到了更新狡逢,通過訪問myvm1或者myvm2中任一臺實例的8080端口,可以看到visualizer顯示的效果如下圖:
添加redis服務(wù)顯示訪問次數(shù)
將docker-compse.yml內(nèi)容替換如下:
version: "3"
services:
web:
image: username/repo:tag
deploy:
replicas: 5
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
ports:
- "80:80"
networks:
- webnet
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
- webnet
redis:
image: redis
ports:
- "6379:6379"
volumes:
- ./data:/data
deploy:
placement:
constraints: [node.role == manager]
networks:
- webnet
networks:
webnet:
這里我們做了以下幾件事:
- 添加了redis服務(wù)拼卵,由于它是Docker官方正式提供的鏡像文件奢浑,所以無需指定username和tag,直接用小寫的redis就可以定位到鏡像腋腮。
- 將6379端口公開并映射到宿主機(jī)的6379端口雀彼,6379是Redis默認(rèn)配置的對外端口,您可以通過集群中任一主機(jī)IP地址加上6379端口訪問Redis Desktop Manager(Redis自帶管理界面)即寡。
- volumes將/data目錄映射到宿主機(jī)./data目錄徊哑,/data是redis默認(rèn)存儲數(shù)據(jù)的目錄,通過這樣的映射聪富,即使容器掛了或者重新部署莺丑,數(shù)據(jù)都已經(jīng)保留到了宿主機(jī)上,不會丟失墩蔓。
- deploy通過constraints將redis部署到swarm manager節(jié)點上梢莽。
接下來,我們需要在myvm1實例(即redis服務(wù)容器所在宿主機(jī))上創(chuàng)建./data目錄奸披,然后重新部署我們的應(yīng)用昏名,依次執(zhí)行以下命令:
$ docker-machine ssh myvm1 "mkdir ./data"
$ docker-machine scp docker-compose.yml myvm1:~
$ docker-machine ssh myvm1 "docker stack deploy -c docker-compose.yml getstartedlab"
部署完后,再次訪問集群中任一個實例的IP地址(端口為80)阵面,即訪問我們部署的web服務(wù)轻局,就可以看到一個顯示訪問次數(shù)的界面了(我們的web服務(wù)組件其實已經(jīng)包含了我們在創(chuàng)建Docker鏡像章節(jié)中用python寫的使用redis存儲訪問次數(shù)的程序app.py)份殿。
至此,您就構(gòu)建了一個集web負(fù)載均衡嗽交、visualizer圖形界面卿嘲、redis存儲的Stack。