一行您、compose
compose 作用
你的應(yīng)用可能需要很多個(gè)服務(wù)溜宽,比如web服務(wù)实苞,數(shù)據(jù)庫(kù)服務(wù)豺撑,緩存服務(wù)等等。我們可以把這些服務(wù)放到單獨(dú)的容器里面黔牵,如果手工去配置這些服務(wù)會(huì)有些麻煩聪轿,docker compose可以幫我們解決這個(gè)問題。
我們可以創(chuàng)建一個(gè)compose文件,在這個(gè)文件上面描述你都需要哪些服務(wù),服務(wù)使用什么鏡像鞍盗、數(shù)據(jù)卷、網(wǎng)絡(luò)等等音瓷,然后再用一條命令就可以管理、啟動(dòng)所有的服務(wù)夹抗。
compose 文件
compose文件用的yml格式绳慎,docker規(guī)定了一些指令,使用它們可以去設(shè)置對(duì)應(yīng)的東西,它主要分為了3個(gè)區(qū)域:
-
services
是服務(wù)杏愤,在它下面可以定義應(yīng)用需要的一些服務(wù)靡砌,每個(gè)服務(wù)都有自己的名字、使用的鏡像珊楼、掛載的數(shù)據(jù)卷通殃、所屬的網(wǎng)絡(luò)、依賴哪些其他服務(wù)等等厕宗; -
networks
是應(yīng)用的網(wǎng)絡(luò)画舌,在它下面可以定義應(yīng)用的名字、使用的網(wǎng)絡(luò)類型等等媳瞪; -
volumes
是數(shù)據(jù)卷骗炉,在它下面可以定義的數(shù)據(jù)卷(名字等等)照宝,然后掛載到不同的服務(wù)下去使用蛇受;
二、Services
先創(chuàng)建一個(gè)文件夾beck-docker厕鹃,并在里面新建docker-compose.yml文件兢仰,然后使用version
指定一下compose使用的版本號(hào)。
定義服務(wù)
在應(yīng)用里需要定義的服務(wù)剂碴,可以放到services下面把将。比如,我們?nèi)ザx一個(gè)dog的服務(wù)忆矛,使用nginx鏡像察蹲,指定主機(jī)上的8080端口映射到容器中得80端口,也就是nginx的http的訪問端口催训。
version: '2'
services:
dog:
image: nginx
ports:
- "8080:80"
以同樣的方式洽议,定義一個(gè)cat的服務(wù),同樣使用nginx鏡像漫拭,然后指8081端口對(duì)應(yīng)80端口亚兄。
version: '2'
services:
dog:
image: nginx
ports:
- "8080:80"
cat:
image: nginx
ports:
- "8081:80"
需要注意的是,cat與dog要在同一個(gè)級(jí)別采驻,還有ports是個(gè)數(shù)組审胚,可以指定多個(gè)端口映射關(guān)系。
啟動(dòng)服務(wù)
定義好服務(wù)以后礼旅,在項(xiàng)目的目錄啟動(dòng)這些服務(wù)膳叨,可以執(zhí)行:
docker-compose up
這樣會(huì)啟動(dòng),在compose文件下定義的所有服務(wù)痘系。由于這是第一次啟動(dòng)這個(gè)服務(wù)菲嘴,所以可以看到它是creating,也就是去創(chuàng)建相關(guān)的東西。首先會(huì)創(chuàng)建這個(gè)服務(wù)使用的網(wǎng)絡(luò)临谱,這里是叫做「beckdocker_default」的網(wǎng)絡(luò)璃俗,然后是dog和cat的服務(wù),這些網(wǎng)絡(luò)和服務(wù)的名字悉默,默認(rèn)會(huì)加上一個(gè)前綴城豁,由于在創(chuàng)建應(yīng)用的時(shí)候沒有指定名字,所以會(huì)默認(rèn)使用項(xiàng)目目錄的名字抄课,后面還有一個(gè)數(shù)字的后綴唱星。最后會(huì)有一個(gè)「Attaching to ...」,將網(wǎng)絡(luò)應(yīng)用到服務(wù)上跟磨。
啟動(dòng)成功后间聊,在瀏覽器訪問一下。8080對(duì)應(yīng)的是dog的服務(wù)抵拘,8081是cat的服務(wù)哎榴。
回到終端,可以看到服務(wù)的訪問日志僵蛛,日志的開頭會(huì)有服務(wù)的名字尚蝌,標(biāo)志著日志是從哪個(gè)服務(wù)來的:
如果希望服務(wù)在后臺(tái)運(yùn)行,可以使用-d
選項(xiàng)(也就是detach):
docker-compose up -d
服務(wù)的生命周期
查看正在運(yùn)行的服務(wù)充尉,可以執(zhí)行:
docker-compose ps
停止一個(gè)服務(wù)飘言,可以執(zhí)行:
docker-compose stop [服務(wù)名]
如果后面不加服務(wù)名,會(huì)停止所有的服務(wù)驼侠。
啟動(dòng)某一個(gè)服務(wù)姿鸿,可以執(zhí)行:
docker-compose start [服務(wù)名]
如果后面不加服務(wù)名,會(huì)啟動(dòng)所有的服務(wù)倒源。
查看服務(wù)運(yùn)行的log苛预,可以執(zhí)行:
docker-compose logs -f
加上-f
選項(xiàng),可以持續(xù)跟中服務(wù)產(chǎn)生的log相速。
進(jìn)入服務(wù)容器中碟渺,可以執(zhí)行:
docker-compose exec dog bash
如果想要?jiǎng)h除服務(wù),我們可以先停止服務(wù)然后執(zhí)行:
docker-compose rm
注意這個(gè)docker-compose rm
不會(huì)刪除應(yīng)用的網(wǎng)絡(luò)和數(shù)據(jù)卷突诬。查看一下網(wǎng)絡(luò)苫拍,可以看到應(yīng)用創(chuàng)建的網(wǎng)絡(luò)「beckdocker_default」,如果要?jiǎng)h除所有的這些旺隙,可以使用:
docker-compose down
會(huì)提示我們刪除網(wǎng)絡(luò) beckdocker_default绒极。
三、Networks
網(wǎng)絡(luò)決定了服務(wù)之間以及服務(wù)和外界之間如何去通信蔬捷,在執(zhí)行docker-compose up
的時(shí)候垄提,docker會(huì)默認(rèn)創(chuàng)建一個(gè)默認(rèn)的網(wǎng)絡(luò)榔袋,創(chuàng)建的服務(wù)也會(huì)默認(rèn)地屬于這個(gè)默認(rèn)網(wǎng)絡(luò)。服務(wù)和服務(wù)之間铡俐,可以使用服務(wù)的名字進(jìn)行通信凰兑。也可以自己創(chuàng)建網(wǎng)絡(luò),并將服務(wù)屬于到這個(gè)網(wǎng)絡(luò)之中审丘,這樣服務(wù)之間可以相互通信吏够,而外界就不能夠與這個(gè)網(wǎng)絡(luò)中的服務(wù)通信,可以保持隔離性滩报。
下面登錄dog服務(wù)去連接cat服務(wù)锅知,登錄到cat服務(wù)連接dog服務(wù):
可以通過服務(wù)的名稱進(jìn)行連接。
自定義網(wǎng)絡(luò)
- 在networks中先定義一個(gè)名為animal脓钾,類型為bridge的網(wǎng)絡(luò):
version: '2'
services:
dog:
image: nginx
ports:
- "8080:80"
cat:
image: nginx
ports:
- "8081:80"
networks:
animal:
driver: bridge
- 讓dog和cat服務(wù)使用這個(gè)網(wǎng)絡(luò):
version: '2'
services:
dog:
image: nginx
ports:
- "8080:80"
networks:
- "animal"
cat:
image: nginx
ports:
- "8081:80"
networks:
- "animal"
networks:
animal:
driver: bridge
- 再增加一個(gè)叫pig的服務(wù)售睹,使用默認(rèn)網(wǎng)絡(luò),來體現(xiàn)于自定義網(wǎng)絡(luò)的隔離性:
version: '2'
services:
dog:
image: nginx
ports:
- "8080:80"
networks:
- "animal"
cat:
image: nginx
ports:
- "8081:80"
networks:
- "animal"
pig:
image: nginx
ports:
- "8082:80"
networks:
- "default"
networks:
animal:
driver: bridge
- 重新啟動(dòng)應(yīng)用
登錄cat服務(wù)可训,嘗試去連接dog服務(wù)和pig服務(wù):
因?yàn)閏at與dog同在animal網(wǎng)絡(luò)昌妹,所以可以通過名字連接,而pig在default網(wǎng)絡(luò)中沉噩,所以不能捺宗。
四柱蟀、Volumes
在compose文件中川蒙,還可以指定一些有名字的數(shù)據(jù)卷,讓服務(wù)去使用长已。方法是:在與networks同級(jí)的地方畜眨,添加volumes
,接著是數(shù)據(jù)卷的名字术瓮,下面使用driver
去指定數(shù)據(jù)卷的類型康聂。
定義好數(shù)據(jù)卷后,就將這個(gè)數(shù)據(jù)卷交給一個(gè)服務(wù)去使用胞四√裰可以用volumes
給服務(wù)指定需要使用的數(shù)據(jù)卷:
dog:
...
volumes:
- nest:/mnt
以dog服務(wù)為例,volumes下指定使用的數(shù)據(jù)卷辜伟,冒號(hào)左邊是數(shù)據(jù)卷名稱氓侧,冒號(hào)右邊是掛載到的docker對(duì)應(yīng)目錄位置。接著給cat服務(wù)也添加同樣的數(shù)據(jù)卷导狡。
回到終端约巷,執(zhí)行docker-compose up -d
,下面測(cè)試一下數(shù)據(jù)卷:
因?yàn)閏at與dog服務(wù)都使用nest的數(shù)據(jù)卷旱捧,所以在dog中/mnt目錄下創(chuàng)建的data1独郎,在cat服務(wù)的/mnt目錄下可以看到踩麦。
指定位置的數(shù)據(jù)卷
dog和cat都是一個(gè)web服務(wù),現(xiàn)在我想將主機(jī)的某一個(gè)位置當(dāng)做是服務(wù)的一個(gè)內(nèi)容氓癌,那么我們可以去創(chuàng)一個(gè)指定位置的數(shù)據(jù)卷谓谦。首先可以在當(dāng)前目錄,創(chuàng)建./app/web文件夾贪婉,在里面創(chuàng)建個(gè)index.html茁计。
編輯內(nèi)容:
內(nèi)容編輯好后,就給dog與cat服務(wù)指定數(shù)據(jù)卷谓松,冒號(hào)左邊是主機(jī)上的目錄星压,冒號(hào)右邊是服務(wù)內(nèi)掛載的目錄:
說明:/usr/share/nginx/html 目錄是nginx默認(rèn)主機(jī)的根目錄,也就是nginx歡迎界面的目錄鬼譬。
重新啟動(dòng)一下docker-compose up -d
娜膘,訪問一下dog與cat服務(wù):