Share via


在 Azure Container Apps 中使用記憶體掛接

容器應用程式可以存取不同型別的儲存體。 必要時,單一應用程式可以使用一種以上的儲存體。

儲存體類型 描述 持續性 使用範例
容器範圍的記憶體 可供執行中的容器使用暫時記憶體 數據可在容器關閉之前使用 撰寫本機應用程式快取。
復本範圍的記憶體 在相同復本中的容器之間共用檔案的暫時記憶體 數據可在複本關閉之前使用 寫入側車容器所處理記錄檔的主要應用程式容器。
Azure 檔案 永久儲存體 數據會保存至 Azure 檔案儲存體 將檔案寫入檔案共用,讓其他系統能夠存取資料。

暫時性儲存體

容器應用程式可以將暫存數據讀取和寫入暫時記憶體。 暫時記憶體的範圍可以設定為容器或複本。 每個復本可用的容器範圍和複本範圍的記憶體總數取決於配置給複本的 vCPU 總數。

vCPU 暫時記憶體總計
0.25 或更低 1 GiB
0.5 或更低 2 GiB
1 或更低 4 GiB
超過 1 8 GiB

容器範圍的記憶體

容器可以寫入自有的檔案系統。

容器檔案系統儲存體具有下列特性:

  • 儲存體是暫時的,會在容器關閉或重新啟動時消失。
  • 只有在目前容器中執行的程序可以看見寫入此儲存體的檔案。

復本範圍的記憶體

您可以在 Kubernetes 中掛接相當於 EmptyDir (空白目錄) 的暫時暫存磁碟區。 此記憶體的範圍設定為單一複本。 使用磁碟 EmptyDir 區在相同復本中的容器之間共享數據。

複本範圍的記憶體具有下列特性:

  • 檔案的保留期限為複本存留期。
    • 如果複本中的容器重新啟動,則會保留磁碟區中的檔案。
  • 復本中的任何 init 或應用程式容器都可以掛接相同的磁碟區。
  • 容器可以掛接多個 EmptyDir 磁碟區。

若要設定複本範圍的記憶體,請先在修訂中定義磁碟 EmptyDir 區。 然後在修訂中的一或多個容器中定義磁碟區掛接。

必要條件

需求 指示
Azure 帳戶 如果您沒有帳戶,可免費建立帳戶
Azure 容器應用程式環境 建立容器應用程式環境

組態

使用 Azure CLI 設定複本範圍的記憶體時,您必須使用 YAML 定義來建立或更新容器應用程式。

  1. 若要更新現有的容器應用程式以使用復本範圍的記憶體,請將應用程式的規格匯出至名為 app.yaml 的 YAML 檔案。

    az containerapp show -n <APP_NAME> -g <RESOURCE_GROUP_NAME> -o yaml > app.yaml
    
  2. 對容器應用程式規格進行下列變更。

    • volumes將陣列新增至template容器應用程式定義的區段,並定義磁碟區。 如果您已經有 volumes 陣列,請將新的磁碟區新增至陣列。
      • name是磁碟區的標識碼。
      • 使用 EmptyDir 作為 storageType
    • 針對您要掛接磁碟區之範本中的每個容器,請在容器定義的陣列中 volumeMounts 定義磁碟區掛接。
      • volumeName是陣列中volumes定義的名稱。
      • mountPath是容器中掛接磁碟區的路徑。
    properties:
      managedEnvironmentId: /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP_NAME>/providers/Microsoft.App/managedEnvironments/<ENVIRONMENT_NAME>
      configuration:
        activeRevisionsMode: Single
      template:
        containers:
        - image: <IMAGE_NAME1>
          name: my-container-1
          volumeMounts:
          - mountPath: /myempty
            volumeName: myempty
        - image: <IMAGE_NAME_2>
          name: my-container-2
          volumeMounts:
          - mountPath: /myempty
            volumeName: myempty
        volumes:
        - name: myempty
          storageType: EmptyDir
    
  3. 使用 YAML 檔案更新容器應用程式。

    az containerapp update --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> \
        --yaml app.yaml
    

如需完整範例, 請參閱 YAML 規格

