Docker學習筆記(六)數據存儲

文中內容摘自Docker官網

提醒:請務必使用root帳號,以免在後面應用系統部署時,發生權限問題。

    默認情況下,保存在Docker的數據會隨着Docker的關閉而消失。Docker提供三種模式可以將數據持久化:卷(Volume)、綁定掛載(bind mount)、tmpfs掛載(tmpfs mount)。

types of mounts and where they live on the Docker host

保存在Docker管理的主機文件系統中 (Linux默認路徑在 /var/lib/docker/volumes/),非Docker進程不能修改這部分文件系統。卷是在Docker下最佳持久化方式。

    卷由Docker創建和管理。可以使用 docker volume create 命令顯式創建卷,或者在創建容器或服務期間創建卷。

    創建卷時,它存儲在Docker主機上的目錄中。當將卷裝入容器時,這個目錄就是裝入容器的目錄。這與綁定裝載的工作方式類似,只是卷由Docker管理,並且與主機的核心功能隔離。

    給定的卷可以同時裝入多個容器中。當沒有正在運行的容器使用卷時,該卷仍可用於Docker,不會自動刪除。可以使用 docker volume prune 刪除未使用的卷。

    裝載卷時,它可以是命名的或匿名的。當匿名卷第一次裝入容器時,Docker會給它們一個隨機的名稱,保證在給定的Docker主機中是唯一的。除了名稱之外,命名卷和匿名卷的行爲也相同。

    卷還支持卷驅動程序的使用,它允許您將數據存儲在遠程主機或雲提供商上,以及其他可能性。

綁定掛載 可以保存在主機系統的任何路徑下。非Docker進程可以在任何時候訪問這些數據。

    早期提供的方案。如果您正在開發新的Docker應用程序,請考慮改用命名卷。不能使用 docker cli 命令直接管理綁定裝載。使用綁定裝載時,將主機上的文件或目錄將裝載到容器中。如果該文件或目錄不存在,則自動創建。綁定掛載的性能非常好,但它們依賴於主機的文件系統。

tmpfs掛載 保存在內存中,它可以依附於主機或某個容器。

綁定掛載和卷都可以使用 -v 或 --volume 參數,只是語法上稍有不同,使用 --tmpfs 可以實現tmpfs掛載。Docker 17.06及以上版本,我們建議使用 --mount 參數,在容器和服務上實現綁定掛載和卷、tmpfs掛載,語法會更加簡潔。

優勢

 

    卷是在Docker容器和服務中保存數據的首選方法。卷的一些用例包括:

    1. 在多個正在運行的容器之間共享數據。如果不顯式創建卷,則在第一次將卷裝入容器時創建卷。當容器停止或移除時,卷仍然存在。多個容器可以同時裝載同一個卷,讀寫或只讀。只有在顯式刪除卷時才刪除它們。

    2. 當Docker主機不能保證具有給定的目錄或文件結構時。卷幫助您將Docker主機的配置與容器運行時分離。

    3. 當您希望將容器的數據存儲在遠程主機或雲提供程序上,而不是本地時。

    4. 當您需要從一個Docker主機備份、恢復或遷移數據到另一個Docker主機時,卷是更好的選擇。您可以停止使用卷的容器,然後備份卷的目錄(例如/var/lib/docker/volume s/<volume name>)。

綁定掛載

    一般來說,您應該儘可能使用卷。綁定裝載適用於以下類型的用例:

    1. 將配置文件從主機共享到容器。這就是Docker默認情況下通過將/etc/resolv.conf從主機裝載到每個容器中爲容器提供DNS解析的方式。

    2. 在Docker主機和容器上的開發環境之間共享源代碼或構建工件。例如,您可以將maven目標/目錄裝入容器中,並且每次在Docker主機上構建maven項目時,容器都可以訪問重建的工件。

    3. 如果您使用docker進行這種開發,那麼您的生產dockerfile將直接將生產就緒的工件複製到映像中,而不是依賴於綁定掛載。

    4. 當docker主機的文件或目錄結構保證與bind掛載所需的容器一致時。

tmpfs掛載

    當您不希望數據在主機或容器中持久化時,最好使用tmpfs裝載。這可能是出於安全原因,或者在應用程序需要寫入大量非持久狀態數據時保護容器的性能。

小提示

    如果將空卷裝入文件或目錄所在容器中的目錄中,這些文件或目錄將被傳播(複製)到卷中。同樣,如果啓動容器並指定一個不存在的卷,則會爲您創建一個空卷。這是預填充另一個容器所需數據的好方法。

    如果將綁定掛載或非空卷掛載容器中的某個目錄(其中存在某些文件或目錄),這些文件或目錄將被裝入掩蓋,就像將文件保存到Linux主機上的/mnt中,然後將USB驅動器裝入 /mnt 一樣。/mnt的原有內容將被USB驅動器的內容遮蔽,直到USB驅動器卸載爲止。被遮蔽的文件不會被刪除或更改,但在裝入綁定裝入或卷時無法訪問。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章