Partager via


Déployer des instance de conteneur dans un réseau virtuel Azure

Un réseau virtuel Azure fournit un accès réseau privé et sécurisé à vos ressources Azure et locales. En déployant des groupes de conteneurs dans un réseau virtuel Azure, vos conteneurs peuvent communiquer en toute sécurité avec d’autres ressources dans le réseau virtuel.

Cet article explique comment utiliser la commande az container create dans Azure CLI pour déployer des groupes de conteneurs sur un réseau virtuel nouveau ou existant.

Important

  • Les sous-réseaux doivent être délégués avant d’utiliser un réseau virtuel
  • Avant de déployer des groupes de conteneurs dans des réseaux virtuels, nous vous suggérons de vérifier au préalable la limitation. Pour les scénarios et les limitations de mise en réseau, consultez Ressources et scénarios relatifs aux réseaux virtuels pour Azure Container Instances.
  • Le déploiement d’un groupe de conteneurs sur un réseau virtuel est généralement disponible pour les conteneurs Linux et Windows, dans la plupart des régions où Azure Container Instances est disponible. Pour plus d’informations, consultez Régions disponibles.

Important

Les profils réseau ont été retirés depuis la version 2021-07-01 de l’API. Si vous utilisez cette version ou une version plus récente, ignorez les étapes et actions relatives aux profils réseau.

Les exemples présentés dans cet article sont mis en forme pour l’interpréteur de commandes Bash. Si vous préférez un autre interpréteur de commandes comme PowerShell ou l’invite de commande, modifiez les caractères de continuation de ligne en conséquence.

Prérequis

Définissez des variables d’environnement

Le parcours de déploiement automatisé utilise les variables d’environnement et les noms de ressources suivants dans ce guide. Les utilisateurs qui utilisent le guide manuellement peuvent utiliser, au choix, leurs propres variables et noms.

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"

Créer un groupe de ressources

Vous avez besoin d’un groupe de ressources pour gérer toutes les ressources utilisées dans les exemples suivants. Pour créer un groupe de ressources, utilisez az group create :

az group create --name $MY_RESOURCE_GROUP_NAME --location eastus

Une opération réussie doit produire une sortie similaire au code JSON suivant :

Résultats :

{
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/resourceGroups/myACIResourceGroup123abc",
  "location": "abcdef",
  "managedBy": null,
  "name": "myACIResourceGroup123",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}

Déployer dans un nouveau réseau virtuel

Remarque

Si vous utilisez la plage d’adresses IP de sous-réseau /29 pour avoir seulement 3 adresses IP, nous vous recommandons de toujours aller une plage au-dessus (jamais en dessous). Par exemple, utilisez la plage d’adresses IP de sous-réseau /28 pour disposer d’au moins un tampon IP ou plus par groupe de conteneurs. En procédant ainsi, vous pouvez éviter que les conteneurs soient bloqués, ne puissent pas démarrer, redémarrer ou s’arrêter.

Pour déployer dans un nouveau réseau virtuel et laisser Azure créer automatiquement les ressources réseau, spécifiez les éléments suivants lorsque vous exécutez as container create :

  • Nom du réseau virtuel
  • Préfixe d’adresse de réseau virtuel au format CIDR
  • Nom du sous-réseau
  • Préfixe d’adresse de sous-réseau au format CIDR

Le réseau virtuel et les préfixes d’adresse de sous-réseau spécifient les espaces d’adressage du réseau virtuel et du sous-réseau, respectivement. Ces valeurs sont représentées en notation CIDR (Classless Inter-domain Routing), par exemple 10.0.0.0/16. Pour plus d’informations sur l’utilisation des sous-réseaux, consultez Ajouter, modifier ou supprimer un sous-réseau de réseau virtuel.

Une fois que vous avez déployé votre premier groupe de conteneurs avec cette méthode, vous pouvez effectuer le déploiement sur le même sous-réseau en spécifiant les noms de réseau virtuel et de sous-réseau, ou le profil réseau qu’Azure crée automatiquement pour vous. Comme Azure délègue le sous-réseau à Azure Container Instances, vous ne pouvez déployer que des groupes de conteneurs dans le sous-réseau.

Exemple

La commande az container create suivante spécifie les paramètres pour un nouveau réseau virtuel et un nouveau sous-réseau. Fournissez le nom d’un groupe de ressources créé dans une région où des déploiements de groupe de conteneurs dans un réseau virtuel sont disponibles. Cette commande déploie le conteneur Microsoft aci-helloworld public qui exécute un petit serveur web Node.js qui gère une page web statique. Dans la section suivante, vous allez déployer un deuxième groupe de conteneurs dans le même sous-réseau et tester la communication entre les deux instances de conteneur.

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

Une opération réussie doit produire une sortie similaire au code JSON suivant :

Résultats :

{
  "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
}

Lorsque vous déployez dans un nouveau réseau virtuel avec cette méthode, l’opération peut prendre quelques minutes, le temps de créer les ressources réseau. Après le déploiement initial, les déploiements suivants de groupes de conteneurs sur le même sous-réseau s’effectuent plus rapidement.

Déployer dans un réseau virtuel existant

