Vue d’ensemble de Python Container Apps dans Azure

Cet article explique comment passer du code de projet Python (par exemple, une application web) à un conteneur Docker déployé dans Azure. Nous avons abordé le processus général de conteneurisation, les options de déploiement pour les conteneurs dans Azure et la configuration spécifique à Python des conteneurs dans Azure.

La nature des conteneurs Docker est que la création d’une image Docker à partir du code et le déploiement de cette image sur un conteneur dans Azure est similaire dans les langages de programmation. Les considérations spécifiques au langage ( Python dans ce cas) se trouvent dans la configuration pendant le processus de conteneurisation dans Azure, en particulier la structure dockerfile et la configuration prenant en charge les frameworks web Python tels que Django, Flask et FastAPI.

Scénarios de flux de travail de conteneur

Pour le développement de conteneurs Python, certains flux de travail classiques pour passer du code au conteneur sont les suivants :

Scénario Description Workflow
Dev Générez des images Docker Python dans votre environnement de développement. Code : code de clone git pour l’environnement de développement (avec Docker installé).

Build : Utilisez Docker CLI, VS Code (avec extensions), PyCharm (avec plug-in). Décrit dans la section Utilisation des images et des conteneurs Docker Python.

Test : dans un environnement de développement dans un conteneur Docker.

Envoi (push) : vers un registre tel qu’Azure Container Registry, Docker Hub ou un registre privé.

Déployer : sur le service Azure à partir du Registre.
Hybride À partir de votre environnement de développement, générez des images Docker Python dans Azure. Code : code de clone git pour l’environnement de développement (non nécessaire pour que Docker soit installé).

Build : VS Code (avec extensions), Azure CLI.

Push : vers Azure Container Registry

Déployer : sur le service Azure à partir du Registre.
Microsoft Azure Tout dans le cloud ; utilisez Azure Cloud Shell pour générer du code d’images Docker Python à partir du dépôt GitHub. Code : git cloner le dépôt GitHub dans Azure Cloud Shell.

Build : dans Azure Cloud Shell, utilisez Azure CLI ou Docker CLI.

Envoi (push) : Vers un registre tel qu’Azure Container Registry, Docker Hub ou un registre privé.

Déployer : sur le service Azure à partir du Registre.

L’objectif final de ces flux de travail est d’avoir un conteneur s’exécutant dans l’une des ressources Azure prenant en charge les conteneurs Docker, comme indiqué dans la section suivante.

Un environnement de développement peut être votre station de travail locale avec Visual Studio Code ou PyCharm, Codespaces (un environnement de développement hébergé dans le cloud) ou Visual Studio Dev Containers (un conteneur en tant qu’environnement de développement).

Options de conteneur de déploiement dans Azure

Les applications conteneur Python sont prises en charge dans les services suivants.

Service Description
Web App pour conteneurs Un service d’hébergement entièrement géré pour les applications web conteneurisées, y compris les sites web et les API web. Les applications web conteneurisées sur Azure App Service peuvent être mises à l’échelle en fonction des besoins et utiliser des flux de travail CI/CD rationalisés avec Docker Hub, Azure Container Registry et GitHub. Idéal comme une rampe d’accès facile pour les développeurs à tirer parti de la plateforme Azure App Service entièrement managée, mais qui veulent également un seul artefact déployable contenant une application et toutes ses dépendances.

Exemple : Déployer une application web Flask ou FastPI sur Azure App Service.
Azure Container Apps (ACA) Un service de conteneur serverless entièrement managé alimenté par Kubernetes et des technologies open source telles que Dapr, KEDA et envoy. En fonction des meilleures pratiques et optimisées pour les conteneurs à usage général. L’infrastructure de cluster est gérée par ACA et l’accès direct à l’API Kubernetes n’est pas prise en charge. Fournit de nombreux concepts spécifiques à l’application sur les conteneurs, notamment les certificats, les révisions, la mise à l’échelle et les environnements. Idéal pour les équipes qui souhaitent commencer à créer des microservices de conteneur sans avoir à gérer la complexité sous-jacente de Kubernetes.

