Docker Mount 下圖清楚了說明Docker host的 Volume with bind mounts 以及tmpfs mount 機制
這裡針對 Bind Mounts 部分進行介紹:
Bind Mounts
Bind mounts 在早期 Docker 版本就已經存在,相對於 volumes ,使用 Bind mounts 有一些功能限制:
當 container 在host machine 中的檔案或目錄使用 bind mount
host machine 是以完整的路徑來參照這些檔案或目錄
因此,在Docker host 中不需要存在這些檔案或目錄
若參照的目錄或檔案不存在,則會自動建立。
透過 Bind Mounts 的方式是非常有效率的方式,但使用 bind mounts 需要 host machine 有特定的 filesystem 結構才能運作
如果你正開發一個新的 Docker 應用程式,考慮改用 Volumes 時,就不能直接透過Docker CLI 來管理 bind mounts。
Bind mounts 可以指定在敏感的檔案
使用 bind mounts 其中一個特點就是,
你可以在 container 透過 processes running 來變更 host 的 filesystem,包括新增、修改、刪除重要的系統擋或路徑。
在安全性操作具有相當大的權限,包括可以在 host system 來操作影響非Docker的進程。
Bind Mounts 使用範例:
一般來說,會建議使用 Volumes
Bind mounts 具有以下的一些使用案例類型:
可以從 host machine 分享設定檔給 containers。
這特點有被Docker 運用在 container 預設的 DNS 解析處理,透過 host macine 來 mounting /etc/resolv.conf
到每一個 container。
在Docker host 以及 container 這兩個開發環境分享原始碼或檔案
舉例來說,當你的 container mount target/ 之後,以及每次你在 Docker host 上建立Maven時,container 都可以訪問這個被重新建構的目錄。
如果你使用這種方式來開發,你的 Dockerfile 產品將會生產後重新建構的文件直接複製到 Image,而不會使用 bind mount。
當Docker host 檔案或路徑結構需要保證透過 bind mounts 的方式時,就一定要用 Container。
注意事項
再使用 bind mounts 或者 volumes 都需要注意下列幾點:
- 如果 container 所 mount 的位置已經存在檔案或目錄,這些內容一會被複製到 volume 裡。同樣的,如果你啟動 container 並且指定的 volume 尚未存在,將會建立一個空的 volume 。這樣的做法,對於多個 container 共用同一份 volume 時,會是最好的處理方式。
- 如果 container mount 的 bin-mount 資料夾或目錄已經存在或 mount 的不是空的 volume,將會以模糊的方式來處理。舉例來說,如果當container mount 資料夾是/mnt ,在 Linux 這個資料夾同時會被用來 mounted USB Drive,在執行期間若 USB 移除,並不會影響已經 mount 的 bind mount或 volume。