Bereitstellen von Containerinstanzen in einem virtuellen Azure-Netzwerk
Das virtuelle Azure-Netzwerk (Azure Virtual Network) stellt ein sicheres, privates Netzwerk für Ihre Azure- und lokalen Ressourcen bereit. Durch die Bereitstellung von Containergruppen in einem virtuellen Azure-Netzwerk können Ihre Container sicher mit anderen Ressourcen im virtuellen Netzwerk kommunizieren.
In diesem Artikel wird gezeigt, wie Sie den Befehl az container create in der Azure CLI verwenden, um Containergruppen entweder in einem neuen oder in einem vorhandenen virtuellen Netzwerk bereitzustellen.
Wichtig
- Subnetze müssen vor der Verwendung eines virtuellen Netzwerks delegiert werden.
- Bevor Sie Containergruppen in virtuellen Netzwerken bereitstellen, sollten Sie zuerst die Einschränkung überprüfen. Netzwerkszenarien und Einschränkungen finden Sie unter Virtuelle Netzwerkszenarien und -ressourcen für Azure Container Instances.
- Die Bereitstellung von Containergruppen in einem virtuellen Netzwerk ist in den meisten Regionen, in denen Azure Container Instances verfügbar ist, für Linux- und Windows-Container allgemein verfügbar. Weitere Informationen finden Sie unter verfügbare Regionen.
Wichtig
Netzwerkprofile sind ab der API-Version 2021-07-01
veraltet. Wenn Sie diese oder eine neuere Version verwenden, ignorieren Sie alle Schritte und Aktionen, die sich auf Netzwerkprofile beziehen.
Beispiele in diesem Artikel sind für die Ausführung in der Bash-Shell formatiert. Wenn Sie eine andere Shell, wie PowerShell oder die Eingabeaufforderung bevorzugen, passen Sie die Zeilenfortsetzungszeichen entsprechend an.
Voraussetzungen
Definieren von Umgebungsvariablen
In dieser Anleitung werden für den automatisierten Bereitstellungspfad die folgenden Umgebungsvariablen und Ressourcennamen verwendet. Benutzer, die die Anleitung manuell durchgehen, können je nach Vorliebe ihre eigenen Variablen und Namen verwenden.
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"
Erstellen einer Ressourcengruppe
Sie benötigen eine Ressourcengruppe, um alle in den folgenden Beispielen verwendeten Ressourcen zu verwalten. Verwenden Sie zum Erstellen einer Ressourcengruppe az group create:
az group create --name $MY_RESOURCE_GROUP_NAME --location eastus
Ein erfolgreicher Vorgang sollte eine Ausgabe erzeugen, die dem folgenden JSON-Code ähnelt:
Ergebnisse:
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/resourceGroups/myACIResourceGroup123abc",
"location": "abcdef",
"managedBy": null,
"name": "myACIResourceGroup123",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null,
"type": "Microsoft.Resources/resourceGroups"
}
Bereitstellen von Containergruppen in einem neuen virtuellen Netzwerk
Hinweis
Wenn Sie den Subnetz-IP-Adressbereich /29 verwenden, um nur 3 IP-Adressen zu haben, wird empfohlen, immer einen Bereich darüber (nie darunter) zu verwenden. Verwenden Sie z. B. den Subnetz-IP-Adressbereich /28, damit Sie pro Containergruppe über mindestens einen IP-Puffer verfügen. Auf diese Weise können Sie vermeiden, dass Container nicht mehr reagieren, nicht starten oder nicht angehalten werden können.
Geben Sie beim Ausführen des Befehls az container create Folgendes an, um eine Bereitstellung in ein neues virtuelles Netzwerk durchzuführen und die Netzwerkressourcen von Azure erstellen zu lassen:
- Name des virtuellen Netzwerks
- Adresspräfix des virtuellen Netzwerks im CIDR-Format
- Subnetzname
- Adresspräfix des Subnetzes im CIDR-Format
Das virtuelle Netzwerk und die Adresspräfixe für das Subnetz geben die Adressräume für das virtuelle Netzwerk bzw. das Subnetz an. Diese Werte werden in CIDR-Schreibweise (Classless Inter-Domain Routing) dargestellt, z.B. 10.0.0.0/16
. Weitere Informationen zum Arbeiten mit Subnetzen finden Sie unter Hinzufügen, Ändern oder Löschen von Subnetzen virtueller Netzwerke.
Nachdem Sie Ihre erste Containergruppe mit dieser Methode bereitgestellt haben, können Sie Bereitstellungen für das gleiche Subnetz vornehmen, indem Sie die Namen des virtuellen Netzwerks und des Subnetzes oder Netzwerkprofil angeben, das Azure automatisch für Sie erstellt. Da Azure das Subnetz an Azure Container Instances delegiert, können Sie nur Containergruppen für das Subnetz bereitstellen.
Beispiel
Der folgende Befehl az container create gibt Einstellungen für ein neues virtuelles Netzwerk und Subnetz an. Geben Sie den Namen einer Ressourcengruppe an, die in einer Region erstellt wurde, in der Containergruppenbereitstellungen in einem virtuellen Netzwerk verfügbar sind. Dieser Befehl stellt den öffentlichen Microsoft-Container aci-helloworld bereit, der einen kleinen Node.js-Webserver ausführt. Dieser verarbeitet Anforderungen von einer statischen Webseite. Im nächsten Abschnitt stellen Sie eine zweite Containergruppe im gleichen Subnetz bereit und testen die Kommunikation zwischen den beiden Containerinstanzen.
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
Ein erfolgreicher Vorgang sollte eine Ausgabe erzeugen, die dem folgenden JSON-Code ähnelt:
Ergebnisse:
{
"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
}
Wenn Sie mit dieser Methode Bereitstellungen in einem neuen virtuellen Netzwerk ausführen, kann es einige Minuten dauern, bis die Netzwerkressourcen im Zuge der Bereitstellung erstellt werden. Nach der Erstbereitstellung werden weitere Bereitstellungen von Containergruppen im selben Subnetz schneller ausgeführt.
Bereitstellen von Containergruppen in einem vorhandenen virtuellen Netzwerk
Um eine Containergruppe in einem vorhandenen virtuellen Netzwerk bereitzustellen, gehen Sie wie folgt vor:
- Erstellen Sie ein Subnetz innerhalb Ihres vorhandenen virtuellen Netzwerks, verwenden Sie ein vorhandenes Subnetz, in dem bereits eine Containergruppe bereitgestellt ist, oder verwenden Sie ein vorhandenes Subnetz, aus dem alle anderen Ressourcen und die Konfiguration entfernt wurden. Das Subnetz, das Sie für Containergruppen verwenden, darf nur Containergruppen enthalten. Bevor Sie eine Containergruppe in einem Subnetz bereitstellen, müssen Sie das Subnetz explizit delegieren. Nach erfolgter Delegierung kann das Subnetz nur für Containergruppen verwendet werden. Wenn Sie versuchen, andere Ressourcen als Containergruppen für ein delegiertes Subnetz bereitzustellen, tritt ein Fehler beim Vorgang auf.
- Stellen Sie eine Containergruppe mit az container create bereit, und geben Sie eine der folgenden Informationen an:
- Name des virtuellen Netzwerks und des Subnetzes
- VNET-Ressourcen-ID und Subnetzressourcen-ID, um die Verwendung eines virtuellen Netzwerks über eine andere Ressourcengruppe zu ermöglichen
Bereitstellen mithilfe einer YAML-Datei
Sie können auch mithilfe einer YAML-Datei, einer Resource Manager-Vorlage oder einer anderen programmgesteuerten Methode wie dem Python-SKD eine Containergruppe in einem vorhandenen virtuellen Netzwerk bereitstellen.
Wenn Sie z. B. eine YAML-Datei verwenden, können Sie sie in einem virtuellen Netzwerk mit einem Subnetz bereitstellen, das an Azure Container Instances delegiert ist. Geben Sie die folgenden Eigenschaften an:
ipAddress
: Die privaten IP-Adresseinstellungen für die Containergruppe.ports
: Die zu öffnenden Ports, sofern vorhanden.protocol
: Das Protokoll (TCP oder UDP) für den geöffneten Port.
subnetIds
: Die Ressourcen-IDs der Subnetze, die bereitgestellt werden sollenid
: Die Ressourcen-ID des Subnetzesname
: Der Name des Subnetzes
Dieser YAML-Code erstellt eine Containergruppe in Ihrem virtuellen Netzwerk. Geben Sie den Namen Ihrer Containergruppe in die Namensfelder und Ihre Subnetz-ID in das Feld „Subnetz-ID” ein. Wir verwenden appcontaineryaml für den Namen. Wenn Sie Ihre Subnetz-ID finden müssen und keinen Zugriff mehr auf vorherige Ausgaben haben, können Sie den Befehl az container show zum Anzeigen verwenden. Suchen Sie unter subnetIds
nach dem Feld 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
Der folgende Bash-Befehl ist für den automatisierten Bereitstellungspfad vorgesehen.
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
Stellen Sie die Containergruppe mit dem Befehl az container create bereit, wobei Sie den YAML-Dateinamen als Parameter --file
angeben:
az container create --resource-group $MY_RESOURCE_GROUP_NAME \
--file container-instances-vnet.yaml
Der folgende Bash-Befehl ist für den automatisierten Bereitstellungspfad vorgesehen.
rm container-instances-vnet.yaml
Führen Sie den Befehl az container show aus, sobald die Bereitstellung abgeschlossen ist, um den Status anzuzeigen.
az container list --resource-group $MY_RESOURCE_GROUP_NAME --output table
Die Ausgabe sollte wie das folgende Beispiel aussehen:
Ergebnisse:
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
Veranschaulichen der Kommunikation zwischen Containerinstanzen
Im folgenden Beispiel wird eine dritte Containergruppe in dem zuvor erstellten Subnetz bereitgestellt. Mit einem Alpine Linux-Image wird die Kommunikation zwischen ihr selbst und der ersten Containerinstanz überprüft.
Hinweis
Aufgrund der geltenden Ratenbegrenzung für das Abrufen öffentlicher Docker-Images wie das hier verwendete Alpine Linux erhalten Sie möglicherweise eine Fehlermeldung in folgender Form:
(RegistryErrorResponse) Eine Fehlerantwort wird von der Docker-Registrierung „index.docker.io” empfangen. Versuchen Sie es später noch mal. Code: RegistryErrorResponse Meldung: Eine Fehlerantwort wird von der Docker-Registrierung „index.docker.io” empfangen. Versuchen Sie es später noch mal.
Der folgende Bash-Befehl ist für den automatisierten Bereitstellungspfad vorgesehen.
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."
Rufen Sie zuerst die IP-Adresse der ersten Containergruppe ab, die Sie bereitgestellt haben, d.h. von appcontainer:
az container show --resource-group $MY_RESOURCE_GROUP_NAME \
--name $MY_APP_CONTAINER_NAME \
--query ipAddress.ip --output tsv
Die Ausgabe zeigt die IP-Adresse der Containergruppe im privaten Subnetz an. Zum Beispiel:
Ergebnisse:
10.0.0.4
Legen Sie jetzt CONTAINER_GROUP_IP
auf die IP-Adresse fest, die Sie mit dem Befehl az container show
abgerufen haben, und führen Sie den folgenden az container create
-Befehl aus. Der zweite Container commchecker führt ein Alpine Linux-basiertes Image sowie wget
für die erste private Subnetz-IP-Adresse der Containergruppe aus.
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
Nach der zweiten Containerbereitstellung werden die jeweiligen Protokolle abgerufen, sodass Sie die Ausgabe des Befehls wget
, der ausgeführt wurde, sehen können:
az container logs --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_COMM_CHECKER_NAME
Wenn der zweite Container erfolgreich eine Kommunikation mit dem ersten Container aufgebaut hat, sieht die Ausgabe ähnlich wie im folgendem Beispiel aus:
Connecting to 10.0.0.4 (10.0.0.4:80)
index.html 100% |*******************************| 1663 0:00:00 ETA
Die Protokollausgabe sollte zeigen, dass wget
eine Verbindung herstellen und die Indexdatei aus dem ersten Container mithilfe der privaten IP-Adresse im lokalen Subnetz herunterladen konnte. Der Netzwerkdatenverkehr zwischen den zwei Containergruppen fand innerhalb des virtuellen Netzwerks statt.
Bereinigen von Ressourcen
Wenn Sie nicht beabsichtigen, diese Ressourcen weiterhin zu verwenden, können Sie sie löschen, um Azure-Gebühren zu vermeiden. Sie können alle Ressourcen, die Sie in dieser Anleitung verwendet haben, bereinigen, indem Sie die Ressourcengruppe mit dem Befehl az group delete löschen. Einmal gelöscht, können diese Ressourcen nicht mehr wiederhergestellt werden.
Nächste Schritte
Informationen zum Bereitstellen eines neuen virtuellen Netzwerks, eines Subnetzes, eines Netzwerkprofils und einer Containergruppe mithilfe einer Resource Manager-Vorlage finden Sie unter Erstellen einer Azure-Containergruppe mit einem virtuellen Netzwerk.
Informationen zum Bereitstellen von Azure Container Instances, die Images aus Azure Container Registry über einen privaten Endpunkt abrufen können, finden Sie unter Bereitstellen in Azure Container Instances aus Azure Container Registry mit einer verwalteten Identität.