本文詳細(xì)講述了Docker堆棧的管理操作。分享給大家供大家參考,具體如下:
在Docker中,鏡像是一個(gè)輕量級的,獨(dú)立的可執(zhí)行程序包,包含運(yùn)行一個(gè)軟件所需的所有東西,包括代碼、運(yùn)行環(huán)境、庫、環(huán)境變量和配置文件。容器是鏡像的運(yùn)行實(shí)例,默認(rèn)情況下,它與主機(jī)環(huán)境完全隔離,只有在配置時(shí)才訪問主機(jī)文件和端口。
在《Docker集群的創(chuàng)建與管理》中,設(shè)置了一個(gè)運(yùn)行Docker的機(jī)器集群,并部署了一個(gè)應(yīng)用程序,容器在多臺(tái)機(jī)器上運(yùn)行。現(xiàn)在你可以了解分布式應(yīng)用程序?qū)哟谓Y(jié)構(gòu)的頂層:堆棧。堆棧是一組相互關(guān)聯(lián)的服務(wù),它們可以共享依賴關(guān)系,并且可以一起協(xié)調(diào)和縮放。單個(gè)堆棧能夠定義和協(xié)調(diào)整個(gè)應(yīng)用程序的功能。
添加一個(gè)新服務(wù)并重新部署
將服務(wù)添加到docker-compose.yml文件很容易,首先添加一個(gè)免費(fèi)的可視化器服務(wù),使我們能看到是如何調(diào)度容器。在編輯器中打開docker-compose.yml,并用下面的代碼替換它的內(nèi)容:
version: "3"
services:
web:
# 用你的名稱和鏡像細(xì)節(jié)替換username/repo:tag
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:
這里唯一新增的就是名為visualizer的web對等服務(wù),在這里可以看到兩個(gè)新東西:volumes密鑰,賦予visualizer訪問Docker的主機(jī)套接字文件的權(quán)限,以及一個(gè)placement密鑰,確保此服務(wù)只能在集群管理器上運(yùn)行。這個(gè)由Docker創(chuàng)建的開源項(xiàng)目構(gòu)建的容器可以顯示集群上運(yùn)行的Docker服務(wù)。
確保你的終端被配置為與myvm1進(jìn)行通信,運(yùn)行docker-machine ls
列出機(jī)器,并確保已連接到myvm1,如果需要可以重新運(yùn)行docker-machine env myvm1
,然后運(yùn)行給定的命令來配置終端。在管理器上重新運(yùn)行docker stack deploy
命令,任何需要更新的服務(wù)都將被更新:
$ docker stack deploy -c docker-compose.yml getstartedlab
在docker-compose.yml文件中可以看到,visualizer在端口8080上運(yùn)行,通過運(yùn)行docker-machine ls
來獲取其中一個(gè)節(jié)點(diǎn)的IP地址,轉(zhuǎn)到8080端口的IP地址,將看到visualizer正在運(yùn)行:

visualizer的單個(gè)副本按照預(yù)期在管理器上運(yùn)行,并且網(wǎng)絡(luò)的5個(gè)實(shí)例遍布整個(gè)集群,可以通過運(yùn)行docker stack ps <stack>
來證實(shí)這個(gè)可視化:
$ docker stack ps getstartedlab
visualizer是一個(gè)獨(dú)立的服務(wù),可以在任何包含它的應(yīng)用程序中運(yùn)行,它不依賴于其他任何東西?,F(xiàn)在創(chuàng)建一個(gè)具有依賴性的服務(wù),Redis服務(wù)將提供訪問者計(jì)數(shù)器。
數(shù)據(jù)持久化
再次通過相同的工作流程來添加一個(gè)用于存儲(chǔ)應(yīng)用程序數(shù)據(jù)的Redis數(shù)據(jù)庫,保存這個(gè)新的docker-compose.yml文件,最后添加一個(gè)Redis服務(wù):
version: "3"
services:
web:
# 用你的名稱和鏡像細(xì)節(jié)替換username/repo:tag
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:
- /home/docker/data:/data
deploy:
placement:
constraints: [node.role == manager]
command: redis-server --appendonly yes
networks:
- webnet
networks:
webnet:
Redis在Docker庫中有一個(gè)官方鏡像,并且已經(jīng)被授予redis的簡短鏡像名稱,所以在這里沒有username/repo。Redis端口6379已經(jīng)由Redis預(yù)先配置好,從容器中暴露給主機(jī),在docker-compose.yml文件中,將它從主機(jī)暴露給外部,這樣就可以為任何節(jié)點(diǎn)到Redis桌面管理器中,并管理這個(gè)Redis實(shí)例。
最重要的是,redis規(guī)范中有幾件事情使數(shù)據(jù)在這個(gè)堆棧的部署之間持續(xù)存在:redis總是在管理器上運(yùn)行,所以它總是使用相同的文件系統(tǒng);redis在主機(jī)的文件系統(tǒng)中訪問一個(gè)任意目錄作為容器內(nèi)部的/data,這是Redis存儲(chǔ)數(shù)據(jù)的地方。總之,這是在Redis數(shù)據(jù)的主機(jī)物理文件系統(tǒng)中創(chuàng)建“真實(shí)來源”。如果沒有這個(gè),Redis將把它的數(shù)據(jù)存儲(chǔ)在容器文件系統(tǒng)中的/data中,如果這個(gè)容器被重新部署的話,這些數(shù)據(jù)將被清除。
這個(gè)真實(shí)來源有兩個(gè)組成部分:placement在Redis服務(wù)上的placement約束,確保它始終使用相同的主機(jī);創(chuàng)建的volumes允許容器作為/data(在Redis容器內(nèi))訪問/data(在主機(jī)上),在容器來來去去的時(shí)候,存儲(chǔ)在指定主機(jī)上的/data文件將會(huì)持續(xù)存在,從而保持連續(xù)性。
在管理器上創(chuàng)建一個(gè)/data目錄:
$ docker-machine ssh myvm1 "mkdir ./data"
確保終端被配置為與myvm1進(jìn)行通信,運(yùn)行docker-machine ls
列出機(jī)器,并確保已連接到myvm1,如果需要可以重新運(yùn)行docker-machine env myvm1
,然后運(yùn)行給定的命令來配置終端。在管理器上重新運(yùn)行docker stack deploy
命令,任何需要更新的服務(wù)都將被更新:
$ docker stack deploy -c docker-compose.yml getstartedlab
運(yùn)行docker service ls
以驗(yàn)證這三個(gè)服務(wù)是否按預(yù)期運(yùn)行:
查看您的某個(gè)節(jié)點(diǎn)的網(wǎng)頁,您將看到訪客計(jì)數(shù)器的結(jié)果,該計(jì)數(shù)器現(xiàn)在已經(jīng)存在并將信息存儲(chǔ)在Redis上:

另外,使用任一節(jié)點(diǎn)的IP地址8080端口訪問可視化器,將看到隨web和visualizer服務(wù)一起運(yùn)行的redis服務(wù):

希望本文所述對大家docker容器的使用有所幫助