一直一來,對于多個容器需要共享訪問同一數(shù)據(jù)目錄,或者需要持久化容器內(nèi)數(shù)據(jù)(如數(shù)據(jù)庫)時,我們都是采用掛載目錄形式(bind mounts),將宿主機的某一目錄掛載到容器內(nèi)的指定目錄券勺,這種方式能解決問題,但這種方式也一直有一些缺點:
容器在不同的服務(wù)器部署需要根據(jù)實際磁盤掛載目錄修改路徑
不同操作系統(tǒng)的文件和目錄權(quán)限會搞得你昏頭轉(zhuǎn)向灿里,火冒三丈???
而這些問題,使用Volume就可以解決匣吊。我們先來對比一下bind mounts和docker volume儒拂,然后看volume是如何解決bind mounts的問題的。先來看一張圖:
?
此圖來自docker文檔
這張圖說明bind mount和volume其實都是利用的宿主機的文件系統(tǒng)色鸳,不同之處在于volume是docker自身管理的目錄中的子目錄侣灶,所以就不存在權(quán)限引發(fā)的掛載的問題了,并且目錄路徑是docker自身管理的缕碎,所以也不需要在不同的服務(wù)器上指定不同的路徑褥影,你不需要關(guān)心路徑(其實也不全是,下面會關(guān)心 ??)咏雌。接下來就來看看bind mount和volume的不同用法吧凡怎。
1. 容器在不同的服務(wù)器部署需要根據(jù)實際磁盤掛載目錄修改路徑
例如:在Linux系統(tǒng)中校焦,我們經(jīng)常使用"/var/someDir"作為掛載目錄,然而到了Mac上统倒,"/var/"這個目錄并不是真實存在的寨典,它是一個目錄的軟鏈接,而且這個目錄也不是"Docker for Mac"默認共享的目錄房匆,需要添加耸成,在Windows系統(tǒng)中更是如此。
?
?
2. 不同操作系統(tǒng)的文件和目錄權(quán)限會搞得你昏頭轉(zhuǎn)向浴鸿,火冒三丈???
本來在Linux系統(tǒng)中測試的挺好井氢,結(jié)果到了Windows上掛載路徑各種問題,這里就不一一細說了岳链,沒有遇到這些問題的可以嘗試一下花竞,體驗體驗。不過在Mac中還好一些掸哑,畢竟和Linux同宗约急。
Docker中除了掛載方式,還有一種Volume可以持久化數(shù)據(jù)苗分,說到這里有點汗顏厌蔽,使用Docker這么久,一直把掛載當成Volume摔癣,不過也不怪我奴饮,Docker-compose文件中在volume段中寫容器和宿主機掛載路徑映射關(guān)系也沒問題,就一直這么誤解了供填。拐云。(花式甩鍋??)
?
其實“掛載”和“Docker Volume”并不是一回事罢猪,有一定的區(qū)別近她,Docker Volume是聲明式的,Docker Engine本身會占用系統(tǒng)的某個目錄膳帕,Linux一般為"/var/lib/docker"粘捎,Mac和Windows下都可以調(diào)節(jié)。當我們聲明一個volume危彩,Docker會默認在占用的路徑下為volume分配一個路徑攒磨,例如:
?
相對于掛載,volume是Docker Engine在自己的“地盤”分配了一個路徑作為掛載點汤徽,自己地盤的權(quán)限肯定是安排的明明白白娩缰。所以,以上掛載宿主機路徑的問題都解決了谒府。??
在使用時拼坎,直接用volume名稱代替宿主機路徑名就行浮毯,假設(shè)我們上面創(chuàng)建了名為"test_vol"的volume:
docker run -d -v "test_vol:/var/data"?some_image,這樣就將容器內(nèi)的/var/data目錄掛載到了"test_vol"的掛載點泰鸡;
docker-compose中類似债蓝,不過要在docker-compose.yaml文件中聲明volume,我們還是拿上面的例子修改一下:
?
Attention !!??????????
需要注意 volume 會引起 docker目錄膨脹盛龄,因為既要存鏡像饰迹,又要存 volume,最好不要放在系統(tǒng)盤余舶,將 docker 的安裝目錄配置到其他更大的掛載盤啊鸭。
volume 還有一個不如bind mount的地方,不能直接掛載文件欧芽,例如掛載nginx容器的配置文件:nginx.conf莉掂。