為什么使用數(shù)據(jù)卷,那先來了解一下Docker的聯(lián)合文件系統(tǒng)。
0.數(shù)據(jù)卷基礎(chǔ)
0.1 Docker聯(lián)合文件系統(tǒng)
Docker鏡像是有多層只讀文件疊加而成,當運行起一個容器的時候,Docker會在制只讀層上創(chuàng)建一個讀寫層。如果運行中的容器需要修改文件,那么并不會修改只讀層的文件,只會把該文件復制到讀寫層然后進行修改,只讀層的文件就被隱藏了。當刪除了該容器之后,或者重啟容器之后,之前對文件的更改會丟失,鏡像的只讀層以及容器運行是的“讀寫層”被稱為聯(lián)合文件系統(tǒng)(Union File System)
為了實現(xiàn)容器與主機之間、容器與容器之間共享文件,容器中數(shù)據(jù)的持久化,將容器中的數(shù)據(jù)備份、遷移、恢復等,Docker加入了數(shù)據(jù)卷(volumes)機制。簡單的講,就是做了一個文件夾的實時共享,有點像局域網(wǎng)的文件共享。
0.2 數(shù)據(jù)卷的特點
- 數(shù)據(jù)卷存在于宿主機的文件系統(tǒng)中,獨立于容器,和容器的生命周期是分離的。
- 數(shù)據(jù)卷可以是目錄也可以是文件,容器可以利用數(shù)據(jù)卷與宿主機進行數(shù)據(jù)共享,實現(xiàn)了榮期間的數(shù)據(jù)共享和交換。
- 容器啟動初始化時,如果容器使用的鏡像包含了數(shù)據(jù),這些數(shù)據(jù)會拷貝到數(shù)據(jù)卷中。
- 容器對數(shù)據(jù)卷的修改是實時進行的。
- 數(shù)據(jù)卷的變化不會影響鏡像的更新。數(shù)據(jù)卷是獨立于聯(lián)合文件系統(tǒng),鏡像是基于聯(lián)合文件系統(tǒng)。鏡像與數(shù)據(jù)卷之間不會相互影響。
1.Docker掛載容器數(shù)據(jù)卷 查看更多
bind mounts、Volumes、和tepfs mounts三種方式,還有就是共享其他容器的數(shù)據(jù)卷,其中tmpfs是一種基于內(nèi)存的臨時文件系統(tǒng)。tepfs mounts數(shù)據(jù)不會存儲在磁盤上,在次筆記中暫不做筆記。
1.1 bind mounts

使用bind mounts掛載數(shù)據(jù)卷時,宿主機上的文件或者目錄將載入到容器中。文件或目錄由其在主機上的絕對路徑或相對路徑引用。如果將數(shù)據(jù)卷綁定到容器上的非空目錄中,則綁定裝置會隱藏目錄的現(xiàn)有內(nèi)容。
bind mounts方式掛載數(shù)據(jù)卷的兩種方式:
利用docker run/create的參數(shù)為容器掛載數(shù)據(jù)卷:
方式一:-v --volume
-v宿主機文件或者文件夾路徑:容器中文件或文件夾的路徑:可選字段
其中 宿主機文件或者文件夾路徑和容器中文件或文件夾的路徑是必須的,可選字段,用分號分隔選項,非必須,如 ro,consistent,delegated,cached,z,和Z

方式二: --mount
其參數(shù)由多個鍵值對組成,以逗號分隔。
-
type選項,其可以是bind,volume,或tmpfs。本主題討論綁定裝入,因此類型始終是bind。 -
source選項。對于綁定裝入,這是Docker守護程序主機上的文件或目錄的路徑??梢灾付?code>source/src。 - 將
destination文件或目錄安裝在容器中的路徑作為其值。可以指定為destination,dst或target。 -
readonly選項(如果存在)導致綁定裝入以只讀方式裝入容器中。 -
bind-propagation選項(如果存在)會更改 綁定傳播??梢允且粋€rprivate,private,rshared,shared,rslave,slave。 -
consistency選項,如果存在,可以是一種consistent,delegated或cached。此設(shè)置僅適用于Docker for Mac,并在所有其他平臺上被忽略。 -
--mount標志不支持z或Z修改selinux標簽的選項。

-v和--mount之間的區(qū)別
使用-v綁定宿主機上不存在的文件或者目錄時,會自動生成相應(yīng)的文件或者目錄,--mount則會拋出異常,所以用--mount指定文件和路徑時需要提前創(chuàng)建以保證其存在。
1.2 volumes的方式掛載數(shù)據(jù)卷

Volumes是保存Docker容器生成和使用數(shù)據(jù)的首選機制。
利用docker run/create的參數(shù)為容器掛載數(shù)據(jù)卷:
方式一:-v --volume
-vvolume_name:容器中文件或文件夾的路徑:可選字段。
其中 volume_name是數(shù)據(jù)卷的名稱,在宿主機上是唯一的,可以省略該字段,會自動創(chuàng)建。


方式二: --mount
其參數(shù)由多個鍵值對組成,以逗號分隔。
-
type選項,其可以是bind,volume,或tmpfs。本主題討論卷,因此類型始終是volume。 -
source選項。對于命名卷,這是卷的名稱。對于匿名卷,省略此字段。可以指定為source/src。 - 將
destination文件或目錄安裝在容器中的路徑作為其值??梢灾付?code>destination,dst/target。 -
readonly選項(如果存在)導致綁定裝入以只讀方式裝入容器中。 -
volume-opt選項可以多次指定,它采用由選項名稱及其值組成的鍵值對。
docker run --mount
用volumes方式掛載的數(shù)據(jù)卷,實際上是創(chuàng)建了數(shù)據(jù)卷對象,可以用以下命令進行管理:
docker volume create 創(chuàng)建數(shù)據(jù)卷對象
docker volume inspect 查看數(shù)據(jù)卷的詳細信息
docker volume ls 查看已創(chuàng)建的數(shù)據(jù)卷對象
docker volume prune 刪除所有未被使用的數(shù)據(jù)卷對象
docker volume rm 刪除一個或多個數(shù)據(jù)卷對象
1.3 使用其他容器的數(shù)據(jù)卷
使用dockers run/create的--volumes-from參數(shù)指定數(shù)據(jù)卷容器docker run/create --volume-form CONTAINER
2. 注意
Docker的數(shù)據(jù)卷更多會是使用volumes方式來進行使用,但值得注意的是:
如果掛載一個
空的數(shù)據(jù)卷到容器中的一個非空目錄中,那么這個目錄下的文件會被復制到數(shù)據(jù)卷中。(我的測試:使用 -v 參數(shù)并沒有這個效果,需要使--mount參數(shù),如果不符請指正)如果掛載一個
非空的數(shù)據(jù)卷到容器中的一個目錄中,那么容器中的目錄中會顯示數(shù)據(jù)卷中的數(shù)據(jù)。如果原來容器中目錄非空,那么這些原始數(shù)據(jù)會被隱藏掉。