Pour déployer un groupe de conteneurs dans un réseau virtuel existant :

  1. Créez un sous-réseau au sein de votre réseau virtuel existant, utilisez un sous-réseau existant dans lequel un groupe de conteneurs est déjà déployé, ou utilisez un sous-réseau existant vide de toute autre ressource et configuration. Le sous-réseau que vous utilisez pour les groupes de conteneurs peut contenir des groupes de conteneurs uniquement. Avant de déployer un groupe de conteneurs sur un sous-réseau, vous devez déléguer explicitement le sous-réseau avant l’approvisionnement. Une fois délégué, le sous-réseau ne peut être utilisé que pour les groupes de conteneur. Si vous tentez de déployer des ressources autres que des groupes de conteneurs dans un sous-réseau délégué, l’opération échoue.
  2. Déployez un groupe de conteneurs avec az container create et spécifiez un des éléments suivants :
    • Nom du réseau virtuel et nom du sous-réseau
    • ID de ressource de réseau virtuel et ID de ressource de sous-réseau, ce qui permet d’utiliser un réseau virtuel d’un groupe de ressources différent

Déployer à l’aide d’un fichier YAML

Vous pouvez également déployer un groupe de conteneurs sur un réseau virtuel existant en utilisant un fichier YAML, un modèle Resource Manager ou une autre méthode de programmation, telle que le Kit de développement logiciel (SDK) Python.

Par exemple, lors de l’utilisation d’un fichier YAML, vous pouvez effectuer un déploiement sur un réseau virtuel avec un sous-réseau délégué à Azure Container Instances. Spécifiez les propriétés suivantes :

  • ipAddress : paramètres d’adresse IP privée pour le groupe de conteneurs.
    • ports: ports à ouvrir, le cas échéant.
    • protocol: protocole (TCP ou UDP) du port ouvert.
  • subnetIds : ID de ressource des sous-réseaux sur lesquels effectuer le déploiement
    • id : ID de ressource du sous-réseau.
    • name : nom du sous-réseau.

Ce YAML crée un groupe de conteneurs dans votre réseau virtuel. Entrez le nom de votre groupe de conteneurs dans les champs de nom et votre ID de sous-réseau dans le champ ID de sous-réseau. Nous utilisons appcontaineryaml comme nom. Si vous avez besoin de trouver votre ID de sous-réseau et que vous n’avez plus accès aux sorties précédentes, vous pouvez utiliser la commande az container show pour l’afficher. Recherchez le champ id sous 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

La commande Bash suivante concerne le parcours de déploiement automatisé.

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

Déployez le groupe de conteneurs avec la commande az container create, en spécifiant le nom du fichier YAML dans le paramètre --file :

az container create --resource-group $MY_RESOURCE_GROUP_NAME \
  --file container-instances-vnet.yaml

La commande Bash suivante concerne le parcours de déploiement automatisé.

rm container-instances-vnet.yaml

Une fois le déploiement effectué, exécutez la commande az container show pour afficher son état :

az container list --resource-group $MY_RESOURCE_GROUP_NAME --output table

La sortie doit ressembler à l’exemple ci-dessous :

Résultats :

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

Illustrer la communication entre les instances de conteneur

L’exemple suivant déploie un troisième groupe de conteneurs sur le même sous-réseau créé précédemment. En utilisant une image Alpine Linux, il vérifie la communication entre lui-même et la première instance de conteneur.

Remarque

En raison de la limitation de débit en vigueur pour l’extraction d’images Docker publiques comme l’Alpine Linux utilisée ici, vous pouvez recevoir une erreur dans le formulaire :

(RegistryErrorResponse) Une réponse d’erreur est reçue du registre Docker « index.docker.io ». Veuillez réessayer ultérieurement. Code : Message RegistryErrorResponse : une réponse d’erreur est reçue du registre Docker « index.docker.io ». Veuillez réessayer ultérieurement.

La commande Bash suivante concerne le parcours de déploiement automatisé.

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."

Tout d’abord, obtenez l’adresse IP du premier groupe de conteneurs déployé, appcontainer :

az container show --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $MY_APP_CONTAINER_NAME \
  --query ipAddress.ip --output tsv

La sortie affiche l’adresse IP du groupe de conteneurs dans le sous-réseau privé. Par exemple :

Résultats :

10.0.0.4

Maintenant, attribuez à CONTAINER_GROUP_IP l’adresse IP que vous avez récupérée avec la commande az container show et exécutez la commande suivante az container create. Ce deuxième conteneur, commchecker, utilise une image Linux Alpine et exécute wget sur l’adresse IP du sous-réseau privé du premier groupe de conteneurs.

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

Après ce deuxième déploiement de conteneur, effectuez une extraction des journaux correspondants pour voir la sortie de la commande wget qu’il a exécutée :

az container logs --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_COMM_CHECKER_NAME

Si le deuxième conteneur a correctement communiqué avec le premier, la sortie doit être similaire à ceci :

Connecting to 10.0.0.4 (10.0.0.4:80)
index.html           100% |*******************************|  1663   0:00:00 ETA

La sortie du journal doit montrer que wget a réussie à se connecter le fichier d’index et à le télécharger à partir du premier conteneur à l’aide de son adresse IP privée dans le sous-réseau local. Le trafic réseau entre les deux groupes de conteneurs est resté dans le réseau virtuel.

Nettoyer les ressources

Si vous n’envisagez pas de continuer à utiliser ces ressources, vous pouvez les supprimer pour éviter des frais Azure. Vous pouvez nettoyer toutes les ressources que vous avez utilisées dans ce guide en supprimant le groupe de ressources avec la commande az group delete. Une fois supprimées, ces ressources sont irrécupérables.

Étapes suivantes