Didacticiel : Créer une image personnalisée et l’exécuter dans App Service à partir d’un Registre privéTutorial: Build a custom image and run in App Service from a private registry

App Service fournit des images Docker intégrées sur Linux avec prise en charge de versions spécifiques, telles que PHP 7.3 et Node.js 10.14.App Service provides built-in Docker images on Linux with support for specific versions, such as PHP 7.3 and Node.js 10.14. App Services utilise la technologie de conteneur Docker pour héberger à la fois des images intégrées et des images personnalisées en tant que service PaaS (platform as a service).App Service uses the Docker container technology to host both built-in images and custom images as a platform as a service. Dans ce tutoriel, vous allez apprendre à créer une image personnalisée et à l’exécuter dans App Service.In this tutorial, you learn how to build a custom image and run it in App Service. Ce modèle est utile quand les images intégrées n’incluent pas la langue de votre choix ou quand votre application nécessite une configuration spécifique qui n’est pas fournie dans les images intégrées.This pattern is useful when the built-in images don't include your language of choice, or when your application requires a specific configuration that isn't provided within the built-in images.

Ce tutoriel vous montre comment effectuer les opérations suivantes :In this tutorial, you learn how to:

  • Déployer une image personnalisée dans un Registre de conteneurs privéDeploy a custom image to a private container registry
  • Exécuter l’image personnalisée dans App ServiceRun the custom image in App Service
  • Configuration des variables d’environnementConfigure environment variables
  • Mettre à jour et redéployer l’imageUpdate and redeploy the image
  • Accéder aux journaux de diagnosticAccess diagnostic logs
  • Se connecter au conteneur avec SSHConnect to the container using SSH

Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.If you don't have an Azure subscription, create a free account before you begin.

PrérequisPrerequisites

Pour suivre ce didacticiel, vous avez besoin des éléments suivants :To complete this tutorial, you need:

Télécharger l’exempleDownload the sample

Dans une fenêtre de terminal, exécutez la commande ci-après pour cloner le référentiel de l’exemple d’application sur votre ordinateur local, puis accédez au répertoire contenant l’exemple de code.In a terminal window, run the following command to clone the sample app repository to your local machine, then change to the directory that contains the sample code.

git clone https://github.com/Azure-Samples/docker-django-webapp-linux.git --config core.autocrlf=input
cd docker-django-webapp-linux

Créer l’image à partir du fichier DockerBuild the image from the Docker file

Dans le dépôt Git, examinez Dockerfile.In the Git repository, take a look at Dockerfile. Ce fichier décrit l’environnement Python exigé pour exécuter votre application.This file describes the Python environment that is required to run your application. En outre, l’image définit un serveur SSH pour sécuriser la communication entre le conteneur et l’hôte.Additionally, the image sets up an SSH server for secure communication between the container and the host.

FROM python:3.4

RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/

# ssh
ENV SSH_PASSWD "root:Docker!"
RUN apt-get update \
        && apt-get install -y --no-install-recommends dialog \
        && apt-get update \
    && apt-get install -y --no-install-recommends openssh-server \
    && echo "$SSH_PASSWD" | chpasswd 

COPY sshd_config /etc/ssh/
COPY init.sh /usr/local/bin/
    
RUN chmod u+x /usr/local/bin/init.sh
EXPOSE 8000 2222
#CMD ["python", "/code/manage.py", "runserver", "0.0.0.0:8000"]
ENTRYPOINT ["init.sh"]

Créer l’image Docker avec la commande docker build.Build the Docker image with the docker build command.

docker build --tag mydockerimage .

Vérifiez que la build fonctionne en exécutant le conteneur Docker.Test that the build works by running the Docker container. Exécutez la commande docker run puis passez le nom et la balise de l’image.Issue the docker run command and pass the name and tag of the image to it. Veillez à spécifier le port à l’aide de l’argument -p.Be sure to specify the port using the -p argument.

