Docker - 資料儲存



出於設計原因,通常不應將資料直接持久化到 Docker 容器中,原因如下:首先,容器始終旨在是短暫的。換句話說,它們可以隨時停止、啟動或在理論上銷燬。因此,儲存在容器內部的資料在容器停止存在時會丟失。這樣一來,資料持久化和恢復資料變得困難。

其次,容器的可寫層可能與它執行在其上的主機機器緊密協調,這使得將其移動到另一臺機器或提取資料變得困難。此外,此層中的寫入通常使用儲存驅動程式和聯合檔案系統執行,與主機檔案系統的寫入相比,這可能會導致效能開銷。

資料也可以儲存在容器內。這可能導致擴充套件和共享方面的問題,因為多個容器可能希望訪問相同的資料,這使得管理和保持所述資料同步變得複雜。這就是為什麼最好使用 Docker 卷或繫結掛載來儲存容器外部的資料,這將提供永續性、可移植性和易於訪問。

在本章中,我們將討論如何使用卷和繫結掛載來持久化 Docker 容器中的資料。

在 Docker 容器中持久化資料的方法

無論您使用卷、繫結掛載還是 tmpfs 等掛載型別,容器內部的資料都作為容器檔案系統內的目錄或檔案呈現。關鍵區別在於:持久化資料駐留在 Docker 主機上的位置。

卷位於 Docker 管理的主機檔案系統的一部分,通常在 Linux 上為 **`/var/lib/docker/volumes/`**。此區域本機執行的 Docker 程序無法訪問,因此卷是唯一適用於在 Docker 中持久儲存資料的機制。

另一方面,繫結掛載可以位於主機系統的任何位置,甚至是一些關鍵系統檔案,因此,可以由 Docker 未管理的程序更改。這使得它們更加靈活,但隔離性較差。最後,tmpfs 掛載僅存在於主機系統的記憶體中,並且從不觸及底層檔案系統 - 非常適合短暫的、非永續性資料。

**`-v`** 或 **`--volume`** 標誌允許指定卷或繫結掛載的掛載點。語法略有不同:對於 tmpfs 掛載,請使用 **`--tmpfs`** 標誌。但為了最大程度地提高可讀性和清晰度,只要可能,請將 **`--mount`** 與所有選項合併並巢狀在其中。

Docker 卷

卷是在 Docker 容器中持久儲存由其生成和使用的資料的首選方式。Docker 管理它們,並且獨立於主機機器的檔案系統是什麼。與繫結掛載等其他儲存策略相比,使用它們還有幾個好處。

Docker 卷的關鍵特性

  • **永續性** - 儲存在卷中的資料將超出已停止、刪除或替換容器的生命週期。
  • **可移植性** - 使用卷可以輕鬆備份、遷移或在多個容器之間共享資料。
  • **管理** - 使用 Docker CLI 命令或透過 Docker API 控制和管理 Docker 卷。
  • **跨平臺相容性** - 在 Linux 和 Windows 容器上以卓越的一致性執行。
  • **效能** - 與來自 Mac 和 Windows 主機的繫結掛載相比,卷在 Docker Desktop 上具有更佳的效能。

建立卷

這是使用名稱“my-vol”建立新卷的基本命令。

$ docker volume create my-vol

將卷附加到容器

以下命令將“my-vol”卷附加到容器內的“/app/data”目錄。如果任何資料寫入此目錄,則會將其持久儲存在卷中。

$ docker run -d --name my-container -v my-vol:/app/data my-image

列出卷

此命令列出 Docker 環境中所有可用的卷。

$ docker volume ls

檢查卷

此命令提供有關卷的詳細資訊,包括掛載點、驅動程式和其他詳細資訊。

$ docker volume inspect my-vol

刪除卷

此命令刪除“my-vol”卷。警告:卷中的資料將被不可逆地銷燬。

$ docker volume rm my-vol

