コンテナー インスタンスを Azure 仮想ネットワークにデプロイする
Azure Virtual Network では、Azure リソースやオンプレミス リソースのセキュアなプライベート ネットワーキングが提供されます。 Azure 仮想ネットワークにコンテナー グループをデプロイすれば、それらのコンテナーで、仮想ネットワーク内の他のリソースと安全に通信することができます。
この記事では、Azure CLI で az container create コマンドを使用して、新しい仮想ネットワークまたは既存の仮想ネットワークにコンテナー グループを展開する方法について説明します。
重要
- 仮想ネットワークを使用する前にサブネットを委任する必要があります
- 仮想ネットワークにコンテナー グループをデプロイする前に、まず制限事項を確認することをお勧めします。 ネットワークのシナリオと制限事項については、Azure Container Instances の仮想ネットワークのシナリオとリソースに関するページを参照してください。
- 仮想ネットワークへのコンテナー グループのデプロイは、一般に Azure Container Instances が利用可能なほとんどのリージョンでは、Linux および Windows コンテナーで使用できます。 詳細については、「available-regions」を参照してください。
重要
ネットワーク プロファイルは、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"
}
新しい仮想ネットワークへのデプロイ
Note
サブネット IP 範囲 /29 を使用して 3 つの IP アドレスのみを持つ場合。 常に上記の 1 つの範囲に移動することをお勧めします (以下は行わない)。 たとえば、サブネット IP 範囲 /28 を使用すると、コンテナー グループごとに 1 つ以上の IP バッファーを使用できます。 こうすることで、スタックした状態、開始できない状態、起動できない状態、さらには停止できない状態のコンテナーも回避することができます。
新しい仮想ネットワークにデプロイして、ネットワーク リソースを自動的に作成するには、az container create を実行するときに次の項目を指定します。
- 仮想ネットワーク名
- 仮想ネットワーク アドレスのプレフィックス (CIDR 形式)
- サブネット名
- サブネット アドレスのプレフィックス (CIDR 形式)
仮想ネットワークとサブネットのアドレス プレフィックスでは、仮想ネットワークとサブネットそれぞれのアドレス空間を指定します。 これらの値は、CIDR (Classless Inter-domain Routing) 表記法で表されます (例: 10.0.0.0/16
)。 サブネットの操作について詳しくは、「仮想ネットワーク サブネットの追加、変更、削除」をご覧ください。
この方法で最初のコンテナー グループをデプロイしたら、仮想ネットワークとサブネット名、または Azure が自動的に作成するネットワーク プロファイルを指定して、同じサブネットにデプロイできます。 サブネットは Azure によって Azure Container Instances に委任されるので、サブネットにデプロイできるのは、コンテナー グループのみとなります。
例
次の az container create コマンドは、新しい仮想ネットワークとサブネットの設定を指定します。 仮想ネットワーク内のコンテナー グループのデプロイが利用できるリージョンで作成されたリソース グループの名前を指定します。 このコマンドにより、パブリックの Microsoft aci-helloworld コンテナーがデプロイされます。これは、静的 Web ページを提供する小規模な Node.js Web サーバーを実行するコンテナーです。 次のセクションでは、同じサブネットに 2 つ目のコンテナー グループをデプロイし、2 つのコンテナー インスタンス間の通信をテストします。
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 を使用してコンテナー グループをデプロイし、次のいずれかを指定します。
- 仮想ネットワーク名とサブネット名
- 仮想ネットワーク リソース ID、およびサブネット リソース ID (これにより、別のリソース グループから仮想ネットワークを使用できます)
YAML ファイルを使用したデプロイ
YAML ファイル、Resource Manager テンプレート、またはその他のプログラムによる方法 (Python SDK など) を使用して、既存の仮想ネットワークにコンテナーグループをデプロイすることもできます。
たとえば、YAML ファイルを使用する場合、Azure Container Instances に委任されたサブネットを持つ仮想ネットワークにデプロイできます。 次のプロパティを指定します。
ipAddress
: コンテナー グループのプライベート IP アドレス設定。ports
:開くポート (もしあれば)。protocol
:開いたポートのプロトコル (TCP または UDP)。
subnetIds
: デプロイ先のサブネットのリソース IDid
: サブネットのリソース IDname
: サブネットの名前
この YAML は、1 つのコンテナー グループを仮想ネットワーク内に作成します。 名前フィールドにコンテナー グループ名を、サブネット ID フィールドにサブネット ID を入力します。 名前には、appcontaineryaml を使用します。 サブネット ID を確認する必要があるが、以前の出力にアクセスできなくなった場合は、az container show コマンドを使用して確認できます。 subnetIds
の下の id
フィールドを探します。
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
コンテナー インスタンス間の通信を実演する
次の例では、前に作成した同じサブネットに 3 つ目のコンテナー グループをデプロイします。 Alpine Linux イメージを使用して、それ自体と最初のコンテナー インスタンスとの間の通信を検証します。
Note
ここで使用されている Alpine Linux イメージのようなパブリック Docker イメージをプルするためのレート制限が有効であるため、次の形式でエラーが発生する可能性があります。
(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."
まず、デプロイした 1 つ目のコンテナー グループ (appcontainer) の IP アドレスを取得します。
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
コマンドを実行します。 この 2 つ目のコンテナー (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
この 2 つ目のコンテナーのデプロイが完了したら、実行した wget
コマンドの出力を確認するために、ログをプルします。
az container logs --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_COMM_CHECKER_NAME
2 つ目のコンテナーが最初のコンテナーと正常に通信できた場合、出力は次のようになります。
Connecting to 10.0.0.4 (10.0.0.4:80)
index.html 100% |*******************************| 1663 0:00:00 ETA
ログ出力を見ると、wget
が最初のコンテナーに接続し、ローカル サブネット上のプライベート IP アドレスを使用して、最初のコンテナーからインデックス ファイルをダウンロードできたことがわかります。 2 つのコンテナー グループ間のネットワーク トラフィックは、仮想ネットワーク内に維持されたことになります。
リソースをクリーンアップする
これらのリソースを引き続き使用する予定がない場合は、Azure に料金が発生しないように削除できます。 az group delete コマンドを使用してリソース グループを削除することで、このガイドで使用したすべてのリソースをクリーンアップできます。 一度削除すると、それらのリソースを復旧することはできません。
次のステップ
Resource Manager テンプレートを使用して新しい仮想ネットワーク、サブネット、ネットワーク プロファイル、コンテナー グループをデプロイするには、仮想ネットワークを使用した Azure コンテナー グループの作成に関するページを参照してください。
プライベート エンドポイントを介して Azure Container Registry からイメージをプルできる Azure Container Instances をデプロイするには、「マネージド ID を使用した Azure Container Registry から Azure Container Instances へのデプロイ」を参照してください。