docker run -p 8000:8000 mydockerimage

Accédez à http://localhost:8000 pour vérifier que l’application web et le conteneur fonctionnent correctement.Verify the web app and container are functioning correctly by browsing to http://localhost:8000.

Tester l’application web localement

Utiliser Azure Cloud ShellUse Azure Cloud Shell

Azure héberge Azure Cloud Shell, un environnement d’interpréteur de commandes interactif que vous pouvez utiliser dans votre navigateur.Azure hosts Azure Cloud Shell, an interactive shell environment that you can use through your browser. Cloud Shell vous permet d’utiliser bash ou PowerShell pour travailler avec les services Azure.Cloud Shell lets you use either bash or PowerShell to work with Azure services. Vous pouvez utiliser les commandes préinstallées Cloud Shell pour exécuter le code de cet article sans avoir à installer quoi que ce soit dans votre environnement local.You can use the Cloud Shell pre-installed commands to run the code in this article without having to install anything on your local environment.

Pour lancer Azure Cloud Shell :To launch Azure Cloud Shell:

OptionOption Exemple/LienExample/Link
Sélectionnez Essayer dans le coin supérieur droit d’un bloc de code.Select Try It in the upper-right corner of a code block. La sélection de Essayer ne copie pas automatiquement le code dans Cloud Shell.Selecting Try It doesn't automatically copy the code to Cloud Shell. Exemple Essayer pour Azure Cloud Shell
Accédez à https://shell.azure.com ou sélectionnez le bouton Lancer Cloud Shell pour ouvrir Cloud Shell dans votre navigateur.Go to https://shell.azure.com or select the Launch Cloud Shell button to open Cloud Shell in your browser. Lancer Cloud Shell dans une nouvelle fenêtreLaunch Cloud Shell in a new window
Sélectionnez le bouton Cloud Shell dans la barre de menus en haut à droite du portail Azure.Select the Cloud Shell button on the top-right menu bar in the Azure portal. Bouton Cloud Shell du portail Azure

Pour exécuter le code de cet article dans Azure Cloud Shell :To run the code in this article in Azure Cloud Shell:

  1. Lancez Cloud Shell.Launch Cloud Shell.
  2. Sélectionnez le bouton Copier dans un bloc de code pour copier le code.Select the Copy button on a code block to copy the code.
  3. Collez le code dans la session Cloud Shell avec Ctrl+Maj+V sur Windows et Linux, ou Cmd+ Maj+V sur macOS.Paste the code into the Cloud Shell session with Ctrl+Shift+V on Windows and Linux, or Cmd+Shift+V on macOS.
  4. Appuyez sur Entrée pour exécuter le code.Press Enter to run the code.

Déployer des applications dans AzureDeploy app to Azure

Pour créer une application qui utilise l’image que vous venez de créer, vous exécutez les commandes Azure CLI qui créent un groupe de ressources, envoient l’image, puis créent l’application web du plan App Service permettant de l’exécuter.To create an app that uses the image you just created, you run Azure CLI commands that create a resource group, pushes the image, and then creates the App Service plan web app to run it.

Créer un groupe de ressourcesCreate a resource group

Un groupe de ressources est un conteneur logique dans lequel les ressources Azure comme les applications web, les bases de données et les comptes de stockage sont déployés et gérés.A resource group is a logical container into which Azure resources like web apps, databases, and storage accounts are deployed and managed. Par exemple, vous pouvez choisir de supprimer le groupe de ressources complet ultérieurement en une seule étape.For example, you can choose to delete the entire resource group in one simple step later.

Dans Cloud Shell, créez un groupe de ressources avec la commande az group create.In the Cloud Shell, create a resource group with the az group create command. L’exemple suivant crée un groupe de ressources nommé myResourceGroup à l’emplacement Europe Ouest.The following example creates a resource group named myResourceGroup in the West Europe location. Pour afficher tous les emplacements pris en charge pour App Service sous Linux au niveau De base, exécutez la commande az appservice list-locations --sku B1 --linux-workers-enabled.To see all supported locations for App Service on Linux in Basic tier, run the az appservice list-locations --sku B1 --linux-workers-enabled command.

