[入門] 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