將容器執行個體部署至 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
當您使用此方法部署至新的虛擬網路時,部署可能會花費幾分鐘建立網路資源。 經過初始部署後,其他對相同子網路的容器群組部署會更快完成。
部署至現有的虛擬網路
將容器群組部署至現有的虛擬網路:
- 請在現有的虛擬網路內建立子網域、使用已部署容器群組的現有子網域,或使用已清空「所有」其他資源和設定的現有子網域。用於容器群組的子網域只能包含容器群組。 將容器群組部署至子網域之前,您必須先明確委派子網域,然後才能佈建。 委派之後,子網路只能用於容器群組。 如果您嘗試將容器群組以外的資源部署至委派子網路,該作業會失敗。
- 使用 az container create 部署容器群組,並指定下列其中一項:
- 虛擬網路名稱及子網路名稱
- 虛擬網路資源識別碼與子網路資源識別碼,其允許使用不同資源群組中的虛擬網路
範例
下列範例會將第二個容器群組部署至先前建立的相同子網路,並確認兩個容器執行個體之間的通訊。
首先,取得您部署的第一個容器群組 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
下一步
若要使用 Resource Manager 範本部署新的虛擬網路、子網路、網路設定檔及容器群組,請參閱 Create an Azure container group with VNet (使用 VNet 建立 Azure 容器群組)。
若要部署可透過私人端點從 Azure Container Registry 提取映像的 Azure 容器執行個體,請參閱使用受控識別,從 Azure Container Registry 部署至 Azure 容器執行個體。