az group create --name myResourceGroup --location "West Europe"

Vous créez généralement votre groupe de ressources et les ressources dans une région proche de chez vous.You generally create your resource group and the resources in a region near you.

Une fois la commande terminée, une sortie JSON affiche les propriétés du groupe de ressources.When the command finishes, a JSON output shows you the resource group properties.

Création d’un Azure Container RegistryCreate an Azure Container Registry

Dans Cloud Shell, utilisez la commande az acr create pour créer un registre de conteneurs Azure Container Registry.In the Cloud Shell, use the az acr create command to create an Azure Container Registry.

az acr create --name <azure-container-registry-name> --resource-group myResourceGroup --sku Basic --admin-enabled true

Se connecter à Azure Container RegistrySign in to Azure Container Registry

Pour envoyer une image au Registre, vous devez vous authentifier auprès du Registre privé.To push an image to the registry, you need to authenticate with the private registry. Dans Cloud Shell, utilisez la commande az acr show pour récupérer les informations d’identification à partir du Registre que vous avez créé.In the Cloud Shell, use the az acr show command to retrieve the credentials from the registry you created.

az acr credential show --name <azure-container-registry-name>

La sortie indique deux mots de passe ainsi que le nom d’utilisateur.The output reveals two passwords along with the user name.

<
  "passwords": [
    {
      "name": "password",
      "value": "{password}"
    },
    {
      "name": "password2",
      "value": "{password}"
    }
  ],
  "username": "<registry-username>"
}

Dans la fenêtre de terminal locale, connectez-vous à Azure Container Registry à l’aide de la commande docker login, comme le montre l’exemple suivant.From your local terminal window, sign in to the Azure Container Registry using the docker login command, as shown in the following example. Remplacez <azure-container-registry-name> et <registry-username> par des valeurs de votre Registre.Replace <azure-container-registry-name> and <registry-username> with values for your registry. Lorsque vous y êtes invité, tapez l’un des mots de passe de l’étape précédente.When prompted, type in one of the passwords from the previous step.

docker login <azure-container-registry-name>.azurecr.io --username <registry-username>

Vérifiez que la connexion est bien établie.Confirm that the login succeeds.

Envoyer l’image à Azure Container RegistryPush image to Azure Container Registry

Marquez votre image locale pour Azure Container Registry.Tag your local image for the Azure Container Registry. Par exemple :For example:

docker tag mydockerimage <azure-container-registry-name>.azurecr.io/mydockerimage:v1.0.0

Envoyez l’image à l’aide de la commande docker push.Push the image by using the docker push command. Identifiez l’image avec le nom du registre, suivi du nom et de la balise de l’image.Tag the image with the name of the registry, followed by your image name and tag.

docker push <azure-container-registry-name>.azurecr.io/mydockerimage:v1.0.0

Dans Cloud Shell, vérifiez que l’envoi a réussi.Back in the Cloud Shell, verify that the push is successful.

az acr repository list -n <azure-container-registry-name>

Vous devez obtenir la sortie suivante.You should get the following output.

[
  "mydockerimage"
]

Créer un plan App ServiceCreate App Service plan

Dans Cloud Shell, créez un plan App Service dans le groupe de ressources avec la commande az appservice plan create.In the Cloud Shell, create an App Service plan in the resource group with the az appservice plan create command.

L’exemple suivant crée un plan App Service nommé myAppServicePlan dans le niveau tarifaire De base (--sku B1) et un conteneur Linux (--is-linux).The following example creates an App Service plan named myAppServicePlan in the Basic pricing tier (--sku B1) and in a Linux container (--is-linux).

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku B1 --is-linux

