容器中的永續性儲存體

在某些情況下,應用程式務必能夠保存容器中的資料,或者您想要在容器中顯示在容器建置階段未包含的檔案。 永續性儲存體可透過一些方式提供給容器:

  • 系結掛接
  • 具名磁碟區

Docker 有如何使用磁碟區的絕佳概觀,因此最好先閱讀。 此頁面的其餘部分著重於Linux和 Windows 之間的差異,並提供 Windows 上的範例。

繫結掛接

系結掛接 可讓容器與主機共享目錄。 如果您想要將檔案儲存在本機計算機上,如果您重新啟動容器,或想要與多個容器共用,這非常有用。 如果想要在具有相同檔案存取權的多部電腦上執行容器,則應該改用具名磁碟區區或 SMB 裝載。

注意

不支援直接在叢集共用磁碟區上系結掛接,做為容器主機的虛擬機可以在 CSV 磁碟區上執行。

權限

用於系結掛接的許可權模型會根據容器的隔離等級而有所不同。

使用 Hyper-V 隔離 的容器會使用簡單的唯讀或讀寫權限模型。 使用帳戶存取主機上的 LocalSystem 檔案。 如果您在容器中遭到拒絕存取,請確定 LocalSystem 具有主機上該目錄的存取權。 使用唯讀旗標時,容器內對磁碟區所做的變更將不會顯示或保存至主機上的目錄。

使用處理序隔離的 Windows 容器有些許不同,因為其使用容器中的處理序身分識別來存取資料,這表示檔案 ACL 會生效。 在 Windows Server Core 上執行的處理程式身分識別 (根據預設,Windows Server Core 上的 “Container 管理員 istrator” 和 Nano Server 容器上的 “ContainerUser” 會用來存取掛接磁碟區中的檔案和目錄,而LocalSystem必須授與使用數據的存取權。

因為這些身分識別只存在於容器內容中 (而不在儲存檔案的主機上),所以當您設定 ACL 以授與容器權限時,必須使用已知安全性群組例如 Authenticated Users

警告

請勿將敏感性目錄系 C:\ 結至不受信任的容器中。 這可讓其變更主機上通常無法存取且可能會造成安全性缺口的檔案。

使用方式範例:

  • docker run -v c:\ContainerData:c:\data:RO 用於唯讀存取
  • docker run -v c:\ContainerData:c:\data:RW 用於讀寫存取
  • docker run -v c:\ContainerData:c:\data 用於讀寫存取 (預設)

符號連結會在容器中解析。 如果您將主機路徑系結至符號連結或包含符號連結的容器,則容器將無法存取它們。

SMB 掛接

在 Windows Server 版本 1709 和更新版本上,稱為「SMB 全域對應」的新功能可在主機上裝載 SMB 公用,然後將該共用上的目錄傳入容器。 容器不需要使用特定的伺服器、共用、用戶名稱或密碼進行設定,而是在主機上處理。 容器的運作與本機記憶體相同。

設定步驟

  1. 在容器主機上,全域對應遠端 SMB 共用:

    $creds = Get-Credential
    New-SmbGlobalMapping -RemotePath \\contosofileserver\share1 -Credential $creds -LocalPath G:
    

    此命令將使用認證來向遠端 SMB 伺服器進行驗證。 然後,將遠端共享路徑對應至 G:驅動器號(可以是任何其他可用的驅動器號)。 在此容器主機上建立的容器現在可以將其數據磁碟區對應至 G: 磁碟驅動器上的路徑。

    注意

    對容器使用 SMB 全域對應時,容器主機上的所有使用者都可以存取遠端共用。 在容器主機上執行的任何應用程式,也可以存取對應的遠端共用。

  2. 建立容器並將其資料磁碟區對應至全域裝載的 SMB 共用 docker run -it --name demo -v g:\ContainerData:c:\AppData1 mcr.microsoft.com/windows/servercore:ltsc2019 cmd.exe

    在容器內,c:\AppData1 就會對應至遠端共用的「ContainerData」目錄。 儲存在全域對應遠端共用上的任何數據都可供容器內的應用程式使用。 多個容器可以使用相同的命令來取得此共享數據的讀取/寫入存取權。

此 SMB 全域對應支援是 SMB 用戶端功能,可在任何相容的 SMB 伺服器上運作,包括:

  • 儲存空間直接存取 (S2D) 或傳統 SAN 上的向外延展檔伺服器
  • Azure 檔案儲存體 (SMB 共用)
  • 傳統檔案伺服器
  • SMB 通訊協定的第三方實作(例如:NAS 裝置)

注意

SMB 全域對應不支援 DFS 命名空間 (DFSN) 資料夾。 例如,如果您將 DFSN 根共用對應至 New-SmbGlobalMapping -LocalPath Z: -RemotePath \\contoso.com\share1',讀取該根目錄的資料夾目標會傳回錯誤「無法連線到網路位置」。

具名磁碟區

具名磁碟區可讓您依名稱建立磁碟區、將它指派給容器,然後以相同名稱稍後重複使用。 您不需要追蹤其建立位置的實際路徑,只是名稱。 Windows 上的 Docker 引擎具有內建的具名磁碟區外掛程式,可在本機電腦上建立磁碟區。 如果您想要在多部計算機上使用具名磁碟區,則需要額外的外掛程式。

範例步驟:

  1. docker volume create unwound - 建立名稱為 'unwound' 的磁碟區
  2. docker run -v unwound:c:\data microsoft/windowsservercore - 啟動容器並將磁碟區對應至 c:\data
  3. 將某些檔案寫入容器中的 c:\data,然後停止容器
  4. docker run -v unwound:c:\data microsoft/windowsservercore - 啟動新容器
  5. 在新容器中執行 dir c:\data - 檔案仍然存在

注意

Windows Server 會將目標路徑名稱 (容器內的路徑) 轉換成小寫;即 -v unwound:c:\MyData (或 Linux 容器中的 -v unwound:/app/MyData) 會導致容器內的目錄 c:\mydata (或 Linux 容器中的 /app/mydata) 進行對應 (如果不存在,則會加以建立)。