Docker 卷的實際用例

  • **資料庫** - 資料的資料庫檔案應儲存在卷中,這將使其在所有容器重啟中保持永續性。
  • **Web 伺服器內容** - 將網站檔案或使用者上傳儲存在卷中,以便即使替換了 Web 伺服器容器,它們仍然可以訪問。
  • **應用程式日誌** - 將日誌儲存在卷中,以便於分析和持久化。

Docker 卷帶來了強大且靈活的容器化應用程式內持久資料管理。即使在動態容器環境中利用卷,資料也能保持安全和可訪問。

繫結掛載

Docker 中的繫結掛載是一種將主機機器上的檔案或目錄直接共享到 Docker 應用程式中的方式。繫結掛載將主機機器上的檔案或目錄直接關聯到容器中的路徑;與卷不同,它們不需要管理,因為 Docker 管理它們。

繫結掛載的關鍵特性

  • **直接訪問** - 對主機上檔案進行的任何更改都會立即反映在容器內,反之亦然。
  • **靈活性** - 您可以掛載主機系統上的任何位置,包括系統檔案、配置檔案或專案的原始碼。
  • **開發工作流** - 在開發中,繫結掛載對您來說是一個福音,因為您可以在主機驅動器上編輯程式碼,並且在執行的容器中發生的更改幾乎會立即顯示。

掛載主機目錄

以下命令將您機器上的當前目錄掛載到容器的“/app”目錄。當前目錄內檔案的任何更改都將反映在容器內,反之亦然。

$ docker run -d --name my-container -v $(pwd):/app my-image

掛載單個檔案

這會將主機檔案“file.txt”掛載到容器中的“/etc/config.txt”路徑。

$ docker run -d --name my-container -v /path/to/file.txt:/etc/config.txt my-image

使用 --mount 標誌

--mount 標誌允許更詳細地指定繫結掛載,明確說明其型別、源和目標。

$ docker run -d --name my-container --mount 
   type=bind,source="$(pwd)",target=/app my-image

Docker 中繫結掛載的實際應用

  • **開發環境** - 使包含原始碼的目錄可掛載,以便可以即時更新原始碼中的更改。
  • **配置檔案** - 將主機的配置檔案掛載到容器中以自定義其行為。
  • **共享主機資源** - 掛載容器需要訪問的檔案或目錄 - 例如,日誌檔案和資料檔案。

命名管道和 TMPFS

在 Docker 中,您可以使用 tmpfs 掛載和命名管道將資料儲存在主機系統記憶體中,儘管它們在不同的作業系統中實現方式不同。

tmpfs 掛載(Linux)

在 Linux 上使用 Docker 時,tmpfs 掛載用於建立儲存在記憶體中的臨時檔案系統。這意味著寫入 tmpfs 掛載的檔案不會持久化到磁碟,因此非常適合儲存敏感資訊或臨時資料,而不需要在容器之外存在。

tmpfs 從記憶體執行;因此,與舊的基於磁碟的儲存方法相比,它的讀寫速度要快得多。但是,tmpfs 中的資料是易失性的,如果主機系統重新啟動或容器停止,則會丟失。

命名管道(Windows)

在 Windows 中,命名管道的工作原理與 tmpfs 掛載非常相似,用於將資料儲存在記憶體中。它們使程序能夠相互通訊,從而可以將其資料儲存在容器的臨時記憶體中。

與 tmpfs 一樣,命名管道的內容不會寫入磁碟,並且一旦容器停止就會丟失。命名管道是 Windows 中程序間通訊的基本機制之一,Docker 利用其功能在 Windows 主機上提供記憶體儲存功能。

tmpfs 掛載和命名管道都旨在支援效能而非資料永續性至關重要的用例。它們很好地用於儲存臨時檔案、快取或不應寫入磁碟的敏感資訊。

何時使用 Docker 卷和繫結掛載?