Exemple : Déployer une application web Flask ou FastPI sur Azure Container Apps.
Azure Container Instances (ACI) Offre serverless qui fournit un seul pod de conteneurs isolés Hyper-V à la demande. Facturé sur la consommation plutôt que sur les ressources approvisionnées. Les concepts comme la mise à l’échelle, l’équilibrage de charge et les certificats ne sont pas fournis avec les conteneurs ACI. Les utilisateurs interagissent souvent avec ACI via d’autres services ; par exemple, AKS pour l’orchestration. Idéal si vous avez besoin d’un bloc de construction moins « opinionné » qui ne s’aligne pas sur les scénarios pour utilisant Azure Container Apps.

Exemple : Créez une image conteneur pour le déploiement sur Azure Container Instances. (Le didacticiel n’est pas spécifique à Python, mais les concepts présentés s’appliquent à tous les langages.)
Azure Kubernetes Service (AKS) Option Kubernetes entièrement managée dans Azure. Prend en charge l’accès direct à l’API Kubernetes et exécute n’importe quelle charge de travail Kubernetes. Le cluster entier se trouve dans votre abonnement, avec les configurations et les opérations du cluster sous votre contrôle et votre responsabilité. Idéal pour les équipes qui recherchent une version entièrement managée de Kubernetes dans Azure.

Exemple : Déployez un cluster Azure Kubernetes Service à l’aide d’Azure CLI.
Azure Functions Solution basée sur les événements, fonctions en tant que service (FAAS) serverless. Partage de nombreuses caractéristiques avec Azure Container Apps autour de la mise à l’échelle et de l’intégration avec les événements, mais est optimisée pour les fonctions éphémères déployées en tant que code ou conteneurs. Idéal pour les équipes qui cherchent à déclencher l’exécution de fonctions sur des événements ; par exemple, pour établir une liaison à d’autres sources de données.

Exemple : Créez une fonction sur Linux à l’aide d’un conteneur personnalisé.

Pour obtenir une comparaison plus détaillée de ces services, consultez Comparaison de Container Apps avec d’autres options de conteneur Azure.

Environnements virtuels et conteneurs

Lorsque vous exécutez un projet Python dans un environnement de développement, l’utilisation d’un environnement virtuel est un moyen courant de gérer les dépendances et de garantir la reproductibilité de la configuration de votre projet. Un environnement virtuel dispose d’un interpréteur, de bibliothèques et de scripts Python installés qui sont requis par le code du projet exécuté dans cet environnement. Les dépendances pour les projets Python sont gérées via le fichier requirements.txt .

Conseil

Avec les conteneurs, les environnements virtuels ne sont pas nécessaires, sauf si vous les utilisez pour des raisons de test ou d’autres raisons. Si vous utilisez des environnements virtuels, ne les copiez pas dans l’image Docker. Utilisez le fichier .dockerignore pour les exclure.

Vous pouvez considérer les conteneurs Docker comme fournissant des fonctionnalités similaires à celles des environnements virtuels, mais avec d’autres avantages en matière de reproductibilité et de portabilité. Le conteneur Docker peut être exécuté partout où les conteneurs peuvent être exécutés, quel que soit le système d’exploitation.

Un conteneur Docker contient votre code de projet Python et tout ce que le code doit exécuter. Pour accéder à ce point, vous devez générer votre code de projet Python dans une image Docker, puis créer un conteneur, une instance exécutable de cette image.

Pour conteneuriser des projets Python, les fichiers clés sont les suivants :

Fichier projet Description
requirements.txt Utilisé pendant la génération de l’image Docker pour obtenir les dépendances appropriées dans l’image.
Dockerfile Permet de spécifier comment générer l’image Docker Python. Pour plus d’informations, consultez la section Instructions dockerfile pour Python.
.dockerignore Les fichiers et les répertoires dans .dockerignore ne sont pas copiés dans l’image Docker avec la COPY commande dans le fichier Dockerfile. Le fichier .dockerignore prend en charge les modèles d’exclusion similaires aux fichiers .gitignore . Pour plus d’informations, consultez le fichier .dockerignore.

