[入門] Docker容器數據儲存和轉移

  • 2019 年 12 月 15 日
  • 筆記

容器和層

容器和鏡像之間的主要區別是頂部的可寫層。所有對容器添加新的或修改現有數據的內容都存儲在該可寫層中。當容器被刪除時,可寫層也被刪除。底層鏡像保持不變。

同一個鏡像可以被創建多個同時運行的容器,相當於最上層的可寫層不同而已,Docker版「披上羊皮的狼」。

容器數據儲存

默認情況下,在容器內創建的所有文件都存儲在可寫層中。這意味著:

  • 當該容器不再運行時,數據不會持久存在,如果另一個進程需要,則可能很難從容器中獲取數據。
  • 容器的可寫層緊密耦合到運行容器的主機。無法輕鬆地將數據移動到其他位置。

Docker有兩個容器選項可以在主機中存儲文件,因此即使在容器停止之後文件仍然存在:數據卷掛載目錄。如果你在Linux上運行Docker,你也可以使用tmpfs mount

下面是用法:

-v或者--volume標誌在單獨容器中使用,--mount標誌用於群集服務容器

-v或–volume:由三個欄位組成,用冒號字元(:)分隔。欄位必須按正確的順序排列,並且每個欄位的含義不是很明顯。

  • 對於命名卷,第一個欄位是卷的名稱,並且在給定主機上是唯一的。對於匿名卷,省略第一個欄位。
  • 第二個欄位是文件或目錄在容器中安裝的路徑。
  • 第三個欄位是可選的,是逗號分隔的選項列表,例如ro。這些選項將在下面討論。

–mount:由多個鍵值對組成,以逗號分隔,每個鍵=組由一個元組組成。該–mount語法比更詳細的-v或–volume,但按鍵的順序並不顯著,並且標誌的價值更容易理解。

  • 該type安裝件,其可以是bind,volume,或tmpfs。本主題討論卷,因此類型始終是volume。
  • 該source安裝的。對於命名卷,這是卷的名稱。對於匿名卷,省略此欄位。可以指定為source或src。
  • 將destination文件或目錄安裝在容器中的路徑作為其值。可以指定為destination,dst或target。
  • 該readonly選項(如果存在)導致綁定裝入以只讀方式裝入容器中。
  • 該volume-opt選項可以多次指定,它採用由選項名稱及其值組成的鍵值對。

使用數據卷

數據卷是保存Docker容器生成和使用的數據的首選機制。數據卷完全由Docker管理。有幾個優點:

與掛載目錄相比,卷更易於備份或遷移。

可以使用Docker CLI命令或Docker API管理數據卷

卷適用於Linux和Windows容器。可以在多個容器之間更安全地共享卷。

卷驅動程式允許在遠程主機或雲提供程式上存儲卷,加密卷的內容或添加其他功能。

新卷可以通過容器預先填充其內容。

卷不會增加使用它的容器的大小,並且卷的內容存在於給定容器的生命周期之外

docker run-d-P–name nginx-v【重點my-vol重點】:/webapp nginx

docker run-d-P–name nginx–mount source=my-vol,target=/webapp nginx

①如果本地數據卷或者本地目錄尚未創建,-v命令則會自動創建(此時創建的是匿名數據卷),–mount則會報錯

匿名數據卷:沒有指定名稱標識的數據卷,docker隨機生成不重複的標識,依賴於一個容器,如果該容器消亡,則因為數據卷標識無法知道,所以無法復用。

②如果是容器里的目錄不存在,兩者都會自動創建

創建數據卷

docker volume create my-vol

數據卷列表

docker volume ls

查看數據卷具體資訊

docker volume inspect my-vol

刪除數據卷

docker volume rm my-vol

清除無主的數據卷

docker volume prune

備份數據卷

當您需要備份,還原或將數據從一個Docker主機遷移到另一個Docker主機時,卷是更好的選擇。您可以使用卷停止容器,然後備份卷的目錄(例如/var/lib/docker/volumes/)。

使用掛載目錄

將主機上的目錄或者文件(絕對路徑)掛載到容器指定的路徑中(絕對路徑),也是比較快捷高效的做法,但是數據卷擁有更好的優點,如果你在開發新的應用,請嘗試使用數據卷。

docker run-d-p 8082:8080–name tomcat-mount-v/usr/local/kun/aa:/usr/local/tomcat/webapps/aa tomcat

docker run-d-p 8082:8080–name tomcat-mount–mount type=bind,src=/usr/local/kun/aa,target=/usr/local/tomcat/webapps/aa tomcat