Content 在用Docker進行持久化的存儲的時候,有兩種方式: 使用數據捲(volume) -v 容器絕對路徑 或者 -v 已經創建的volume名稱:容器絕對路徑 使用掛載點(共用宿主目錄,bind mount) -v 宿主絕對路徑:容器絕對路徑 由於兩種方法都可以使用-v和--mount參 ...
目錄
Content
在用Docker進行持久化的存儲的時候,有兩種方式:
使用數據捲(volume
)
-v 容器絕對路徑
或者
-v 已經創建的volume名稱:容器絕對路徑
使用掛載點(共用宿主目錄,bind mount
)
-v 宿主絕對路徑:容器絕對路徑
由於兩種方法都可以使用-v
和--mount
參數,但是實際上兩種方式的行為區別非常大。
目錄相容性
volume
只能映射容器的目錄,而bind mount
方式可以是目錄也可以是文件。
可移植性
volume
的文件系統由docker進行管理,對不同系統都可以通用相容;bind mount
需要指定絕對路徑,不同的操作系統,對路徑的表述是有區別的,往往無法實現互通。
目錄替代相關
如果使用volume,那麼容器內的文件會被保留在volume中(對應的_data
文件夾)內部,也就是文件被覆制到宿主機器上;使用bind mount時,如果宿主文件夾是空的,不光容器內的文件不會被覆制到宿主機器上,容器的內容還會被覆蓋為空,對於一些容器內路徑文件夾存放config文件的情況,宿主目錄為空會導致容器內的對應目錄被清空,造成啟動錯誤的問題。(詳細對比可以看這篇文章)。
當然,映射完成之後,不管是哪一方面新建文件,都可以正常的反映到另一方的。
在宿主文件不為空的情況下,都會覆蓋容器路徑的文件。
指定位置
使用volume
不能指定的volume
存在的位置,這個是由docker管理的(預設/var/lib/docker/volumes/
),可以通過docker的daemon.json
文件進行配置,詳情可以翻翻之前我寫的文章;而使用bind mount的情況則必須指定位置。
--volume與--mount區別
在創建bind mount
的時候,使用--volume會自動創建宿主方的文件夾,而--mount不會,因此使用--mount映射不存在的目錄,會報錯。
鏡像保存
之前寫過一篇有關於docker export import相關的文章,想著是運行時候增加的配置文件等內容,可以直接保留。後來發現,不管是volume
還是bind mount
,兩種方式都無法將文件保存到鏡像中,因此需要進行單獨的文件保存工作。
docker-compose
docker-compose指定的時候,有一些區別:
- 使用bind mount的時候,宿主這邊可以使用相對路徑了(./),不需要顯示指定($PWD)
- 可以在指定volume名稱的同時創建volume,需要使用
volume:
的配置項
podman相容性
在CentOS類的發行版中,從8開始,已經使用podman
替代了docker
,直接安裝docker的情況下會預設安裝podman,並且將docker命令全部替換成podman命令,大多數命令是通用的。有幾個地方需要註意:
- podman是無deamon程式的,也就是沒有一個專門的守護進程,因此運行的許可權要求也更低,存檔volume的位置有區別,使用更加方便。
- podman使用-v進行bind mount時,如果宿主機器目錄不存在,那麼podman會直接報錯,而不會自動創建文件。
實踐指南
- 使用
docker-compose
創建可以移植的系統,請使用volume。 - 使用docker export方式導出文件的情況下,記住單獨保存映射的volume或者bind mount。
- 如果替換某一個具體配置文件,只能使用bind mount形式;否則,建議使用volume,因為這樣能夠將容器內已經有的目錄複製到volume中,防止空文件夾覆蓋容器對應文件夾導致容器啟動錯誤。
- 為了保障對
podman
的相容性,請先創建宿主機需要mount的文件夾。 - 【不建議】實現bind mount形式在linux與windows下的相容性,windows下的docker desktop可以正確解析
/c/windows
這樣的路徑,在linux下只需要創建相同的目錄結構就也可以實現的文件絕對路徑在不同系統的一致性。
參考
- https://blog.csdn.net/qingyafan/article/details/89577717
- https://blog.csdn.net/dream_broken/article/details/52314993
- 解決docker run中使用 ./ 相對路徑掛載文件或目錄失敗的問題
- Docker數據捲掛載命令volume(-v)與mount的總結