Lorsque le plan App Service est créé, l’interface Azure CLI affiche des informations similaires à l’exemple suivant :When the App Service plan has been created, the Azure CLI shows information similar to the following example:

{ 
  "adminSiteName": null,
  "appServicePlanName": "myAppServicePlan",
  "geoRegion": "West Europe",
  "hostingEnvironmentProfile": null,
  "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myAppServicePlan",
  "kind": "linux",
  "location": "West Europe",
  "maximumNumberOfWorkers": 1,
  "name": "myAppServicePlan",
  < JSON data removed for brevity. >
  "targetWorkerSizeId": 0,
  "type": "Microsoft.Web/serverfarms",
  "workerTierName": null
} 

Créer une application webCreate web app

Dans Cloud Shell, créez une application web dans le plan App Service myAppServicePlan avec la commande az webapp create.In the Cloud Shell, create a web app in the myAppServicePlan App Service plan with the az webapp create command. Remplacez <app-name> par un nom d’application unique et <azure-container-registry-name> par le nom de votre Registre.Replace <app-name> with a unique app name, and <azure-container-registry-name> with your registry name.

az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --deployment-container-image-name <azure-container-registry-name>.azurecr.io/mydockerimage:v1.0.0

Une fois l’application web créée, Azure CLI affiche une sortie similaire à l’exemple suivant :When the web app has been created, the Azure CLI shows output similar to the following example:

{
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": "<app-name>.azurewebsites.net",
  "deploymentLocalGitUrl": "https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git",
  "enabled": true,
  < JSON data removed for brevity. >
}

Configurer les informations d’identification du Registre dans l’application webConfigure registry credentials in web app

Pour extraire l’image privée, App Service a besoin d’informations sur votre Registre et sur l’image.For App Service to pull the private image, it needs information about your registry and image. Dans Cloud Shell, fournissez-lui la commande az webapp config container set.In the Cloud Shell, provide them with the az webapp config container set command. Remplacez <app-name> , <azure-container-registry-name> , <registry-username> et <password> .Replace <app-name>, <azure-container-registry-name>, <registry-username>, and <password>.

az webapp config container set --name <app-name> --resource-group myResourceGroup --docker-custom-image-name <azure-container-registry-name>.azurecr.io/mydockerimage:v1.0.0 --docker-registry-server-url https://<azure-container-registry-name>.azurecr.io --docker-registry-server-user <registry-username> --docker-registry-server-password <password>

Notes

Lorsque vous utilisez un registre autre que Docker Hub, --docker-registry-server-url doit être formaté en tant que https:// suivi du nom de domaine complet du registre.When using a registry other than Docker Hub, --docker-registry-server-url must be formatted as https:// followed by the fully qualified domain name of the registry.

Configuration des variables d’environnementConfigure environment variables

La plupart des images Docker utilisent des variables d’environnement personnalisées, par exemple un port autre que 80.Most Docker images use custom environment variables, such as a port other than 80. Utilisez le paramètre d’application WEBSITES_PORT pour indiquer à App Service le port utilisé par votre image.You tell App Service about the port that your image uses by using the WEBSITES_PORT app setting. La page GitHub de l’exemple Python dans ce didacticiel montre que vous devez définir WEBSITES_PORT avec la valeur 8000.The GitHub page for the Python sample in this tutorial shows that you need to set WEBSITES_PORT to 8000.

Pour définir les paramètres de l’application, utilisez la commande az webapp config appsettings set dans Cloud Shell.To set app settings, use the az webapp config appsettings set command in the Cloud Shell. Les paramètres d’application respectent la casse et sont séparés par des espaces.App settings are case-sensitive and space-separated.

az webapp config appsettings set --resource-group myResourceGroup --name <app-name> --settings WEBSITES_PORT=8000

Tester l’application webTest the web app