卷是在 Docker 中處理持久儲存的最佳方式。它非常適合在容器之間共享資料,在這種情況下,您無法保證主機檔案結構,遠端儲存資料,必須備份、恢復或遷移資料的情況等等。此外,卷的效能更高,並且在 Docker Desktop 上為 I/O 密集型應用程式提供了本機檔案系統行為。

相反,繫結掛載將主機上的檔案/目錄直接連結到容器的路徑。通常,它們透過允許使用者在主機和容器之間共享配置檔案或原始碼來提供幫助,尤其是在開發環境中。但在將繫結掛載與敏感資料一起使用時要謹慎,因為容器中的更改會直接影響主機。

Tmpfs 掛載完全基於記憶體且是臨時的,非常適合非永續性資料,如快取或敏感資訊。它們專注於速度和安全性,因此資料永續性不是它們的關注點。

結論

就是這樣。您已經掌握了 Docker 儲存選項:卷、繫結掛載和 tmpfs 掛載,以最佳化容器化應用程式中的資料管理。瞭解它們之間的區別將使您能夠明智地選擇在何處以及如何儲存您的資料。

卷(Volumes)提供永續性、可移植性和隔離性,使其適合儲存需要比單個容器存活時間更長的寶貴資料。繫結掛載(Bind mounts)更加靈活,可以提供對主機檔案的即時訪問;它們有助於開發和共享特定資源。Tmpfs 可以被掛載,優先考慮速度和安全性;它在記憶體中提供臨時的儲存空間,用於敏感或瞬態資料。

很多將取決於您需要適當的儲存機制的具體需求和用例。透過考慮資料永續性、訪問模式和效能需求等因素,Docker 的儲存選項使人們能夠構建高效、可靠和安全的容器化應用程式。

Docker 資料儲存常見問題解答

問 1. 當 Docker 容器停止或被移除時,我的資料會發生什麼?

直接在容器可寫層建立的資料在容器停止或移除時會丟失。這是因為容器應該被短暫建立。

為了確保資料的永續性,引入了諸如 Docker 卷和繫結掛載等資料儲存機制,透過這些機制,資料儲存在主機檔案系統上或使用 Docker 管理的儲存並連結到容器。

問 2. Docker 中的卷和繫結掛載有什麼區別?

卷是 Docker 處理持久儲存的首選方式。它們由 Docker 本身管理,獨立於任何單個容器存在,但某些平臺為它們提供了出色的生命週期特性,例如可移植性、輕鬆備份和更好的效能。

繫結掛載是容器中對主機目錄或檔案的直接連結。這樣,它們就可以直接與容器共享檔案,並且實際上優於捲來實現此目的:在大多數情況下,更安全,當然也更易於移植。

問 3. Docker 中的 tmpfs 掛載是什麼,何時應該使用它們?

Tmpfs 掛載是僅駐留在主機系統記憶體中的臨時檔案系統。因此,它們不是永續性的,因此非常適合確保敏感資料或臨時檔案不會超出容器的生命週期。

儘管 tmpfs 掛載適合進行讀寫操作,但它們是易失性的:當主機重新啟動或容器停止時,資料會丟失。

問 4. 我可以將 AWS S3 或 Azure Blob 儲存解決方案與 Docker 一起使用嗎?

透過 Docker 進行操作,您仍然可以使用任何雲端儲存解決方案。但是,它更多的是與雲提供商的 SDK 或 API 互動,而不是將其雲端儲存直接掛載到卷中。這允許使用者儲存和檢索來自雲的資料;該解決方案几乎可以無限擴充套件並且具有永續性。

問 5. 如何保護儲存在 Docker 卷中的資料?

保護 Docker 卷中資料的潛在措施包括:使用正確的許可權隔離對卷的訪問,避免無區別地共享卷,透過定期將卷備份到外部儲存以進行災難恢復來建立適當的備份機制,如果儲存的是敏感資料,則對卷的內容進行加密,或加密主機的整個檔案系統,最後,始終關注 Docker 的新安全更新和最佳實踐,以保護您的環境免受漏洞的影響。

廣告

© . All rights reserved.