L’exclusion de fichiers permet de générer des performances d’image, mais doit également être utilisée pour éviter d’ajouter des informations sensibles à l’image où elle peut être inspectée. Par exemple, . dockerignore doit contenir des lignes pour ignorer .env et .venv (environnements virtuels).

Paramètres de conteneur pour les frameworks web

Les frameworks web ont des ports par défaut sur lesquels ils écoutent les requêtes web. Lorsque vous utilisez certaines solutions de conteneur Azure, vous devez spécifier le port sur lequel votre conteneur écoute le trafic.

Framework web Port
Django 8000
Flask 5000 ou 5002
FastAPI (uvicorn) 8000 ou 80

Le tableau suivant montre comment définir le port pour les solutions de conteneur Azure différentes.

Solution de conteneur Azure Comment définir le port d’application web
Web App pour conteneurs Par défaut, App Service suppose que votre conteneur personnalisé écoute sur le port 80 ou 8080. Si votre conteneur écoute un autre port, définissez le paramètre d’application WEBSITES_PORT dans votre application App Service. Pour plus d’informations, consultez Configurer un conteneur personnalisé pour Azure App Service.
Azure Containers Apps Azure Container Apps vous permet d’exposer votre application conteneur au web public, à votre réseau virtuel ou à d’autres applications conteneur au sein de votre environnement en activant l’entrée. Définissez l’entrée targetPort sur le port que votre conteneur écoute pour les requêtes entrantes. Le point de terminaison d’entrée de l’application est toujours exposé sur le port 443. Pour plus d’informations, consultez Configurer l’entrée HTTPS ou TCP dans Azure Container Apps.
Azure Container Instances, Azure Kubernetes Définissez le port lors de la création d’un conteneur. Vous devez vous assurer que votre solution dispose d’un framework web, d’un serveur d’applications (par exemple, gunicorn, uvicorn) et d’un serveur web (par exemple, nginx). Par exemple, vous pouvez créer deux conteneurs, un conteneur avec un framework web et un serveur d’applications, et un autre framework avec un serveur web. Les deux conteneurs communiquent sur un port et le conteneur de serveur web expose 80/443 pour les requêtes externes.

Python Dockerfile

Un fichier Dockerfile est un fichier texte qui contient des instructions pour créer une image Docker. La première ligne indique l’image de base à commencer. Cette ligne est suivie d’instructions pour installer les programmes requis, copier des fichiers et d’autres instructions pour créer un environnement de travail. Par exemple, certains exemples spécifiques à Python pour les instructions de fichier Dockerfile Python clés s’affichent dans le tableau ci-dessous.

Instruction Objectif Exemple
FROM Définit l’image de base pour les instructions suivantes. FROM python:3.8-slim
EXPOSER Indique à Docker que le conteneur écoute sur les ports réseau spécifiés au moment de l’exécution. EXPOSE 5000
COPY Copie les fichiers ou répertoires de la source spécifiée et les ajoute au système de fichiers du conteneur au chemin de destination spécifié. COPY . /app
COURIR Exécute une commande à l’intérieur de l’image Docker. Par exemple, extrayez les dépendances. La commande s’exécute une fois au moment de la génération. RUN python -m pip install -r requirements.txt
CMD La commande fournit la valeur par défaut pour l’exécution d’un conteneur. Il ne peut y avoir qu’une seule instruction CMD. CMD ["gunicorn", "--bind", "0.0.0.0:5000", "wsgi:app"]

La commande de build Docker génère des images Docker à partir d’un fichier Dockerfile et d’un contexte. Le contexte d’une build est l’ensemble de fichiers situés dans le chemin d’accès ou l’URL spécifiés. En règle générale, vous allez générer une image à partir de la racine de votre projet Python et le chemin d’accès de la commande de build est « ». Comme indiqué dans l’exemple suivant.

docker build --rm --pull  --file "Dockerfile"  --tag "mywebapp:latest"  .

Le processus de génération peut faire référence à l’un des fichiers dans le contexte. Par exemple, votre build peut utiliser une instruction COPY pour référencer un fichier dans le contexte. Voici un exemple de fichier Dockerfile pour un projet Python à l’aide de l’infrastructure Flask :

