Freigeben über


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:

  1. 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.
  2. 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 sollen
    • id: Die Ressourcen-ID des Subnetzes
    • name: 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