Accédez à http://<app-name>.azurewebsites.net pour vérifier que l’application web fonctionne.Verify that the web app works by browsing to it (http://<app-name>.azurewebsites.net).

Notes

Le premier accès à l’application peut prendre un certain temps, car App Service doit extraire toute l’image.The first time you access the app, it may take some time because App Service needs to pull the entire image. En cas d’expiration du délai d’attente du navigateur, actualisez simplement la page.If the browser times out, just refresh the page.

Test de la configuration du port de l’application web

Modification de l’application web et redéploiementChange web app and redeploy

Dans votre dépôt Git local, ouvrez app/templates/app/index.html.In your local Git repository, open app/templates/app/index.html. Localisez le premier élément HTML et changez-le.Locate the first HTML element and change it to.

<nav class="navbar navbar-inverse navbar-fixed-top">
    <div class="container">
      <div class="navbar-header">
        <a class="navbar-brand" href="#">Azure App Service - Updated Here!</a>
      </div>
    </div>
  </nav>

Après avoir modifié et enregistré le fichier Python, vous devez reconstruire et transmettre la nouvelle image Docker.Once you've modified the Python file and saved it, you must rebuild and push the new Docker image. Redémarrez ensuite l’application web pour que les modifications prennent effet.Then restart the web app for the changes to take effect. Utilisez les mêmes commandes que vous avez utilisées précédemment dans ce didacticiel.Use the same commands that you have previously used in this tutorial. Si vous le souhaitez, consultez Créer l’image à partir du fichier Docker et Envoyer l’image à Azure Container Registry.You can refer to Build the image from the Docker file and Push image to Azure Container Registry. Testez l’application web en suivant les instructions dans Tester l’application web.Test the web app by following the instructions in Test the web app.

Accéder aux journaux de diagnosticAccess diagnostic logs

Vous pouvez accéder aux journaux de la console générés à partir du conteneur.You can access the console logs generated from inside the container. Activez d’abord la journalisation du conteneur en exécutant la commande suivante dans Cloud Shell :First, turn on container logging by running the following command in the Cloud Shell:

az webapp log config --name <app-name> --resource-group myResourceGroup --docker-container-logging filesystem

Une fois la journalisation du conteneur activée, exécutez la commande suivante pour voir le flux de journal :Once container logging is turned on, run the following command to see the log stream:

az webapp log tail --name <app-name> --resource-group myResourceGroup

Si vous ne voyez pas les journaux d’activité de la console, attendez 30 secondes et vérifiez à nouveau.If you don't see console logs immediately, check again in 30 seconds.

Notes

Vous pouvez également inspecter les fichiers journaux à partir du navigateur sur https://<app-name>.scm.azurewebsites.net/api/logs/docker.You can also inspect the log files from the browser at https://<app-name>.scm.azurewebsites.net/api/logs/docker.

Pour arrêter le streaming des journaux à tout moment, appuyez sur Ctrl+C.To stop log streaming at any time, type Ctrl+C.

Activer les connexions SSHEnable SSH connections

