Générer et exécuter une application web Python conteneurisée localement avec MongoDB
Article
Cet article fait partie d’un didacticiel sur la façon de conteneuriser et de déployer une application web Python conteneurisée sur Azure App Service. App Service vous permet d’exécuter des applications web conteneurisées et de déployer via des fonctionnalités d’intégration/de déploiement continu (CI/CD) avec Docker Hub, Azure Container Registry et Visual Studio Team Services. Dans cette partie du tutoriel, vous allez apprendre à générer et exécuter l’application web Python en conteneur localement. Cette étape est facultative et n’est pas nécessaire pour déployer l’exemple d’application sur Azure.
L’exécution d’une image Docker localement dans votre environnement de développement nécessite une configuration au-delà du déploiement sur Azure. Considérez-le comme un investissement qui peut rendre les futurs cycles de développement plus faciles, en particulier lorsque vous passez au-delà des exemples d’applications et que vous commencez à créer vos propres applications web. Pour déployer les exemples d’applications pour Django et Flask, vous pouvez ignorer cette étape et passer à l’étape suivante de ce tutoriel. Vous pouvez toujours revenir après le déploiement sur Azure et suivre ces étapes.
Le diagramme de service suivant met en évidence les composants abordés dans cet article.
Sélectionnez Code, puis sélectionnez Télécharger le fichier zip.
Décompressez le fichier ZIP dans un dossier, puis ouvrez une fenêtre de terminal dans ce dossier.
2. Générer une image Docker
Si vous utilisez l’un des exemples d’applications de framework disponibles pour Django et Flask, vous êtes configuré pour y accéder. Si vous utilisez votre propre exemple d’application, regardez comment les exemples d’applications sont configurés, en particulier le fichier Dockerfile dans le répertoire racine.
Ces instructions nécessitent Visual Studio Code et l’extension Docker. Accédez à l’exemple de dossier que vous avez cloné ou téléchargé et ouvrez VS Code avec la commande code ..
Remarque
Les étapes décrites dans cette section nécessitent l’exécution du démon Docker. Dans certaines installations, par exemple sur Windows, vous devez ouvrir Docker Desktop, qui démarre le démon, avant de continuer.
Instructions
Capture d'écran
Ouvrez l’extension Docker.
Si l’extension Docker signale une erreur « Échec de la connexion », vérifiez que Docker est installé et en cours d’exécution. S’il s’agit de votre première utilisation de Docker, vous n’avez probablement pas de conteneurs, d’images ou de registres connectés.
Générer l’image.
Dans l’Explorateur de projets affichant les fichiers projet, cliquez avec le bouton droit sur le fichier Dockerfile et sélectionnez Générer une image....
Vous pouvez également utiliser la palette de commandes (F1 ou Ctrl+Maj+P) et taper « Images Docker : Générer des images » pour appeler la commande.
Pour plus d’informations sur la syntaxe dockerfile, consultez la référence dockerfile.
Vérifiez que l’image a été générée.
Accédez à la section IMAGES de l’extension Docker.
Recherchez l’image récemment générée. Le nom de l’image conteneur est « msdocspythoncontainerwebapp », qui est défini dans le fichier .vscode/tasks.json .
Les étapes décrites dans cette section nécessitent l’exécution du démon Docker. Dans certaines installations, par exemple sur Windows, vous devez ouvrir Docker Desktop, qui démarre le démon, avant de continuer.
Démarrez à la racine de l’exemple d’application que vous avez cloné ou téléchargé.
Étape 1. À l’invite d’interpréteur de commandes, vérifiez que Docker est accessible.
docker
Si une fois cette commande exécutée, vous voyez de l’aide pour l’interface CLI Docker, puis continuez. Sinon, vérifiez que Docker est installé ou que votre interpréteur de commandes a accès à l’interface CLI Docker.
Étape 2. Générer l’image.
La forme générale de la commande docker build est docker build --rm --pull --file "<path-to-project-root>/Dockerfile" --label "com.microsoft.created-by=docker-cli" --tag "<container-name>:latest" "<path-to-project-root>".
Par exemple, si vous êtes à la racine du répertoire du projet, vous pouvez utiliser la commande comme celle-ci pour générer une image :
Notez le point (« . ») à la fin de la commande faisant référence au courant directement dans lequel la commande s’exécute. Vous pouvez ajouter --no-cache pour forcer une reconstruction.
Étape 3. Vérifiez que l’image a été générée.
Utilisez la commande d’images Docker pour renvoyer une liste d’images.
docker images
Vous devez voir les images répertoriées par nom DU RÉFÉRENTIEL, BALISE et DATE DE CRÉATION entre autres caractéristiques d’image.
À ce stade, vous avez créé une image localement. L’image que vous avez créée porte le nom « msdocspythoncontainerwebapp » et la balise « latest ». Les balises permettent de définir les informations de version, l’utilisation prévue, la stabilité ou d’autres informations. Pour plus d’informations, consultez les Recommandations pour les images conteneur de balisage et le contrôle de version.
Les images générées à partir de VS Code ou à partir de l’interface CLI Docker directement peuvent également être consultées avec l’application Docker Desktop .
3. Configurer MongoDB
Pour ce didacticiel, vous avez besoin d’une base de données MongoDB nommée restaurants_reviews et d’une collection nommée restaurants_reviews. Les étapes décrites dans cette section vous montrent comment utiliser une installation locale de MongoDB ou d’Azure Cosmos DB pour MongoDB pour Créer et accéder à la base de données et à la collection.
Important
N’utilisez pas de base de données MongoDB que vous utiliserez en production. Dans ce tutoriel, vous allez stocker le chaîne de connexion MongoDB dans une variable d’environnement. Cela le rend observable par toute personne capable d’inspecter votre conteneur (par exemple, à l’aide docker inspectde ).
La commande suivante entre dans l’interpréteur de commandes et vous donne la version du serveur mongosh et mongoDB installé sur votre système :
mongosh
La commande suivante vous donne uniquement la version du serveur MongoDB installée sur votre système :
mongosh --quiet --exec 'db.version()'
Si ces commandes ne fonctionnent pas, vous devrez peut-être installer explicitement mongosh ou connecter mongosh à votre serveur MongoDB.
Une alternative dans certaines installations consiste à appeler directement le démon Mongo.
mongod --version
Étape 2 : Modifiez le fichier mongod.cfg pour ajouter l’adresse IP de votre ordinateur.
Le fichier de configuration mongod a une bindIp clé qui définit les noms d’hôte et les adresses IP que MongoDB écoute pour les connexions clientes. Ajoutez l’adresse IP actuelle de votre ordinateur de développement local. L’exemple d’application exécuté localement dans un conteneur Docker communique avec l’ordinateur hôte avec cette adresse.
Par exemple, une partie du fichier de configuration doit ressembler à ceci :
Redémarrez MongoDB pour récupérer les modifications apportées au fichier de configuration.
Étape 3 : Créer une base de données et une collection dans la base de données MongoDB locale.
Définissez le nom de la base de données sur « restaurants_reviews » et le nom de la collection sur « restaurants_reviews ». Vous pouvez créer une base de données et une collection avec l’extension VS Code MongoDB, l’interpréteur de commandes MongoDB (mongosh) ou tout autre outil prenant en compte MondoDB.
Pour l’interpréteur de commandes MongoDB, voici des exemples de commandes pour créer la base de données et la collection :
> help
> use restaurants_reviews
> db.restaurants_reviews.insertOne({})
> show dbs
> exit
À ce stade, votre chaîne de connexion MongoDB local est « mongodb://127.0.0.1:27017/ », le nom de la base de données est « restaurants_reviews » et le nom de la collection est « restaurants_reviews ».
Vous pouvez utiliser des commandes Azure CLI pour créer un compte Azure Cosmos DB pour MongoDB, puis créer la base de données et la collection requises pour ce didacticiel. Si vous n’avez pas déjà utilisé Azure CLI, consultez Prise en main d’Azure CLI pour savoir comment télécharger et installer Azure CLI localement ou comment exécuter des commandes Azure CLI dans Azure Cloud Shell.
Avant d’exécuter le script suivant, remplacez l’emplacement et le nom du compte Azure Cosmos DB pour MongoDB par les valeurs appropriées. Vous pouvez utiliser le nom du groupe de ressources spécifié dans le script ou le modifier. Dans les deux cas, nous vous recommandons d’utiliser le même groupe de ressources pour toutes les ressources Azure créées dans les différents articles de ce didacticiel. Il leur permet de les supprimer plus facilement lorsque vous avez terminé le didacticiel. Si vous êtes arrivé ici à partir de la partie 4. Déployez container App Service, utilisez le nom et l’emplacement du groupe de ressources que vous avez déjà utilisés pour vos ressources.
Le script part du principe que vous utilisez un interpréteur de commandes Bash. Si vous souhaitez utiliser un autre interpréteur de commandes, vous devez modifier la syntaxe de déclaration et de substitution des variables. L’exécution du script peut prendre quelques minutes.
#!/bin/bash
# LOCATION: The Azure region. Use the "az account list-locations -o table" command to find a region near you.
# RESOURCE_GROUP_NAME: The resource group name. Can contain underscores, hyphens, periods, parenthesis, letters, and numbers.
# ACCOUNT_NAME: The Azure Cosmos DB for MongDB account name. Can contain lowercase letters, hyphens, and numbers.
LOCATION='eastus'
RESOURCE_GROUP_NAME='msdocs-web-app-rg'
ACCOUNT_NAME='<cosmos-db-account-name>'
# Create a resource group
echo "Creating resource group $RESOURCE_GROUP_NAME in $LOCATION..."
az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
# Create a Cosmos account for MongoDB API
echo "Creating $ACCOUNT_NAME. This command may take a while to complete."
az cosmosdb create --name $ACCOUNT_NAME --resource-group $RESOURCE_GROUP_NAME --kind MongoDB
# Create a MongoDB API database
echo "Creating database restaurants_reviews"
az cosmosdb mongodb database create --account-name $ACCOUNT_NAME --resource-group $RESOURCE_GROUP_NAME --name restaurants_reviews
# Create a MongoDB API collection
echo "Creating collection restaraunts_reviews"
az cosmosdb mongodb collection create --account-name $ACCOUNT_NAME --resource-group $RESOURCE_GROUP_NAME --database-name restaurants_reviews --name restaurants_reviews
# Get the connection string for the MongoDB database
echo "Get the connection string for the MongoDB account"
az cosmosdb keys list --name $ACCOUNT_NAME --resource-group $RESOURCE_GROUP_NAME --type connection-strings
echo "Copy the Primary MongoDB Connection String from the list above"
Une fois le script terminé, copiez la chaîne de Connecter ion MongoDB primaire à partir de la sortie de la dernière commande.
À ce stade, vous devez disposer d’une base de données Azure Cosmos DB pour MongoDB chaîne de connexion du formulairemongodb://<server-name>:<password>@<server-name>.mongo.cosmos.azure.com:10255/?ssl=true&<other-parameters>, d’une base de données nommée restaurants_reviewset d’une collection nommée restaurants_reviews.
Dans l’extension Vs Code Azure Databases, vous pouvez cliquer avec le bouton droit sur le serveur MongoDB et obtenir le chaîne de connexion.
4. Exécuter l’image localement dans un conteneur
Avec des informations sur la connexion à une base de données MongoDB, vous êtes prêt à exécuter le conteneur localement. L’exemple d’application s’attend à ce que les informations de connexion MongoDB soient transmises dans les variables d’environnement. Il existe plusieurs façons d’obtenir des variables d’environnement passées au conteneur localement. Chacun présente des avantages et des inconvénients en termes de sécurité. Vous devez éviter de case activée dans des informations sensibles ou de laisser des informations sensibles dans le code dans le conteneur.
Remarque
Quand elle est déployée sur Azure, l’application web obtient des informations de connexion à partir des valeurs d’environnement définies en tant que paramètres de configuration App Service et aucune des modifications apportées au scénario d’environnement de développement local ne s’applique.
Dans le dossier .vscode de l’exemple d’application, le fichier settings.json définit ce qui se passe lorsque vous utilisez l’extension Docker et sélectionnez Exécuter ou Exécuter interactive dans le menu contextuel d’une balise. Le fichier settings.json contient deux modèles chacun pour les scénarios et (MongoDB Azure) les (MongoDB local) scénarios.
Si vous utilisez une base de données MongoDB locale :
Remplacez les deux instances par <YOUR_IP_ADDRESS> votre adresse IP.
Remplacez les deux instances par <CONNECTION_STRING> le chaîne de connexion de votre base de données MongoDB.
Si vous utilisez une base de données Azure Cosmos DB pour MongoDB :
Remplacez les deux instances par <CONNECTION_STRING> l’chaîne de connexion Azure Cosmos DB pour MongoDB.
Définissez le docker.dockerPath paramètre de configuration utilisé par les modèles. Pour définir docker.dockerPath, ouvrez la palette de commandes VS Code (Ctrl+Maj+P), entrez « Préférences : Ouvrir l’espace de travail Paramètres », puis entrez « docker.dockerPath » dans la zone Paramètres de recherche. Entrez « docker » (sans guillemets) pour la valeur du paramètre.
Remarque
Le nom de la base de données et le nom de la collection sont supposés être restaurants_reviews.
Exécutez l’image.
Dans la section IMAGES de l’extension Docker, recherchez l’image générée.
Développez l’image pour rechercher la dernière balise, cliquez avec le bouton droit et sélectionnez Exécuter interactive.
Vous serez invité à sélectionner la tâche appropriée pour votre scénario, « Configuration d’exécution interactive (mongoDB locale) » ou « Configuration d’exécution interactive (MongoDB Azure) ».
Avec l’exécution interactive, vous verrez toutes les instructions d’impression dans le code, qui peuvent être utiles pour le débogage. Vous pouvez également sélectionner Exécuter qui n’est pas interactif et ne conserve pas l’entrée standard ouverte.
Important
Cette étape échoue si le profil de terminal par défaut est défini sur l’invite de commandes (Windows). Pour modifier le profil par défaut, ouvrez la palette de commandes VS Code (Ctrl+Maj+P), entrez « Terminal : Sélectionner le profil par défaut », puis sélectionnez un autre profil dans le menu déroulant, par exemple Git Bash ou PowerShell.
Vérifiez que le conteneur est en cours d’exécution.
Dans la section CONTENEURS de l’extension Docker, recherchez le conteneur.
Développez le nœud Conteneurs individuels et vérifiez que « msdocspythoncontainerwebapp » est en cours d’exécution. Vous devez voir un symbole de triangle vert en regard du nom du conteneur s’il est en cours d’exécution.
Testez l’application web en cliquant avec le bouton droit sur le nom du conteneur et en sélectionnant Ouvrir dans le navigateur.
Le navigateur s’ouvre dans votre navigateur par défaut en tant que «http://127.0.0.1:8000" ; pour Django ou « http://127.0.0.1:5000/" pour Flask.
Arrêtez le conteneur .
Dans la section CONTENEURS de l’extension Docker, recherchez le conteneur en cours d’exécution.
Cliquez avec le bouton droit sur le conteneur, puis sélectionnez Arrêter.
Conseil
Vous pouvez également exécuter le conteneur en sélectionnant une configuration d’exécution ou de débogage. Les tâches d’extension Docker dans tasks.json sont appelées lorsque vous exécutez ou déboguez. La tâche appelée dépend de la configuration de lancement que vous sélectionnez. Pour la tâche « Docker : Python (local MongoDB) », spécifiez <YOUR-IP-ADDRESS>. Pour la tâche « Docker : Python (MongoDB Azure) », spécifiez <CONNECTION-STRING>.
# PORT=8000 for Django and 5000 for Flask
export PORT=<port-number>
export YOUR_IP_ADDRESS=<your-machine-ip-address>
docker run --rm -it \
--publish $PORT:$PORT --publish 27017:27017 \
--add-host mongoservice:$YOUR_IP_ADDRESS \
--env CONNECTION_STRING=mongodb://mongoservice:27017 --env DB_NAME=restaurants_reviews --env COLLECTION_NAME=restaurants_reviews \
msdocspythoncontainerwebapp:latest
La commande ci-dessus est mise en forme pour l’interpréteur de commandes Bash. Si vous utilisez PowerShell, l’invite de commandes ou un autre interpréteur de commandes, vous devrez peut-être ajuster la continuation de ligne et le format de variable d’environnement en conséquence.
# PORT=8000 for Django and 5000 for Flask
export PORT=<port-number>
export CONNECTION_STRING="<connection-string>"
docker run --rm -it \
--publish $PORT:$PORT/tcp \
--env CONNECTION_STRING=$CONNECTION_STRING --env DB_NAME=restaurants_reviews --env COLLECTION_NAME=restaurants_reviews \
msdocspythoncontainerwebapp:latest
La commande ci-dessus est mise en forme pour l’interpréteur de commandes Bash. Si vous utilisez PowerShell, l’invite de commandes ou un autre interpréteur de commandes, vous devrez peut-être ajuster la continuation de ligne et le format de variable d’environnement en conséquence.
La transmission d’informations sensibles comme indiqué ici est destinée à des fins de démonstration. Les informations chaîne de connexion peuvent être consultées en inspectant le conteneur avec l’inspection du conteneur Docker de commande. Une autre façon de gérer les secrets consiste à utiliser la fonctionnalité BuildKit de Docker.
Étape 2. Vérifiez que le conteneur est en cours d’exécution.
Vous devez voir votre conteneur « msdocspythoncontainerwebapp :latest :latest » dans la liste. Notez la NAMES colonne de la sortie et de la PORTS colonne. Vous pouvez utiliser le nom pour arrêter le conteneur.
Étape 3. Testez l’application web.
Allez à « http://127.0.0.1:8000" pour Django et « http://127.0.0.1:5000/" pour Flask lors de l’exécution avec MongoDB local.
Étape 4. Arrêter le conteneur
docker container stop <container-name>
Vous pouvez également démarrer un conteneur à partir d’une image et l’arrêter avec l’application Docker Desktop .