FROM python:3.8-slim

EXPOSE 5000

# Keeps Python from generating .pyc files in the container.
ENV PYTHONDONTWRITEBYTECODE=1

# Turns off buffering for easier container logging
ENV PYTHONUNBUFFERED=1

# Install pip requirements.
COPY requirements.txt .
RUN python -m pip install -r requirements.txt

WORKDIR /app
COPY . /app

# Creates a non-root user with an explicit UID and adds permission to access the /app folder.
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser

# Provides defaults for an executing container; can be overridden with Docker CLI.
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "wsgi:app"]

Vous pouvez créer un fichier Dockerfile manuellement ou le créer automatiquement avec VS Code et l’extension Docker. Pour plus d’informations, consultez Génération de fichiers Docker.

La commande de build Docker fait partie de l’interface CLI Docker. Lorsque vous utilisez des ID comme VS Code ou PyCharm, les commandes d’interface utilisateur pour utiliser des images Docker appellent la commande de build pour vous et automatisent la spécification des options.

Utilisation d’images et de conteneurs Docker Python

VS Code et PyCharm

L’utilisation d’un environnement de développement intégré (IDE) pour le développement de conteneurs Python n’est pas nécessaire, mais peut simplifier de nombreuses tâches liées au conteneur. Voici quelques-unes des opérations que vous pouvez effectuer avec VS Code et PyCharm.

  • Téléchargez et générez des images Docker.

    • Générez des images dans votre environnement de développement.
    • Générez des images Docker dans Azure sans Docker installé dans l’environnement de développement. (Pour PyCharm, utilisez Azure CLI pour générer des images dans Azure.)
  • Créez et exécutez des conteneurs Docker à partir d’une image existante, d’une image extraite ou directement à partir d’un fichier Dockerfile.

  • Exécutez des applications multicontainer avec Docker Compose.

  • Connecter et utilisez des registres de conteneurs tels que Docker Hub, GitLab, JetBrains Space, Docker V2 et d’autres registres Docker auto-hébergés.

  • (VS Code uniquement) Ajoutez un fichier Dockerfile et des fichiers docker compose qui sont adaptés à votre projet Python.

Pour configurer VS Code et PyCharm pour exécuter des conteneurs Docker dans votre environnement de développement, procédez comme suit.

Si ce n’est déjà fait, installez Azure Tools pour VS Code.

Instructions Capture d'écran
Étape 1 : Utilisez maj + alt + A pour ouvrir l’extension Azure et confirmer que vous êtes connecté à Azure.

Vous pouvez également sélectionner l’icône Azure dans la barre d’extensions VS Code.

Si vous n’êtes pas connecté, sélectionnez Se connecter à Azure et suivez les invites.

Si vous avez des difficultés à accéder à votre abonnement Azure, cela peut être dû au fait que vous êtes derrière un proxy. Pour résoudre les problèmes de connexion, consultez Network Connecter ions dans Visual Studio Code.
Screenshot showing how Azure Tools looks once signed in.Screenshot showing how Azure Tools looks if you aren't signed in.
Étape 2 : Utilisez Ctrl + Maj + X pour ouvrir les extensions, rechercher l’extension Docker et installer l’extension.

Vous pouvez également sélectionner l’icône Extensions dans la barre d’extensions VS Code.
Screenshot showing how to add Docker extension to VS Code.
Étape 3 : Sélectionnez l’icône Docker dans la barre d’extension, développez des images et cliquez avec le bouton droit sur une image qui l’exécute en tant que conteneur. Screenshot showing how to use the Docker extension in VS Code to run a container from a Docker image.
Étape 4 : Surveiller la sortie de l’exécution Docker dans la fenêtre terminale. Screenshot showing an example of running a container in VS Code.

Azure CLI et Docker CLI

Vous pouvez également utiliser des images et des conteneurs Docker Python à l’aide d’Azure CLI et de Docker CLI. VS Code et PyCharm ont des terminaux dans lesquels vous pouvez exécuter ces CLIs.

