Docker筆記之數(shù)據(jù)卷

為什么使用數(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ù)卷的特點
  1. 數(shù)據(jù)卷存在于宿主機的文件系統(tǒng)中,獨立于容器,和容器的生命周期是分離的。
  2. 數(shù)據(jù)卷可以是目錄也可以是文件,容器可以利用數(shù)據(jù)卷與宿主機進行數(shù)據(jù)共享,實現(xiàn)了榮期間的數(shù)據(jù)共享和交換。
  3. 容器啟動初始化時,如果容器使用的鏡像包含了數(shù)據(jù),這些數(shù)據(jù)會拷貝到數(shù)據(jù)卷中。
  4. 容器對數(shù)據(jù)卷的修改是實時進行的。
  5. 數(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示意圖
使用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

-v

方式二: --mount

其參數(shù)由多個鍵值對組成,以逗號分隔。

  • type選項,其可以是bind,volume,或tmpfs。本主題討論綁定裝入,因此類型始終是bind。
  • source選項。對于綁定裝入,這是Docker守護程序主機上的文件或目錄的路徑??梢灾付?code>source/src
  • destination文件或目錄安裝在容器中的路徑作為其值。可以指定為destination,dsttarget
  • readonly選項(如果存在)導致綁定裝入以只讀方式裝入容器中。
  • bind-propagation選項(如果存在)會更改 綁定傳播??梢允且粋€rprivate,privatershared,shared,rslaveslave。
  • consistency選項,如果存在,可以是一種consistent,delegatedcached。此設(shè)置僅適用于Docker for Mac,并在所有其他平臺上被忽略。
  • --mount標志不支持zZ修改selinux標簽的選項。
--mount
-v和--mount之間的區(qū)別

使用-v綁定宿主機上不存在的文件或者目錄時,會自動生成相應(yīng)的文件或者目錄,--mount則會拋出異常,所以用--mount指定文件和路徑時需要提前創(chuàng)建以保證其存在。

1.2 volumes的方式掛載數(shù)據(jù)卷

Docker掛載數(shù)據(jù)卷
Volumes是保存Docker容器生成和使用數(shù)據(jù)的首選機制。

利用docker run/create的參數(shù)為容器掛載數(shù)據(jù)卷:

方式一:-v --volume

-vvolume_name:容器中文件或文件夾的路徑:可選字段。
其中 volume_name是數(shù)據(jù)卷的名稱,在宿主機上是唯一的,可以省略該字段,會自動創(chuàng)建。

docker run -v

docker inspect
方式二: --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ù)會被隱藏掉。

---------------------------------------萬惡的分隔線------------------------------------------

參考資料:Docker 文檔

總注:通過volumes方式掛載數(shù)據(jù)卷還有很多要注意的,一些比較厲害的功能在這里沒有涉及,需要看一下官方文檔介紹的比較詳細。因為是初學,如有問題,歡迎指正!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容