若要建立複本範圍的磁碟區並將其掛接在容器中,請對ARM範本中的容器應用程式資源進行下列變更:

  • volumes將陣列新增至template容器應用程式定義的區段,並定義磁碟區。 如果您已經有 volumes 陣列,請將新的磁碟區新增至陣列。
    • name是磁碟區的標識碼。
    • 使用 EmptyDir 作為 storageType
  • 針對您要掛接磁碟區之範本中的每個容器,請在容器定義的陣列中 volumeMounts 定義磁碟區掛接。
    • volumeName是陣列中volumes定義的名稱。
    • mountPath是容器中掛接磁碟區的路徑。

ARM 樣本代碼段範例:

{
  "apiVersion": "2022-03-01",
  "type": "Microsoft.App/containerApps",
  "name": "[parameters('containerappName')]",
  "location": "[parameters('location')]",
  "properties": {

    ...

    "template": {
      "revisionSuffix": "myrevision",
      "containers": [
        {
          "name": "main",
          "image": "[parameters('container_image')]",
          "resources": {
            "cpu": 0.5,
            "memory": "1Gi"
          },
          "volumeMounts": [
            {
              "mountPath": "/myempty",
              "volumeName": "myempty"
            }
          ]
        },
        {
          "name": "sidecar",
          "image": "[parameters('sidecar_image')]",
          "resources": {
            "cpu": 0.5,
            "memory": "1Gi"
          },
          "volumeMounts": [
            {
              "mountPath": "/myempty",
              "volumeName": "myempty"
            }
          ]
        }
      ],
      "scale": {
        "minReplicas": 1,
        "maxReplicas": 3
      },
      "volumes": [
        {
          "name": "myempty",
          "storageType": "EmptyDir"
        }
      ]
    }
  }
}

如需完整範例, 請參閱ARM樣本 API 規格

若要建立複本範圍的磁碟區並將其掛接在容器中,請使用 Azure 入口網站 部署容器應用程式的新修訂。

  1. 在 Azure 入口網站 中,流覽至您的容器應用程式。

  2. 選取 左側功能表中的 [修訂管理 ]。

  3. 選取 [ 建立新修訂]。

  4. 選取您要掛接磁碟區的容器。

  5. 在 [ 編輯容器 內容] 窗格中,選取 [ 磁盘區掛接] 索引標籤

  6. 在 [ 暫時儲存區 ] 區段底下,使用下列資訊建立新的磁碟區。

    • 磁碟區名稱:暫時磁碟區的名稱。
    • 掛接路徑:容器中要掛接磁碟區的絕對路徑。
  7. 選取 [ 儲存 ] 以儲存變更並結束內容窗格。

  8. 選取 [建立] 以建立新的修訂。

Azure 檔案儲存體磁碟區

您可以從 Azure 檔案儲存體 掛接檔案共享,作為容器中的磁碟區。

Azure 檔案儲存體具有下列特性:

  • 在掛接位置下寫入的檔案會保存至檔案共用。
  • 共用中的檔案可透過掛接位置取得。
  • 多個容器可以掛接相同的檔案共用,包括位於另一個複本、修訂或容器應用程式的檔案共用。
  • 掛接共用的所有容器都可以存取任何其他容器或方法所寫入的檔案。
  • 多個 Azure 檔案儲存體磁碟區可以掛接在單一容器中。

Azure 檔案儲存體 同時支援SMB和NFS通訊協定。 您可以使用任一通訊協定掛接 Azure 檔案儲存體 共用。 您在環境中定義的檔案共享必須設定為記憶體帳戶中檔案共用所使用的相同通訊協定。

注意

Azure Container Apps 中掛接 NFS 共用的支援目前為預覽狀態。