Utilisez une interface CLI lorsque vous souhaitez contrôler plus finement les arguments de génération et d’exécution, et pour l’automatisation. Par exemple, la commande suivante montre comment utiliser la build Azure CLI az acr pour spécifier le nom de l’image Docker.

az acr build --registry <registry-name> \
  --resource-group <resource-group> \
  --target pythoncontainerwebapp:latest .

Comme autre exemple, considérez la commande suivante qui montre comment utiliser la commande d’exécution de l’interface de ligne de commande Docker. L’exemple montre comment exécuter un conteneur Docker qui communique avec une instance MongoDB dans votre environnement de développement, en dehors du conteneur. Les différentes valeurs à effectuer sont plus faciles à automatiser lorsqu’elles sont spécifiées dans une ligne de commande.

docker run --rm -it \
  --publish <port>:<port> --publish 27017:27017 \
  --add-host mongoservice:<your-server-IP-address> \
  --env CONNECTION_STRING=mongodb://mongoservice:27017 \
  --env DB_NAME=<database-name> \
  --env COLLECTION_NAME=<collection-name> \
  containermongo:latest  

Pour plus d’informations sur ce scénario, consultez Générer et tester une application web Python en conteneur localement.

Variables d’environnement dans les conteneurs

Les projets Python utilisent souvent des variables d’environnement pour transmettre des données au code. Par exemple, vous pouvez spécifier des informations de connexion de base de données dans une variable d’environnement afin qu’elles puissent être facilement modifiées pendant les tests. Ou, lors du déploiement du projet en production, la connexion de base de données peut être modifiée pour faire référence à une instance de base de données de production.

Les packages tels que python-dotenv sont souvent utilisés pour lire des paires clé-valeur à partir d’un fichier .env et les définir en tant que variables d’environnement. Un fichier .env est utile lors de l’exécution dans un environnement virtuel, mais n’est pas recommandé lors de l’utilisation de conteneurs. Ne copiez pas le fichier .env dans l’image Docker, en particulier s’il contient des informations sensibles et que le conteneur sera rendu public. Utilisez le fichier .dockerignore pour exclure les fichiers d’être copiés dans l’image Docker. Pour plus d’informations, consultez la section Environnements virtuels et conteneurs dans cet article.

Vous pouvez transmettre des variables d’environnement à des conteneurs de plusieurs façons :

  1. Défini dans le fichier Dockerfile en tant qu’instructions ENV.
  2. Transmis en tant qu’arguments --build-arg avec la commande de build Docker.
  3. Transmis en tant qu’arguments --secret avec la commande de build Docker et le back-end BuildKit .
  4. Transmis en tant qu’arguments --env--env-file avec la commande Docker Run .

Les deux premières options présentent le même inconvénient que celui indiqué ci-dessus avec les fichiers .env , à savoir que vous décodez en dur des informations potentiellement sensibles dans une image Docker. Vous pouvez inspecter une image Docker et voir les variables d’environnement, par exemple, avec l’image docker de commande inspecter.

La troisième option avec BuildKit vous permet de transmettre des informations secrètes à utiliser dans le fichier Dockerfile pour créer des images Docker de manière sécurisée qui ne seront pas stockées dans l’image finale.

La quatrième option de transmission de variables d’environnement avec la commande Docker Run signifie que l’image Docker ne contient pas les variables. Toutefois, les variables sont toujours visibles lors de l’inspection de l’instance de conteneur (par exemple, avec docker container inspect). Cette option peut être acceptable lorsque l’accès à l’instance de conteneur est contrôlé ou dans des scénarios de test ou de développement.

Voici un exemple de passage de variables d’environnement à l’aide de la commande d’exécution docker CLI et de l’argument --env .

# PORT=8000 for Django and 5000 for Flask
export PORT=<port-number>

docker run --rm -it \
  --publish $PORT:$PORT \
  --env CONNECTION_STRING=<connection-info> \
  --env DB_NAME=<database-name> \
  <dockerimagename:tag>

Si vous utilisez VS Code ou PyCharm, les options d’interface utilisateur pour l’utilisation d’images et de conteneurs utilisent finalement des commandes Docker CLI comme celle indiquée ci-dessus.

Enfin, la spécification de variables d’environnement lors du déploiement d’un conteneur dans Azure est différente de l’utilisation de variables d’environnement dans votre environnement de développement. Par exemple :

  • Pour Web App for Containers, vous configurez les paramètres d’application lors de la configuration d’App Service. Ces paramètres sont accessibles au code de votre application en tant que variables d’environnement à l’aide du modèle os.environ standard. Vous pouvez modifier les valeurs après le déploiement initial si nécessaire. Pour plus d’informations, consultez Paramètres d’application Access en tant que variables d’environnement.

  • Pour Azure Container Apps, vous configurez des variables d’environnement lors de la configuration initiale de l’application conteneur. La modification ultérieure des variables d’environnement crée une révision du conteneur. En outre, Azure Container Apps vous permet de définir des secrets au niveau de l’application, puis de les référencer dans des variables d’environnement. Pour plus d’informations, consultez Gérer les secrets dans Azure Container Apps.

En guise d’autre option, vous pouvez utiliser le Connecter de service pour vous aider à connecter des services de calcul Azure à d’autres services de stockage. Ce service configure les paramètres réseau et les informations de connexion (par exemple, la génération de variables d’environnement) entre des services de calcul et des services de soutien cible dans le plan de gestion.

Affichage des journaux d’activité de conteneurs

Affichez les journaux d’activité d’instance de conteneur pour afficher la sortie des messages de diagnostic à partir du code et résoudre les problèmes dans le code de votre conteneur. Voici plusieurs façons d’afficher les journaux lors de l’exécution d’un conteneur dans votre environnement de développement :

  • L’exécution d’un conteneur avec VS Code ou PyCharm, comme indiqué dans la section VS Code et PyCharm, vous pouvez voir les journaux dans les fenêtres de terminal ouvertes lors de l’exécution de Docker.

  • Si vous utilisez la commande d’exécution de l’interface CLI Docker avec l’indicateur -itinteractif, vous verrez la sortie suivant la commande.

  • Dans Docker Desktop, vous pouvez également afficher les journaux d’activité d’un conteneur en cours d’exécution.

Lorsque vous déployez un conteneur dans Azure, vous avez également accès aux journaux de conteneur. Voici plusieurs services Azure et comment accéder aux journaux de conteneur dans Portail Azure.

Service Azure Comment accéder aux journaux d’activité dans Portail Azure
Web App pour conteneurs Accédez à la ressource Diagnostiquer et résoudre les problèmes pour afficher les journaux. Diagnostics est une expérience intelligente et interactive pour vous aider à résoudre les problèmes de votre application sans configuration requise. Pour une vue en temps réel des journaux, accédez au flux de journal d’analyse - . Pour obtenir des requêtes et une configuration de journal plus détaillées, consultez les autres ressources sous Surveillance.
Azure Container Apps Accédez à la ressource d’environnement Diagnostiquer et résoudre les problèmes pour résoudre les problèmes d’environnement. Plus souvent, vous souhaiterez voir les journaux d’activité de conteneur. Dans la ressource de conteneur, sous Gestion de révision d’application - , sélectionnez la révision et, à partir de là, vous pouvez afficher les journaux système et console. Pour obtenir des requêtes et une configuration de journal plus détaillées, consultez les ressources sous Surveillance.
Azure Container Instances Accédez à la ressource Conteneurs et sélectionnez Journaux.

Pour les mêmes services répertoriés ci-dessus, voici les commandes Azure CLI pour accéder aux journaux.

Service Azure Commande Azure CLI pour accéder aux journaux d’activité
Web App pour conteneurs az webapp log
Azure Container Apps az containerapps logs
Azure Container Instances az container logs

Il existe également la prise en charge de l’affichage des journaux d’activité dans VS Code. Azure Tools pour VS Code doit être installé. Voici un exemple d’affichage des journaux Web Apps for Containers (App Service) dans VS Code.

Screenshot showing how to view logs in VS Code for Web Apps for Containers.

Étapes suivantes