將容器執行個體部署至 Azure 虛擬網路

Azure 虛擬網路會為 Azure 資源和內部部署資源提供安全的私人網路。 透過將容器群組部署至 Azure 虛擬網路,您的容器可在虛擬網路中安全地與其他資源通訊。

本文說明如何使用 Azure CLI 中的 az container create 命令,將容器群組部署至新的虛擬網路或現有的虛擬網路。

重要

在虛擬網路中部署容器群組之前,建議您先檢查限制。 如需網路案例和限制,請參閱適用於 Azure 容器執行個體的虛擬網路案例和資源

重要

虛擬網路的容器群組部署已正式推出,適用於 Linux 和 Windows 容器,以及提供 Azure 容器執行個體的多數區域。 如需詳細資訊,請參閱可用區域

重要

2021-07-01 API 版本起,網路設定檔便已淘汰。 如果您使用此版本或更新版本,請忽略網路設定檔相關的任何步驟和動作。

本文中的範例會針對 Bash 殼層進行格式化。 如果您慣用其他殼層,例如 PowerShell 或命令提示字元,請相應調整行接續字元。

部署至新的虛擬網路

注意

如果您使用子網路 IP 範圍 /29,以具備僅 3 個 IP 位址。 我們建議一律高於某個範圍 (絕不低於)。 例如,使用子網路 IP 範圍 /28,讓每個容器群組至少可以有 1 個以上的 IP 緩衝區。 如此一來,您就可以避免容器停滯、無法啟動、重新啟動或甚至是無法停止狀態等狀況。

若要部署至新的虛擬網路,並讓 Azure 自動為您建立網路資源,請在執行 az container create 時指定下列項目:

  • 虛擬網路名稱
  • CIDR 格式的虛擬網路位址首碼
  • 子網路名稱
  • CIDR 格式的子網路位址首碼

虛擬網路及子網路位址首碼分別指定了虛擬網路及子網路的位址空間。 這些值會使用無類別網域間路由選擇 (CIDR) 標記法呈現,例如:10.0.0.0/16。 如需使用子網路的詳細資訊,請參閱新增、變更或刪除虛擬網路子網路

當您利用此方法部署了第一個容器群組後,就可以透過指定虛擬網路及子網路名稱,或是 Azure 自動為您建立的網路設定檔,來部署至同一個子網路。 因為 Azure 將該子網路委派至 Azure 容器執行個體,所以您「只」能將容器群組部署至子網路。

範例

下列 az container create 命令會為新的虛擬網路及子網路指定設定。 提供在虛擬網路中容器群組部署可用區域中所建立資源群組的名稱。 此命令會部署公用 Microsoft aci-helloworld 容器,該容器執行小型 Node.js 網頁伺服器來提供靜態網頁服務。 在下一節中,您會對同一個子網路部署第二個容器群組,並測試兩個容器執行個體之間的通訊。

az container create \
  --name appcontainer \
  --resource-group myResourceGroup \
  --image mcr.microsoft.com/azuredocs/aci-helloworld \
  --vnet aci-vnet \
  --vnet-address-prefix 10.0.0.0/16 \
  --subnet aci-subnet \
  --subnet-address-prefix 10.0.0.0/24

當您使用此方法部署至新的虛擬網路時,部署可能會花費幾分鐘建立網路資源。 經過初始部署後,其他對相同子網路的容器群組部署會更快完成。

部署至現有的虛擬網路

將容器群組部署至現有的虛擬網路:

  1. 在現有的虛擬網路內建立子網路、使用已部署容器群組的現有子網路,或使用已清空所有其他資源和設定的現有子網路。
  2. 使用 az container create 部署容器群組,並指定下列其中一項:
    • 虛擬網路名稱及子網路名稱
    • 虛擬網路資源識別碼與子網路資源識別碼,其允許使用不同資源群組中的虛擬網路
    • 網路設定檔名稱或識別碼,您可使用 az network profile list 取得

範例

下列範例會將第二個容器群組部署至先前建立的相同子網路,並確認兩個容器執行個體之間的通訊。

首先,取得您部署的第一個容器群組 IP 位址 appcontainer

az container show --resource-group myResourceGroup \
  --name appcontainer \
  --query ipAddress.ip --output tsv

輸出會顯示私人子網路中容器群組的 IP 位址。 例如:

10.0.0.4

現在,將 CONTAINER_GROUP_IP 設定為您用 az container show 命令擷取的 IP,然後執行下列 az container create 命令。 第二個容器 commchecker會執行以 Alpine Linux 為基礎的映像,並對第一個容器群組的私人子網路 IP 位址執行 wget

CONTAINER_GROUP_IP=<container-group-IP-address>

az container create \
  --resource-group myResourceGroup \
  --name commchecker \
  --image alpine:3.5 \
  --command-line "wget $CONTAINER_GROUP_IP" \
  --restart-policy never \
  --vnet aci-vnet \
  --subnet aci-subnet

當第二個容器部署完成之後,請提取其記錄,您便可以看見其執行的 wget 命令輸出:

az container logs --resource-group myResourceGroup --name commchecker

如果第二個容器已成功與第一個容器通訊,輸出會類似於:

Connecting to 10.0.0.4 (10.0.0.4:80)
index.html           100% |*******************************|  1663   0:00:00 ETA

記錄輸出應會顯示,wget 可以使用其區域子網路的私人 IP 位址從第一個容器連線及下載索引檔案。 兩個容器群組之間的網路流量會保留在虛擬網路中。

範例 - YAML

您也可以使用 YAML 檔案、Resource Manager 範本或其他程式設計方法,例如使用 Python SDK,以將容器群組部署至現有的虛擬網路。

例如,使用 YAML 檔案時,您可以使用委派給 Azure 容器執行個體的子網路來部署至虛擬網路。 指定下列屬性:

  • ipAddress:容器群組的私人 IP 位址設定。
    • ports:要開啟的連接埠 (如果有)。
    • protocol:已開啟連接埠的通訊協定 (TCP 或 UDP)。
  • subnetIds:用來部署的子網路資源識別碼
    • id:子網路的資源識別碼
    • name:子網路的名稱

此 YAML 會在虛擬網路中建立名為 appcontaineryaml 的容器群組。

apiVersion: '2021-07-01'
location: westus
name: appcontaineryaml
properties:
  containers:
  - name: appcontaineryaml
    properties:
      image: mcr.microsoft.com/azuredocs/aci-helloworld
      ports:
      - port: 80
        protocol: TCP
      resources:
        requests:
          cpu: 1.0
          memoryInGB: 1.5
  ipAddress:
    type: Private
    ports:
    - protocol: tcp
      port: '80'
  osType: Linux
  restartPolicy: Always
  subnetIds:
    - id: <subnet-id>
      name: default
tags: null
type: Microsoft.ContainerInstance/containerGroups

使用 az container create 命令部署容器群組,並針對 --file 參數指定 YAML 檔案名稱:

az container create --resource-group myResourceGroup \
  --file vnet-deploy-aci.yaml

部署完成後,請執行 az container show 命令來顯示其狀態。 範例輸出:

Name              ResourceGroup    Status    Image                                       IP:ports     Network    CPU/Memory       OsType    Location
----------------  ---------------  --------  ------------------------------------------  -----------  ---------  ---------------  --------  ----------
appcontaineryaml  myResourceGroup  Running   mcr.microsoft.com/azuredocs/aci-helloworld  10.0.0.5:80  Private    1.0 core/1.5 gb  Linux     westus

清除資源

刪除容器執行個體

當您使用完所建立的容器執行個體後,請使用下列命令將其刪除:

az container delete --resource-group myResourceGroup --name appcontainer -y
az container delete --resource-group myResourceGroup --name commchecker -y
az container delete --resource-group myResourceGroup --name appcontaineryaml -y

刪除網路資源

此功能目前需要額外使用幾項命令來刪除您先前建立的網路資源。 如果您使用了本文前幾節的範例命令來建立虛擬網路及子網路,您可以使用下列指令碼來刪除這些網路資源。 指令碼假設您的資源群組包含具有單一網路設定檔的單一虛擬網路。

在執行指令碼之前,請將變數 RES_GROUP 設定為包含應刪除虛擬網路及子網路的資源群組名稱。 如果您先前未使用建議的 aci-vnet 名稱,請更新虛擬網路的名稱。 此指令碼會針對 Bash 殼層加以格式化。 如果您慣用其他殼層,例如 PowerShell 或是命令提示字元,您需要相應調整變數指派及存取子。

警告

此指令碼會刪除資源! 它會刪除虛擬網路及內含的所有子網路。 在執行此指令碼之前,請先確認您已不再需要虛擬網路中的「任何」資源,包括內含的任何子網路。 一旦您刪除後,這些資源就無法復原

# Replace <my-resource-group> with the name of your resource group
# Assumes one virtual network in resource group
RES_GROUP=<my-resource-group>

# Get network profile ID
# Assumes one profile in virtual network
NETWORK_PROFILE_ID=$(az network profile list --resource-group $RES_GROUP --query [0].id --output tsv)

# Delete the network profile
az network profile delete --id $NETWORK_PROFILE_ID -y

# Delete virtual network
az network vnet delete --resource-group $RES_GROUP --name aci-vnet

下一步