若要在您的容器中啟用 Azure 檔案儲存體 記憶體,您必須設定環境和容器應用程式,如下所示:

  • 在容器應用程式環境中建立儲存體定義。
  • 如果您使用 NFS,您的環境必須設定為自訂 VNet,且記憶體帳戶必須設定為允許從 VNet 存取。 如需詳細資訊,請參閱 Azure 檔案儲存體 中的 NFS 檔案共用。
  • 如果您的環境是使用自定義 VNet 進行設定,您必須在與子網相關聯的網路安全組 (NSG) 中允許埠 445 和 2049。
  • 在修訂中定義類型 AzureFile 為 (SMB) 或 NfsAzureFile (NFS) 的磁碟區。
  • 在修訂中的一或多個容器中定義磁碟區掛接。
  • 使用的 Azure 檔案儲存體記憶體帳戶必須可從容器應用程式的虛擬網路存取。 如需詳細資訊,請參閱授與虛擬網路存取權

必要條件

需求 指示
Azure 帳戶 如果您沒有帳戶,可免費建立帳戶
Azure 儲存體帳戶 建立儲存體帳戶
Azure 容器應用程式環境 建立容器應用程式環境

組態

設定容器應用程式以使用 Azure CLI 掛接 Azure 檔案儲存體 磁碟區時,您必須使用 YAML 定義來建立或更新容器應用程式。

如需掛接 SMB 檔案共用的逐步教學課程,請參閱在 Azure Container Apps 中建立 Azure 檔案儲存體 記憶體掛接。

  1. 將記憶體定義新增至您的 Container Apps 環境。

    az containerapp env storage set --name my-env --resource-group my-group \
        --storage-name mystorage \
        --storage-type AzureFile \
        --azure-file-account-name <STORAGE_ACCOUNT_NAME> \
        --azure-file-account-key <STORAGE_ACCOUNT_KEY> \
        --azure-file-share-name <STORAGE_SHARE_NAME> \
        --access-mode ReadWrite
    

    將和 <STORAGE_ACCOUNT_KEY> 取代<STORAGE_ACCOUNT_NAME>為您儲存體帳戶的名稱和金鑰。 將取代 <STORAGE_SHARE_NAME> 為記憶體帳戶中的檔案共享名稱。

    的有效值為 --access-modeReadWriteReadOnly

  2. 若要更新現有的容器應用程式以掛接檔案共用,請將應用程式的規格匯出至名為 app.yaml 的 YAML 檔案。

    az containerapp show -n <APP_NAME> -g <RESOURCE_GROUP_NAME> -o yaml > app.yaml
    
  3. 對容器應用程式規格進行下列變更。

    • volumes將陣列新增至template容器應用程式定義的區段,並定義磁碟區。 如果您已經有 volumes 陣列,請將新的磁碟區新增至陣列。
      • name是磁碟區的標識碼。
      • 針對 storageType,請使用 AzureFile SMB或 NfsAzureFile NFS。 此值必須符合您在環境中定義的記憶體類型。
      • 針對 storageName,請使用您在環境中定義的記憶體名稱。
    • 針對您想要掛接 Azure 檔案儲存體 記憶體範本中的每個容器,請在容器定義的陣列中volumeMounts定義磁碟區掛接。
      • volumeName是陣列中volumes定義的名稱。
      • mountPath是容器中掛接磁碟區的路徑。
    properties:
      managedEnvironmentId: /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP_NAME>/providers/Microsoft.App/managedEnvironments/<ENVIRONMENT_NAME>
      configuration:
      template:
        containers:
        - image: <IMAGE_NAME>
          name: my-container
          volumeMounts:
          - volumeName: azure-files-volume
            mountPath: /my-files
        volumes:
        - name: azure-files-volume
          storageType: AzureFile
          storageName: mystorage
    
  4. 使用 YAML 檔案更新容器應用程式。

    az containerapp update --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> \
        --yaml app.yaml
    

如需完整範例, 請參閱 YAML 規格

下列 ARM 範本代碼段示範如何將 Azure 檔案儲存體 共用新增至 Container Apps 環境,並在容器應用程式中使用它。

  1. storages 子資源新增至 Container Apps 環境。

    {
      "type": "Microsoft.App/managedEnvironments",
      "apiVersion": "2022-03-01",
      "name": "[parameters('environment_name')]",
      "location": "[parameters('location')]",
      "properties": {
        "daprAIInstrumentationKey": "[parameters('dapr_ai_instrumentation_key')]",
        "appLogsConfiguration": {
          "destination": "log-analytics",
          "logAnalyticsConfiguration": {
            "customerId": "[parameters('log_analytics_customer_id')]",
            "sharedKey": "[parameters('log_analytics_shared_key')]"
          }
        }
      },
      "resources": [
        {
          "type": "storages",
          "name": "myazurefiles",
          "apiVersion": "2022-03-01",
          "dependsOn": [
            "[resourceId('Microsoft.App/managedEnvironments', parameters('environment_name'))]"
          ],
          "properties": {
            "azureFile": {
              "accountName": "[parameters('storage_account_name')]",
              "accountKey": "[parameters('storage_account_key')]",
              "shareName": "[parameters('storage_share_name')]",
              "accessMode": "ReadWrite"
            }
          }
        }
      ]
    }
    
  2. 更新容器應用程式資源以新增磁碟區和磁碟區掛接。

    {
      "apiVersion": "2023-05-01",
      "type": "Microsoft.App/containerApps",
      "name": "[parameters('containerappName')]",
      "location": "[parameters('location')]",
      "properties": {
    
        ...
    
        "template": {
          "revisionSuffix": "myrevision",
          "containers": [
            {
              "name": "main",
              "image": "[parameters('container_image')]",
              "resources": {
                "cpu": 0.5,
                "memory": "1Gi"
              },
              "volumeMounts": [
                {
                  "mountPath": "/myfiles",
                  "volumeName": "azure-files-volume"
                }
              ]
            }
          ],
          "scale": {
            "minReplicas": 1,
            "maxReplicas": 3
          },
          "volumes": [
            {
              "name": "azure-files-volume",
              "storageType": "AzureFile",
              "storageName": "myazurefiles"
            }
          ]
        }
      }
    }
    
    • volumes將陣列新增至template容器應用程式定義的區段,並定義磁碟區。 如果您已經有 volumes 陣列,請將新的磁碟區新增至陣列。
      • name是磁碟區的標識碼。
      • 針對 storageType,請使用 AzureFile SMB或 NfsAzureFile NFS。 此值必須符合您在環境中定義的記憶體類型。
      • 針對 storageName,請使用您在環境中定義的記憶體名稱。
    • 針對您想要掛接 Azure 檔案儲存體 記憶體範本中的每個容器,請在容器定義的陣列中volumeMounts定義磁碟區掛接。
      • volumeName是陣列中volumes定義的名稱。
      • mountPath是容器中掛接磁碟區的路徑。

如需完整範例, 請參閱ARM樣本 API 規格

若要在 Azure 入口網站 中設定 Azure 檔案儲存體 記憶體的磁碟區掛接,請將檔案共用新增至您的 Container Apps 環境,然後藉由建立新的修訂,將磁碟區掛接新增至容器應用程式。

  1. 在 Azure 入口網站 中,流覽至您的 Container Apps 環境。

  2. 從左側功能表中選取 [Azure 檔案儲存體]。

  3. 選取 [新增]。

  4. 在 [ 新增檔案分享 ] 操作功能表中,輸入下列資訊:

    • 名稱:檔案共享的名稱。
    • 儲存體 帳戶名稱:包含檔案共用的記憶體帳戶名稱。
    • 儲存體 帳戶金鑰:記憶體帳戶的存取金鑰。
    • 檔案共享:檔案共享的名稱。
    • 存取模式:檔案共享的存取模式。 有效值為 “Read/Write” 和 “Read only”。
  5. 選取 [新增 ] 以結束內容窗格。

  6. 選取 [ 儲存] 以認可變更。

  7. 流覽至您的容器應用程式。

  8. 從左側功能表中選取 [修訂管理 ]。

  9. 選取 [ 建立新修訂]。

  10. 選取您要掛接磁碟區的容器。

  11. 在 [ 編輯容器 內容] 窗格中,選取 [ 磁盘區掛接] 索引標籤

  12. 在 [ 檔案共用 ] 區段底下,使用下列資訊建立新的磁碟區。

    • 檔案共享名稱:您新增的檔案共用。
    • 掛接路徑:容器中要掛接磁碟區的絕對路徑。
  13. 選取 [ 儲存 ] 以儲存變更並結束內容窗格。

  14. 選取 [建立] 以建立新的修訂。