SSH permet d’établir une communication sécurisée entre un conteneur et un client.SSH enables secure communication between a container and a client. Pour activer la connexion SSH à votre conteneur, votre image personnalisée doit être configurée pour cela.To enable SSH connection to your container, your custom image must be configured for it. Jetons un coup d’œil sur l’exemple de référentiel qui a déjà la configuration nécessaire.Let's take a look at the sample repository that already has the necessary configuration.

  • Dans le fichier Dockerfile, le code suivant installe le serveur SSH et définit également les informations d’identification de connexion.In the Dockerfile, the following code installs the SSH server and also sets the sign-in credentials.

    ENV SSH_PASSWD "root:Docker!"
    RUN apt-get update \
            && apt-get install -y --no-install-recommends dialog \
            && apt-get update \
      && apt-get install -y --no-install-recommends openssh-server \
      && echo "$SSH_PASSWD" | chpasswd 
    

    Notes

    Cette configuration n’autorise pas les connexions externes avec le conteneur.This configuration does not allow external connections to the container. SSH est disponible uniquement via le site Kudu/SCM.SSH is available only through the Kudu/SCM Site. Le site Kudu/SCM est authentifié avec votre compte Azure.The Kudu/SCM site is authenticated with your Azure account.

  • Le fichier Dockerfile copie le fichier sshd_config du référentiel dans le répertoire /etc/ssh/ .The Dockerfile copies the sshd_config file in the repository to the /etc/ssh/ directory.

    COPY sshd_config /etc/ssh/
    
  • Le fichier Dockerfile expose le port 2222 dans le conteneur.The Dockerfile exposes port 2222 in the container. Il s’agit d’un port interne accessible uniquement par les conteneurs au sein du réseau de pont d’un réseau privé virtuel.It is an internal port accessible only by containers within the bridge network of a private virtual network.

    EXPOSE 8000 2222
    
  • Le script d’entrée démarre le serveur SSH.The entry script starts the SSH server.

    ```bash
    #!/bin/bash
    service ssh start
    
    
    

Open SSH connection to container

SSH connection is available only through the Kudu site, which is accessible at https://<app-name>.scm.azurewebsites.net.

To connect, browse to https://<app-name>.scm.azurewebsites.net/webssh/host and sign in with your Azure account.

You are then redirected to a page displaying an interactive console.

You may wish to verify that certain applications are running in the container. To inspect the container and verify running processes, issue the top command at the prompt.

top

La commande top expose tous les processus en cours d’exécution dans un conteneur.The top command exposes all running processes in a container.

PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 1 root      20   0  945616  35372  15348 S  0.0  2.1   0:04.63 node
20 root      20   0   55180   2776   2516 S  0.0  0.2   0:00.00 sshd
42 root      20   0  944596  33340  15352 S  0.0  1.9   0:05.80 node /opt/s+
56 root      20   0   59812   5244   4512 S  0.0  0.3   0:00.93 sshd
58 root      20   0   20228   3128   2664 S  0.0  0.2   0:00.00 bash
62 root      20   0   21916   2272   1944 S  0.0  0.1   0:03.15 top
63 root      20   0   59812   5344   4612 S  0.0  0.3   0:00.03 sshd
65 root      20   0   20228   3140   2672 S  0.0  0.2   0:00.00 bash
71 root      20   0   59812   5380   4648 S  0.0  0.3   0:00.02 sshd
73 root      20   0   20228   3160   2696 S  0.0  0.2   0:00.00 bash
77 root      20   0   21920   2304   1972 R  0.0  0.1   0:00.00 top

Félicitations !Congratulations! Vous avez configuré un conteneur Linux personnalisé dans App Service.You've configured a custom Linux container in App Service.

Nettoyer le déploiementClean up deployment

Une fois l’exemple de script exécuté, la commande suivante permet de supprimer le groupe de ressources et toutes les ressources associées.After the sample script has been run, the following command can be used to remove the resource group and all resources associated with it.

az group delete --name myResourceGroup

Étapes suivantesNext steps

Vous avez appris à effectuer les opérations suivantes :What you learned:

  • Déployer une image personnalisée dans un Registre de conteneurs privéDeploy a custom image to a private container registry
  • Exécuter l’image personnalisée dans App ServiceRun the custom image in App Service
  • Configuration des variables d’environnementConfigure environment variables
  • Mettre à jour et redéployer l’imageUpdate and redeploy the image
  • Accéder aux journaux de diagnosticAccess diagnostic logs
  • Se connecter au conteneur avec SSHConnect to the container using SSH

Passez au didacticiel suivant pour découvrir comment mapper un nom DNS personnalisé à votre application.Advance to the next tutorial to learn how to map a custom DNS name to your app.

Ou consultez les autres ressources :Or, check out other resources: