首頁  >  文章  >  運維  >  docker volume和掛載的差別是什麼

docker volume和掛載的差別是什麼

WBOY
WBOY原創
2022-03-08 16:53:053050瀏覽

「docker volume」和掛載的區別是:「docker volume」是宣告式的,「Docker Engine」本身會佔用系統的某個目錄,Docker會預設在佔用的路徑下為volume分配一個路徑;而掛載不會佔用一個路徑作為掛載點。

docker volume和掛載的差別是什麼

本教學操作環境:linux7.3系統、docker-1.13.1版、Dell G3電腦。

docker volume和掛載的區別是什麼

#一直一來,對於多個容器需要共享存取相同資料目錄,或者需要持久化容器內資料(如資料庫)時,我們都是採用掛載目錄形式(bind mounts),將宿主機的某一目錄掛載到容器內的指定目錄,這種方式能解決問題,但這種方式也一直有一些缺點:

  • 容器在不同的伺服器部署需要根據實際磁碟掛載目錄修改路徑
  • 不同作業系統的檔案和目錄權限會搞得你昏頭轉向,火冒三丈 ?

而這些問題,使用Volume就可以解決。我們先來比較一下bind mounts和docker volume,然後看volume是如何解決bind mounts的問題的。先來看一張圖:

docker volume和掛載的差別是什麼
此圖來自docker文件

這圖說明bind mount和volume其實都是利用宿主機的檔案系統,不同之處在於volume是docker自身管理的目錄中的子目錄,所以不存在權限引發的掛載的問題,並且目錄路徑是docker自身管理的,所以也不需要在不同的伺服器上指定不同的路徑,你不需要關心路徑(其實也不全是,下面會關心?)。接下來就來看看bind mount和volume的不同用法吧。

1. 容器在不同的伺服器部署需要根據實際磁碟掛載目錄修改路徑

例如:

在Linux系統中,我們經常使用"/var/someDir"作為掛載目錄;

然而到了Mac上,/var/ 並不是真實存在的目錄,Mac用戶會告訴你,我們比Linux更先進,我們不用/var/ ,使用者不需要;

在Windows系統中,Windows使用者會反問你:/var/ 是什麼? C盤、D盤是最合理的分法~

大家都說自己最帥,到底誰是最帥的
mac中var目錄是一個軟連結

2. 不同作業系統的檔案與目錄權限會搞得你昏頭轉向,火冒三丈 ?

本來在Linux系統中測試的挺好,結果到了Windows上掛載路徑各種問題,這裡就不一一細說了,沒有遇到這些問題的可以嘗試一下,體驗體驗。不過在Mac中還好一些,畢竟和Linux同宗。

Docker中除了掛載方式,還有一種Volume可以持久化數據,說到這裡有點汗顏,使用Docker這麼久,一直把掛載當成Volume,不過也不怪我,Docker-compose檔案中在volume段中寫容器和宿主機掛載路徑映射關係也沒問題,就一直這麼誤解了。 。 (花式甩鍋?)

其實「掛載」和「Docker Volume」並不是一回事,有一定的區別,Docker Volume是聲明式的, Docker Engine本身會佔用系統的某個目錄,Linux一般為"/var/lib/docker",Mac和Windows下都可以調節。當我們宣告一個volume,Docker會預設在佔用的路徑下為volume分配一個路徑,例如:

#標題
##相對於掛載,volume是Docker Engine在自己的「地盤」分配了一個路徑作為掛載點,自己地盤的權限肯定是安排的明明白白。所以,以上掛載宿主機路徑的問題都解決了。 ?

在使用時,直接用volume名稱代替宿主機路徑名就行,假設我們上面創建了名為"test_vol"的volume:

  1. docker run -d -v "test_vol:/var/data" some_image,這樣就將容器內的/var/data目錄掛載到了"test_vol"的掛載點;
  2. docker-compose中類似,不過要在docker-compose.yaml檔案中宣告volume,我們還是拿上面的範例修改一下:

Attention !! 

  1. 需要注意volume 會造成docker目錄膨脹,因為既要存鏡像,又要存volume,最好不要放在系統盤,將docker 的安裝目錄配置到其他更大的掛載碟。
  2. 兩者有一個不同的行為:當容器外的對應目錄是空的,volume會先將容器內的內容拷貝到容器外目錄,而mount會將外部的目錄覆蓋容器內部目錄! !
  3. volume 還有一個不如bind mount的地方,不能直接掛載文件,例如掛載nginx容器的設定檔:nginx.conf。

這裡需要說明,類似於配置文件這種單文件方式並不適合使用volume,bind mount雖然也可以解決,但由於config文件中包含一些類似於數據庫密碼等敏感信息,因此,最好的方式是使用tmpfs。

kubernetes的volume也體現出類似的設計,subPath雖然可以解決設定檔掛載的問題,但實際上最好的方式是使用configMap。

推薦學習:《docker影片教學

以上是docker volume和掛載的差別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn