Tutoriel : Créer une application multiconteneur (préversion) dans Web App pour conteneurs

Remarque

Les conteneurs sidecar (préversion) remplaceront les applications multiconteneur dans App Service. Pour commencer, consultez Didacticiel : Configurer un conteneur sidecar pour un conteneur personnalisé dans Azure App Service (préversion).

Web App pour conteneurs fournit une solution souple d’utilisation des images Docker. Dans ce didacticiel, vous allez apprendre à créer une application à plusieurs conteneurs à l’aide de WordPress et de MySQL. Vous allez effectuer ce tutoriel dans Cloud Shell, mais vous pouvez également exécuter ces commandes localement avec l’outil en ligne de commande Azure CLI (2.0.32 ou ultérieur).

Dans ce tutoriel, vous allez apprendre à :

  • Convertir une configuration Docker Compose pour travailler avec Web App pour conteneurs
  • Déployer une application à plusieurs conteneurs vers Azure
  • Ajouter des paramètres d’application
  • Utiliser le stockage persistant pour vos conteneurs
  • Se connecter à la base de données Azure pour MySQL
  • Résoudre les erreurs

Si vous n’avez pas d’abonnement Azure, créez un compte gratuit Azure avant de commencer.

Prérequis

Pour suivre ce tutoriel, vous devez connaître Docker Compose.

Télécharger l’exemple

Pour ce tutoriel, vous utilisez le fichier de composition de Docker, mais vous le modifiez pour inclure Azure Database pour MySQL, le stockage persistant et Redis. Le fichier de configuration se trouve dans les exemples Azure. Dans l’exemple ci-dessous, notez que depends_on est une option non prise en charge et est ignoré. Pour connaître les options de configuration prises en charge, consultez Options Docker Compose.

version: '3.3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:

Dans Cloud Shell, créez un répertoire pour le tutoriel, puis accédez à ce répertoire.

mkdir tutorial

cd tutorial

Exécutez ensuite la commande suivante pour cloner le dépôt de l’exemple d’application dans le répertoire de votre tutoriel. Accédez ensuite au répertoire multicontainerwordpress.

git clone https://github.com/Azure-Samples/multicontainerwordpress

cd multicontainerwordpress

Créer un groupe de ressources

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ées et managées. Par exemple, vous pouvez choisir de supprimer le groupe de ressources complet ultérieurement en une seule étape.

Dans Cloud Shell, créez un groupe de ressources avec la commande az group create. L’exemple suivant crée un groupe de ressources nommé myResourceGroup à l’emplacement USA Centre Sud. Pour afficher tous les emplacements pris en charge pour App Service sous Linux au niveau Standard, exécutez la commande az appservice list-locations --sku S1 --linux-workers-enabled.

az group create --name myResourceGroup --location "South Central US"

Vous créez généralement votre groupe de ressources et les ressources dans une région proche de chez vous.

Une fois la commande terminée, une sortie JSON affiche les propriétés du groupe de ressources.

Créer un plan Azure App Service

Dans Cloud Shell, créez un plan App Service dans le groupe de ressources avec la commande az appservice plan create.

L’exemple suivant crée un plan App Service nommé myAppServicePlan dans le niveau tarifaire Standard (--sku S1) et un conteneur Linux (--is-linux).

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

Une fois le plan App Service créé, Cloud Shell affiche des informations similaires à l’exemple suivant :

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

Docker Compose avec conteneurs WordPress et MySQL

Création d’une application Docker Compose

Dans Cloud Shell, créez une application web multiconteneur dans le plan App Service myAppServicePlan avec la commande az webapp create. N’oubliez pas de remplacer <app-name> par un nom d’application unique.

az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --multicontainer-config-type compose --multicontainer-config-file docker-compose-wordpress.yml

Une fois l’application web créée, Cloud Shell affiche une sortie similaire à l’exemple suivant :

{
  "additionalProperties": {},
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": "<app-name>.azurewebsites.net",
  "enabled": true,
  < JSON data removed for brevity. >
}

Accéder à l’application

Accédez à l’application déployée dans (http://<app-name>.azurewebsites.net). Le chargement de l’application peut prendre plusieurs minutes. Si vous recevez une erreur, attendez quelques minutes supplémentaires, puis actualisez le navigateur. Si vous rencontrez des difficultés et souhaitez résoudre les problèmes, consultez les journaux d’activité du conteneur.

Exemple d’application à plusieurs conteneurs sur Web App pour conteneurs

Félicitations, vous avez créé une application à plusieurs conteneurs dans Web App pour conteneurs. Ensuite, vous devez configurer votre application pour utiliser Azure Database pour MySQL. N’installez pas WordPress pour le moment.

Connexion à la base de données de production

Il n’est pas recommandé d’utiliser des conteneurs de base de données dans un environnement de production. Les conteneurs locaux ne sont pas évolutifs. Au lieu de cela, vous allez utiliser Azure Database pour MySQL qui peut être mis à l’échelle.

Création d’un serveur Azure Database pour MySQL

Créez un serveur Azure Database pour MySQL avec la commande az mysql server create.

Dans la commande suivante, indiquez le nom unique de votre propre serveur MySQL là où se trouve l’espace réservé <mysql-server-name> (les caractères valides sont a-z, 0-9 et -). Ce nom fait partie du nom d’hôte du serveur MySQL (<mysql-server-name>.database.windows.net) et doit donc être globalement unique.

az mysql server create --resource-group myResourceGroup --name <mysql-server-name>  --location "South Central US" --admin-user adminuser --admin-password My5up3rStr0ngPaSw0rd! --sku-name B_Gen5_1 --version 5.7

La création du serveur peut prendre quelques minutes. Une fois le serveur MySQL créé, Cloud Shell affiche des informations similaires à l’exemple suivant :

{
  "administratorLogin": "adminuser",
  "administratorLoginPassword": null,
  "fullyQualifiedDomainName": "<mysql-server-name>.database.windows.net",
  "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.DBforMySQL/servers/<mysql-server-name>",
  "location": "southcentralus",
  "name": "<mysql-server-name>",
  "resourceGroup": "myResourceGroup",
  ...
}

Configuration d’un pare-feu de serveur

Créez une règle de pare-feu pour votre serveur MySQL afin d’autoriser les connexions client à l’aide de la commande az mysql server firewall-rule create. Lorsque les adresses IP de début et de fin sont définies sur 0.0.0.0, le pare-feu est ouvert uniquement pour les autres ressources Azure.

az mysql server firewall-rule create --name allAzureIPs --server <mysql-server-name> --resource-group myResourceGroup --start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0

Conseil

Vous pouvez être encore plus restrictif dans votre règle de pare-feu en choisissant uniquement les adresses IP sortantes que votre application utilise.

Création de la base de données WordPress

az mysql db create --resource-group myResourceGroup --server-name <mysql-server-name> --name wordpress

Une fois la base de données créée, Cloud Shell affiche des informations similaires à l’exemple suivant :

{
  "additionalProperties": {},
  "charset": "latin1",
  "collation": "latin1_swedish_ci",
  "id": "/subscriptions/12db1644-4b12-4cab-ba54-8ba2f2822c1f/resourceGroups/myResourceGroup/providers/Microsoft.DBforMySQL/servers/<mysql-server-name>/databases/wordpress",
  "name": "wordpress",
  "resourceGroup": "myResourceGroup",
  "type": "Microsoft.DBforMySQL/servers/databases"
}

Configuration des variables de la base de données dans WordPress

Pour connecter l’application WordPress à ce nouveau serveur MySQL, vous devez configurer quelques variables d’environnement spécifiques à WordPress, y compris le chemin d’accès de l’autorité de certification SSL défini par MYSQL_SSL_CA. Le certificat racine CyberTrust Baltimore de DigiCert est fourni dans l’image personnalisée ci-dessous.

Pour effectuer ces modifications, utilisez la commande az webapp config appsettings set dans Cloud Shell. Les paramètres d’application respectent la casse et sont séparés par des espaces.

az webapp config appsettings set --resource-group myResourceGroup --name <app-name> --settings WORDPRESS_DB_HOST="<mysql-server-name>.mysql.database.azure.com" WORDPRESS_DB_USER="adminuser" WORDPRESS_DB_PASSWORD="My5up3rStr0ngPaSw0rd!" WORDPRESS_DB_NAME="wordpress" MYSQL_SSL_CA="BaltimoreCyberTrustroot.crt.pem"

Une fois le paramètre d’application créé, Cloud Shell affiche des informations similaires à l’exemple suivant :

[
  {
    "name": "WORDPRESS_DB_HOST",
    "slotSetting": false,
    "value": "<mysql-server-name>.mysql.database.azure.com"
  },
  {
    "name": "WORDPRESS_DB_USER",
    "slotSetting": false,
    "value": "adminuser"
  },
  {
    "name": "WORDPRESS_DB_NAME",
    "slotSetting": false,
    "value": "wordpress"
  },
  {
    "name": "WORDPRESS_DB_PASSWORD",
    "slotSetting": false,
    "value": "My5up3rStr0ngPaSw0rd!"
  },
  {
    "name": "MYSQL_SSL_CA",
    "slotSetting": false,
    "value": "BaltimoreCyberTrustroot.crt.pem"
  }
]

Pour plus d’informations sur les variables d’environnement, consultez Configurer des variables d’environnement.

Utiliser une image personnalisée pour le protocole TLS/SSL de MySQL et d’autres configurations

Par défaut, TLS/SSL est utilisé par Azure Database pour MySQL. WordPress nécessite une configuration supplémentaire pour utiliser TLS/SSL avec MySQL. « L’image officielle » de WordPress ne fournit pas la configuration supplémentaire, mais une image personnalisée a été préparée pour vous simplifier la tâche. En pratique, vous devez ajouter les modifications souhaitées à votre propre image.

L’image personnalisée est basée sur « l’image officielle » de WordPress provenant du Hub Docker. Les modifications suivantes ont été apportées dans cette image personnalisée pour Azure Database pour MySQL :

Les modifications suivantes ont été apportées pour Redis (à utiliser dans une section ultérieure) :

Pour utiliser l’image personnalisée, vous devez mettre à jour votre fichier docker-compose-wordpress.yml. Dans Cloud Shell, ouvrez un éditeur de texte et remplacez image: wordpress pour utiliser image: mcr.microsoft.com/azuredocs/multicontainerwordpress. Vous n’avez plus besoin du conteneur de base de données. Supprimez les sections db, environment, depends_on et volumes du fichier de configuration. Votre fichier doit ressembler au code suivant :

version: '3.3'

services:
   wordpress:
     image: mcr.microsoft.com/azuredocs/multicontainerwordpress
     ports:
       - "8000:80"
     restart: always

Mise à jour avec la nouvelle configuration

Dans Cloud Shell, reconfigurez votre application web multiconteneur avec la commande az webapp config container set. N’oubliez pas de remplacer <app-name> par le nom de l’application web créée précédemment.

az webapp config container set --resource-group myResourceGroup --name <app-name> --multicontainer-config-type compose --multicontainer-config-file docker-compose-wordpress.yml

Une fois l’application reconfigurée, Cloud Shell affiche des informations similaires à celles de l’exemple suivant :

[
  {
    "name": "DOCKER_CUSTOM_IMAGE_NAME",
    "value": "COMPOSE|dmVyc2lvbjogJzMuMycKCnNlcnZpY2VzOgogICB3b3JkcHJlc3M6CiAgICAgaW1hZ2U6IG1zYW5nYXB1L3dvcmRwcmVzcwogICAgIHBvcnRzOgogICAgICAgLSAiODAwMDo4MCIKICAgICByZXN0YXJ0OiBhbHdheXM="
  }
]

Accéder à l’application

Accédez à l’application déployée dans (http://<app-name>.azurewebsites.net). L’application utilise maintenant Azure Database pour MySQL.

Exemple d’application multiconteneur sur Web App pour conteneurs

Ajout de stockage persistant

Votre conteneur à plusieurs applications s’exécute maintenant dans Web App pour conteneurs. Toutefois, si vous installez WordPress maintenant et redémarrez votre application plus tard, vous verrez que l’installation de WordPress a disparu. Cela se produit parce que votre configuration Docker Compose pointe actuellement vers un emplacement de stockage à l’intérieur de votre conteneur. Les fichiers installés dans le conteneur ne sont pas conservés après le redémarrage de l’application. Dans cette section, vous allez ajouter du stockage persistant à votre conteneur WordPress.

Configuration des variables d’environnement

Pour utiliser le stockage persistant, vous devez activer ce paramètre dans App Service. Pour faire cette modification, utilisez la commande az webapp config appsettings set dans Cloud Shell. Les paramètres d’application respectent la casse et sont séparés par des espaces.

az webapp config appsettings set --resource-group myResourceGroup --name <app-name> --settings WEBSITES_ENABLE_APP_SERVICE_STORAGE=TRUE

Une fois le paramètre d’application créé, Cloud Shell affiche des informations similaires à l’exemple suivant :

[
  < JSON data removed for brevity. >
  {
    "name": "WORDPRESS_DB_NAME",
    "slotSetting": false,
    "value": "wordpress"
  },
  {
    "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE",
    "slotSetting": false,
    "value": "TRUE"
  }
]

Modification du fichier de configuration

Dans le Cloud Shell, ouvrez le fichier docker-compose-wordpress.yml dans un éditeur de texte.

L’option volumes mappe le système de fichiers sur un répertoire dans le conteneur. ${WEBAPP_STORAGE_HOME} est une variable d’environnement d’App Service mappée sur le stockage persistant de votre application. Vous allez utiliser cette variable d’environnement dans l’option des volumes pour que les fichiers WordPress soient installés dans le stockage persistant plutôt que dans le conteneur. Apportez les modifications suivantes au fichier :

Dans la section wordpress, ajoutez une option volumes afin d’obtenir le code suivant :

version: '3.3'

services:
   wordpress:
     image: mcr.microsoft.com/azuredocs/multicontainerwordpress
     volumes:
      - ${WEBAPP_STORAGE_HOME}/site/wwwroot:/var/www/html
     ports:
       - "8000:80"
     restart: always

Mise à jour avec la nouvelle configuration

Dans Cloud Shell, reconfigurez votre application web multiconteneur avec la commande az webapp config container set. N’oubliez pas de remplacer <app-name> par un nom d’application unique.

az webapp config container set --resource-group myResourceGroup --name <app-name> --multicontainer-config-type compose --multicontainer-config-file docker-compose-wordpress.yml

Après son exécution, la commande retourne un résultat semblable à l’exemple suivant :

[
  {
    "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE",
    "slotSetting": false,
    "value": "TRUE"
  },
  {
    "name": "DOCKER_CUSTOM_IMAGE_NAME",
    "value": "COMPOSE|dmVyc2lvbjogJzMuMycKCnNlcnZpY2VzOgogICBteXNxbDoKICAgICBpbWFnZTogbXlzcWw6NS43CiAgICAgdm9sdW1lczoKICAgICAgIC0gZGJfZGF0YTovdmFyL2xpYi9teXNxbAogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgTVlTUUxfUk9PVF9QQVNTV09SRDogZXhhbXBsZXBhc3MKCiAgIHdvcmRwcmVzczoKICAgICBkZXBlbmRzX29uOgogICAgICAgLSBteXNxbAogICAgIGltYWdlOiB3b3JkcHJlc3M6bGF0ZXN0CiAgICAgcG9ydHM6CiAgICAgICAtICI4MDAwOjgwIgogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgV09SRFBSRVNTX0RCX1BBU1NXT1JEOiBleGFtcGxlcGFzcwp2b2x1bWVzOgogICAgZGJfZGF0YTo="
  }
]

Accéder à l’application

Accédez à l’application déployée dans (http://<app-name>.azurewebsites.net).

Le conteneur WordPress utilise maintenant Azure Database pour MySQL et le stockage persistant.

Ajout d’un conteneur Redis

« L’image officielle » de WordPress n’inclut pas les dépendances pour Redis. Ces dépendances et la configuration supplémentaire requise pour utiliser Redis avec WordPress ont été préparées pour vous dans cette image personnalisée. En pratique, vous devez ajouter les modifications souhaitées à votre propre image.

L’image personnalisée est basée sur « l’image officielle » de WordPress provenant du Hub Docker. Les modifications suivantes ont été apportées dans cette image personnalisée pour Redis :

Ajoutez le conteneur redis en bas du fichier de configuration afin qu’il ressemble à l’exemple suivant :

version: '3.3'

services:
   wordpress:
     image: mcr.microsoft.com/azuredocs/multicontainerwordpress
     ports:
       - "8000:80"
     restart: always

   redis:
     image: mcr.microsoft.com/oss/bitnami/redis:6.0.8
     environment:
      - ALLOW_EMPTY_PASSWORD=yes
     restart: always

Configuration des variables d’environnement

Pour utiliser Redis, vous devez allez devoir activer ce paramètre, WP_REDIS_HOST, dans App Service. Pour que WordPress communique avec l’hôte Redis, ce paramètre est obligatoire. Pour faire cette modification, utilisez la commande az webapp config appsettings set dans Cloud Shell. Les paramètres d’application respectent la casse et sont séparés par des espaces.

az webapp config appsettings set --resource-group myResourceGroup --name <app-name> --settings WP_REDIS_HOST="redis"

Une fois le paramètre d’application créé, Cloud Shell affiche des informations similaires à l’exemple suivant :

[
  < JSON data removed for brevity. >
  {
    "name": "WORDPRESS_DB_USER",
    "slotSetting": false,
    "value": "adminuser"
  },
  {
    "name": "WP_REDIS_HOST",
    "slotSetting": false,
    "value": "redis"
  }
]

Mise à jour avec la nouvelle configuration

Dans Cloud Shell, reconfigurez votre application web multiconteneur avec la commande az webapp config container set. N’oubliez pas de remplacer <app-name> par un nom d’application unique.

az webapp config container set --resource-group myResourceGroup --name <app-name> --multicontainer-config-type compose --multicontainer-config-file compose-wordpress.yml

Après son exécution, la commande retourne un résultat semblable à l’exemple suivant :

[
  {
    "name": "DOCKER_CUSTOM_IMAGE_NAME",
    "value": "COMPOSE|dmVyc2lvbjogJzMuMycKCnNlcnZpY2VzOgogICBteXNxbDoKICAgICBpbWFnZTogbXlzcWw6NS43CiAgICAgdm9sdW1lczoKICAgICAgIC0gZGJfZGF0YTovdmFyL2xpYi9teXNxbAogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgTVlTUUxfUk9PVF9QQVNTV09SRDogZXhhbXBsZXBhc3MKCiAgIHdvcmRwcmVzczoKICAgICBkZXBlbmRzX29uOgogICAgICAgLSBteXNxbAogICAgIGltYWdlOiB3b3JkcHJlc3M6bGF0ZXN0CiAgICAgcG9ydHM6CiAgICAgICAtICI4MDAwOjgwIgogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgV09SRFBSRVNTX0RCX1BBU1NXT1JEOiBleGFtcGxlcGFzcwp2b2x1bWVzOgogICAgZGJfZGF0YTo="
  }
]

Accéder à l’application

Accédez à l’application déployée dans (http://<app-name>.azurewebsites.net).

Suivez la procédure et installez WordPress.

Connexion de WordPress à Redis

Connectez-vous à l’interface d’administration de WordPress. Dans le volet de navigation gauche, sélectionnez Plugins (Extensions), puis sélectionnez Installed Plugins (Extensions installées).

Sélection des extensions WordPress

Afficher toutes les extensions ici

Dans la page des extensions, recherchez Redis Object Cache et cliquez sur Activate (Activer).

Activation de Redis

Cliquez sur Paramètres.

Cliquez sur Settings (Paramètres)

Cliquez sur le bouton Enable Object Cache (Activer Object Cache).

Cliquez sur le bouton Enable Object Cache (Activer Object Cache).

WordPress se connecte au serveur Redis. L’état de la connexion apparaît sur la même page.

WordPress se connecte au serveur Redis. L’état de la connexion apparaît sur la même page.

Félicitations, vous avez connecté WordPress à Redis. L’application prête pour la production utilise maintenant Azure Database pour MySQL, le stockage persistant et Redis. Vous pouvez maintenant effectuer un scale-out de votre plan App Service à plusieurs instances.

Recherche des journaux d’activité de conteneur Docker

Si vous rencontrez des problèmes avec l’utilisation de plusieurs conteneurs, vous pouvez accéder aux journaux d’activité dans : https://<app-name>.scm.azurewebsites.net/api/logs/docker.

Le résultat ressemble à l’exemple suivant :

[
   {
      "machineName":"RD00XYZYZE567A",
      "lastUpdated":"2018-05-10T04:11:45Z",
      "size":25125,
      "href":"https://<app-name>.scm.azurewebsites.net/api/vfs/LogFiles/2018_05_10_RD00XYZYZE567A_docker.log",
      "path":"/home/LogFiles/2018_05_10_RD00XYZYZE567A_docker.log"
   }
]

Vous voyez un journal pour chaque conteneur et un journal supplémentaire pour le processus parent. Copiez la valeur href respective dans le navigateur pour afficher le journal.

Nettoyer le déploiement

Une fois l’exemple de script exécuté, la commande suivante permet de supprimer le groupe de ressources et toutes les ressources associées.

az group delete --name myResourceGroup

Étapes suivantes

Dans ce didacticiel, vous avez appris à :

  • Convertir une configuration Docker Compose pour travailler avec Web App pour conteneurs
  • Déployer une application à plusieurs conteneurs vers Azure
  • Ajouter des paramètres d’application
  • Utiliser le stockage persistant pour vos conteneurs
  • Se connecter à la base de données Azure pour MySQL
  • Résoudre les erreurs

Passez au tutoriel suivant pour apprendre à sécuriser votre application avec un domaine personnalisé et un certificat.

Ou consultez les autres ressources :