將容器執行個體部署至 Azure 虛擬網路
Azure 虛擬網路會為 Azure 資源和內部部署資源提供安全的私人網路。 透過將容器群組部署至 Azure 虛擬網路,您的容器可在虛擬網路中安全地與其他資源通訊。
本文說明如何使用 Azure CLI 中的 az container create 命令,將容器群組部署至新的虛擬網路或現有的虛擬網路。
重要
- 使用虛擬網路之前,必須先委派子網域
- 在虛擬網路中部署容器群組之前,建議您先檢查限制。 如需網路案例和限制,請參閱適用於 Azure 容器執行個體的虛擬網路案例和資源。
- 虛擬網路的容器群組部署已正式推出,適用於 Linux 和 Windows 容器,以及提供 Azure 容器執行個體的多數區域。 如需詳細資訊,請參閱可用區域。
重要
自 2021-07-01
API 版本起,網路設定檔便已淘汰。 如果您使用此版本或更新版本,請忽略網路設定檔相關的任何步驟和動作。
本文中的範例會針對 Bash 殼層進行格式化。 如果您慣用其他殼層,例如 PowerShell 或命令提示字元,請相應調整行接續字元。
必要條件
定義環境變數
在整個指南中,自動化部署路徑會使用下列環境變數和資源名稱。 用戶手動完成指南,可以使用自己的變數和名稱作為慣用。
export RANDOM_ID="$(openssl rand -hex 3)"
export MY_RESOURCE_GROUP_NAME="myACIResourceGroup$RANDOM_ID"
export MY_VNET_NAME="aci-vnet"
export MY_SUBNET_NAME="aci-subnet"
export MY_SUBNET_ID="/subscriptions/$(az account show --query id --output tsv)/resourceGroups/$MY_RESOURCE_GROUP_NAME/providers/Microsoft.Network/virtualNetworks/$MY_VNET_NAME/subnets/$MY_SUBNET_NAME"
export MY_APP_CONTAINER_NAME="appcontainer"
export MY_COMM_CHECKER_NAME="commchecker"
export MY_YAML_APP_CONTAINER_NAME="appcontaineryaml"
建立資源群組
您需要資源群組來管理下列範例中使用的所有資源。 若要建立資源群組,請使用 az group create:
az group create --name $MY_RESOURCE_GROUP_NAME --location eastus
成功的作業應該會產生類似下列 JSON 的輸出:
結果:
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/resourceGroups/myACIResourceGroup123abc",
"location": "abcdef",
"managedBy": null,
"name": "myACIResourceGroup123",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null,
"type": "Microsoft.Resources/resourceGroups"
}
部署至新的虛擬網路
注意
如果您使用子網路 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 $MY_APP_CONTAINER_NAME \
--resource-group $MY_RESOURCE_GROUP_NAME \
--image mcr.microsoft.com/azuredocs/aci-helloworld \
--vnet $MY_VNET_NAME \
--vnet-address-prefix 10.0.0.0/16 \
--subnet $MY_SUBNET_NAME \
--subnet-address-prefix 10.0.0.0/24
成功的作業應該會產生類似下列 JSON 的輸出:
結果:
{
"confidentialComputeProperties": null,
"containers": [
{
"command": null,
"environmentVariables": [],
"image": "mcr.microsoft.com/azuredocs/aci-helloworld",
"instanceView": {
"currentState": {
"detailStatus": "",
"exitCode": null,
"finishTime": null,
"startTime": "0000-00-00T00:00:00.000000+00:00",
"state": "Running"
},
"events": [
{
"count": 1,
"firstTimestamp": "0000-00-00T00:00:00+00:00",
"lastTimestamp": "0000-00-00T00:00:00+00:00",
"message": "Successfully pulled image \"mcr.microsoft.com/azuredocs/aci-helloworld@sha256:0000000000000000000000000000000000000000000000000000000000000000\"",
"name": "Pulled",
"type": "Normal"
},
{
"count": 1,
"firstTimestamp": "0000-00-00T00:00:00+00:00",
"lastTimestamp": "0000-00-00T00:00:00+00:00",
"message": "pulling image \"mcr.microsoft.com/azuredocs/aci-helloworld@sha256:0000000000000000000000000000000000000000000000000000000000000000\"",
"name": "Pulling",
"type": "Normal"
},
{
"count": 1,
"firstTimestamp": "0000-00-00T00:00:00+00:00",
"lastTimestamp": "0000-00-00T00:00:00+00:00",
"message": "Started container",
"name": "Started",
"type": "Normal"
}
],
"previousState": null,
"restartCount": 0
},
"livenessProbe": null,
"name": "appcontainer",
"ports": [
{
"port": 80,
"protocol": "TCP"
}
],
"readinessProbe": null,
"resources": {
"limits": null,
"requests": {
"cpu": 1.0,
"gpu": null,
"memoryInGb": 1.5
}
},
"securityContext": null,
"volumeMounts": null
}
],
"diagnostics": null,
"dnsConfig": null,
"encryptionProperties": null,
"extensions": null,
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/resourceGroups/myACIResourceGroup123/providers/Microsoft.ContainerInstance/containerGroups/appcontainer",
"identity": null,
"imageRegistryCredentials": null,
"initContainers": [],
"instanceView": {
"events": [],
"state": "Running"
},
"ipAddress": {
"autoGeneratedDomainNameLabelScope": null,
"dnsNameLabel": null,
"fqdn": null,
"ip": "10.0.0.4",
"ports": [
{
"port": 80,
"protocol": "TCP"
}
],
"type": "Private"
},
"location": "eastus",
"name": "appcontainer",
"osType": "Linux",
"priority": null,
"provisioningState": "Succeeded",
"resourceGroup": "myACIResourceGroup123abc",
"restartPolicy": "Always",
"sku": "Standard",
"subnetIds": [
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/resourceGroups/myACIResourceGroup123/providers/Microsoft.Network/virtualNetworks/aci-vnet/subnets/aci-subnet",
"name": null,
"resourceGroup": "myACIResourceGroup123abc"
}
],
"tags": {},
"type": "Microsoft.ContainerInstance/containerGroups",
"volumes": null,
"zones": null
}
當您使用此方法部署至新的虛擬網路時,部署可能會花費幾分鐘建立網路資源。 經過初始部署後,其他對相同子網路的容器群組部署會更快完成。
部署至現有的虛擬網路
將容器群組部署至現有的虛擬網路:
- 在現有的虛擬網路內建立子網路、使用已部署容器群組的現有子網路,或使用已清空所有其他資源和設定的現有子網路。 您用於容器群組的子網路只能包含容器群組。 將容器群組部署至子網域之前,您必須先明確委派子網域,然後才能佈建。 委派之後,子網路只能用於容器群組。 如果您嘗試將容器群組以外的資源部署至委派子網路,該作業會失敗。
- 使用 az container create 部署容器群組,並指定下列其中一項:
- 虛擬網路名稱及子網路名稱
- 虛擬網路資源識別碼與子網路資源識別碼,其允許使用不同資源群組中的虛擬網路
使用 YAML 檔案進行部署
您也可以使用 YAML 檔案、Resource Manager 範本或其他程式設計方法,例如使用 Python SDK,以將容器群組部署至現有的虛擬網路。
例如,使用 YAML 檔案時,您可以使用委派給 Azure 容器執行個體的子網路來部署至虛擬網路。 指定下列屬性:
ipAddress
:容器群組的私人 IP 位址設定。ports
:要開啟的連接埠 (如果有)。protocol
:已開啟連接埠的通訊協定 (TCP 或 UDP)。
subnetIds
:用來部署的子網路資源識別碼id
:子網路的資源識別碼name
:子網路的名稱
此 YAML 會在虛擬網路中建立容器群組。 在 [名稱] 欄位中輸入您的容器組名,並在 [子網標識符] 字段中輸入您的子網標識符。 我們將appcontaineryaml用於名稱。 如果您需要尋找子網標識符,且無法再存取先前的輸出,您可以使用 az container show 命令來檢視它。 id
尋找 底下的subnetIds
欄位。
apiVersion: '2021-07-01'
location: eastus
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
下列 Bash 命令適用於自動化部署路徑。
echo -e "apiVersion: '2021-07-01'\nlocation: eastus\nname: $MY_YAML_APP_CONTAINER_NAME\nproperties:\n containers:\n - name: $MY_YAML_APP_CONTAINER_NAME\n properties:\n image: mcr.microsoft.com/azuredocs/aci-helloworld\n ports:\n - port: 80\n protocol: TCP\n resources:\n requests:\n cpu: 1.0\n memoryInGB: 1.5\n ipAddress:\n type: Private\n ports:\n - protocol: tcp\n port: '80'\n osType: Linux\n restartPolicy: Always\n subnetIds:\n - id: $MY_SUBNET_ID\n name: default\ntags: null\ntype: Microsoft.ContainerInstance/containerGroups" > container-instances-vnet.yaml
使用 az container create 命令部署容器群組,並針對 --file
參數指定 YAML 檔案名稱:
az container create --resource-group $MY_RESOURCE_GROUP_NAME \
--file container-instances-vnet.yaml
下列 Bash 命令適用於自動化部署路徑。
rm container-instances-vnet.yaml
部署完成後,請執行 az container show 命令以顯示其狀態:
az container list --resource-group $MY_RESOURCE_GROUP_NAME --output table
輸出應該類似下列範例:
結果:
Name ResourceGroup Status Image IP:ports Network CPU/Memory OsType Location
---------------- ------------------------ --------- ------------------------------------------ -------------- --------- --------------- -------- ----------
appcontainer myACIResourceGroup123abc Succeeded mcr.microsoft.com/azuredocs/aci-helloworld 10.0.0.4:80,80 Private 1.0 core/1.5 gb Linux abcdef
appcontaineryaml myACIResourceGroup123abc Succeeded mcr.microsoft.com/azuredocs/aci-helloworld 10.0.0.5:80,80 Private 1.0 core/1.5 gb Linux abcdef
示範容器實例之間的通訊
下列範例會將第三個容器群組部署到先前建立的相同子網。 使用Alpine Linux映像,它會驗證本身與第一個容器實例之間的通訊。
注意
由於提取公用 Docker 映射的速率限制,例如此處使用的 Alpine Linux 映射,您可能會收到下列格式的錯誤:
(RegistryErrorResponse)從 docker 登錄 'index.docker.io' 收到錯誤回應。 請稍後重試。 程序代碼:RegistryErrorResponse 訊息:從 docker 登錄 'index.docker.io' 收到錯誤回應。 請稍後重試。
下列 Bash 命令適用於自動化部署路徑。
echo -e "Due to rate limiting in effect for pulling public Docker images like the Alpine Linux one used here, you may receive an error in the form:\n\n(RegistryErrorResponse) An error response is received from the docker registry 'index.docker.io'. Please retry later.\nCode: RegistryErrorResponse\nMessage: An error response is received from the docker registry 'index.docker.io'. Please retry later.\n\nIf this occurs, the automated deployment will exit. You can try again or go to the end of the guide to see instructions for cleaning up your resources."
首先,取得您部署的第一個容器群組 IP 位址 appcontainer:
az container show --resource-group $MY_RESOURCE_GROUP_NAME \
--name $MY_APP_CONTAINER_NAME \
--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
。
az container create \
--resource-group $MY_RESOURCE_GROUP_NAME \
--name $MY_COMM_CHECKER_NAME \
--image alpine:3.4 \
--command-line "wget 10.0.0.4" \
--restart-policy never \
--vnet $MY_VNET_NAME \
--subnet $MY_SUBNET_NAME
當第二個容器部署完成之後,請提取其記錄,您便可以看見其執行的 wget
命令輸出:
az container logs --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_COMM_CHECKER_NAME
如果第二個容器已成功與第一個容器通訊,輸出會類似於:
Connecting to 10.0.0.4 (10.0.0.4:80)
index.html 100% |*******************************| 1663 0:00:00 ETA
記錄輸出應會顯示,wget
可以使用其區域子網路的私人 IP 位址從第一個容器連線及下載索引檔案。 兩個容器群組之間的網路流量會保留在虛擬網路中。
清除資源
如果您不打算繼續使用這些資源,可以刪除它們以避免 Azure 費用。 您可以使用 az group delete 命令來刪除資源群組,以清除本指南中使用的所有資源。 一旦您刪除後,這些資源就無法復原。
下一步
若要使用 Resource Manager 範本部署新的虛擬網路、子網路、網路設定檔及容器群組,請參閱使用虛擬網路建立 Azure 容器群組。
若要部署可透過私人端點從 Azure Container Registry 提取映像的 Azure 容器執行個體,請參閱使用受控識別,從 Azure Container Registry 部署至 Azure 容器執行個體。