管理 Docker 應用程式中的狀態和資料
提示
本內容節錄自《容器化 .NET 應用程式的 .NET 微服務架構》(.NET Microservices Architecture for Containerized .NET Applications) 電子書,可以在 .NET Docs 上取得,或免費下載可供離線閱讀的 PDF。
在大多數情況下,您可以將容器視為處理序執行個體。 處理序不會保留持續性狀態。 雖然容器可以寫入至其本機存放區,但假設執行個體會無限期存在,就像是假設記憶體中的某個位置會持久一樣。 建議您假設容器映像與處理序相似,擁有多個執行個體,或是最後會遭到終止。 若它們是使用容器協調器進行管理,建議您假設它們可能會從一個節點或 VM 移動到另一個。
下列解決方案用來管理 Docker 應用程式中的資料:
從 Docker 主機,透過 Docker Volumes (Docker 磁碟區):
磁碟區會儲存在主機檔案系統中由 Docker 管理的一個區域內。
由於繫結裝載可對應到主機檔案系統內的任何資料夾,因此無法從 Docker 處理序管理存取,且可能會因為容器能存取敏感性 OS 資料夾,而帶來安全性風險。
tmpfs 裝載則與虛擬資料夾相似,只存在於主機的記憶體中,永遠不會寫入檔案系統。
從遠端存放:
Azure 儲存體,備有異地分散式儲存體,以提供容器的長期持續性解決方案。
遠端關聯式資料庫 (例如 Azure SQL Database)、NoSQL 資料庫 (例如 Azure Cosmos DB) 或快取服務 (例如 Redis)。
從 Docker 容器:
- 重疊檔案系統。 此 Docker 功能會實作寫入時複製工作,將已更新資訊儲存到容器的根檔案系統。 該資訊位在容器所依據的原始映像「上方」。 如果從系統中刪除容器,這些變更將會遺失。 因此,雖然有可能將容器的狀態儲存在其本機存放區,但以此為中心來設計系統會與容器設計的前提 (預設為無狀態) 衝突。
不過,使用 Docker 磁碟區現在是處理 Docker 中本機資料的慣用方法。 若您需要容器內儲存體的詳細資訊,請查看 Docker storage drivers (Docker 儲存體驅動程式) 與 About storage drivers (關於儲存體驅動程式)。
下列提供這些選項的更多詳細資料:
磁碟區是從主機 OS 對應至容器內目錄的目錄。 當容器中的程式碼具有目錄的存取權時,該存取權實際上就是主機 OS 上的目錄存取權。 此目錄不會和容器本身的存留期繫結,且目錄會由 Docker 管理,且和主機電腦的核心功能隔離。 因此,資料磁碟區設計成可無視於容器的存留期來保存資料。 如果您從 Docker 主機中刪除容器或映像,則不會刪除保存在資料磁碟區中的資料。
磁碟區可以具名,也可以是匿名 (預設)。 具名磁碟區是資料磁碟區容器的演進,可輕鬆的在容器間共用資料。 磁碟區也支援磁碟區驅動程式,除了其他選項之外,還可讓您將資料儲存在遠端主機上。
繫結裝載則是從很久以前開始便持續存在的可用選項,允許將任何資料夾對應到容器中的掛接點。 繫結裝載的限制比磁碟區更多,且具有某些重要的安全性問題,因此磁碟區是建議的選項。
tmpfs 裝載基本上就是虛擬資料夾,只存在於主機的記憶體中,永遠不會寫入檔案系統。 它們既快速又安全,但會使用記憶體,且僅適用於暫時非持續性資料。
如圖 4-5 所示,一般 Docker 磁碟區可儲存在容器本身之外,但必須在主機伺服器或 VM 的實體界限內。 不過,Docker 容器無法從一部主機伺服器或 VM 存取另一部主機伺服器或 VM 的磁碟區。 換句話說,使用這些磁碟區,將無法管理在不同 Docker 主機上執行容器間所共用的資料,雖然仍可透過支援遠端主機的磁碟區驅動程式來達到此目的。
圖 4-5: 容器式應用程式的磁碟區和外部資料來源
磁碟區可以在容器間共用,但僅限位於相同的主機,除非您使用支援遠端主機的遠端驅動程式。 此外,當 Docker 容器是由協調器所管理時,容器可能會根據叢集所執行的最佳化,在主機之間「移動」。 因此,不建議您使用資料磁碟區來儲存商務資料。 但針對追蹤檔案、時態性檔案或不影響商務資料一致性的類似檔案而言,這會是不錯的機制。
遠端資料來源和快取工具 (例如 Azure SQL Database、Azure Cosmos DB) 或遠端快取 (例如 Redis) 可用於容器化應用程式,就像是在沒有容器時用於開發一樣。 此方法經過實證,可儲存商務應用程式資料。
Azure 儲存體。 商務資料通常需要放在外部資源或資料庫中,例如 Azure 儲存體。 具體來說,Azure 儲存體會提供下列雲端服務:
Blob 儲存體可儲存非結構化的物件資料。 Blob 可以是任何類型的文字或二進位資料,例如文件或媒體檔案 (影像、音訊和視訊檔案)。 Blob 儲存體也稱為物件儲存體。
檔案儲存體為使用標準 SMB 通訊協定的舊版應用程式提供共用存放裝置。 Azure 虛擬機器和雲端服務可透過掛接共用,在應用程式元件之間共用檔案資料。 內部部署應用程式可透過檔案服務 REST API,來存取共用中的檔案資料。
表格儲存體可儲存結構化的資料集。 表格儲存體是 NoSQL 索引鍵屬性資料存放區,可快速開發及存取大量資料。
關聯式資料庫和 NoSQL 資料庫。 外部資料庫的選擇有許多,從關聯式資料庫 (例如 SQL Server、PostgreSQL、Oracle) 到 NoSQL 資料庫 (例如 Azure Cosmos DB、MongoDB) 等等。這些資料庫由於是完全不同的主題,因此不會在本指南中說明。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應