Bereitstellen einer containerisierten Flask- oder FastAPI-Web-App in Azure App Service
In diesem Tutorial erfahren Sie, wie Sie eine Python Flask- oder FastAPI-Web-App mithilfe der Funktion Web-App für Container in Azure App Service bereitstellen. Die Web-App für Container bietet Entwicklern einen einfachen Einstieg, um die Vorteile der vollständig verwalteten Azure App Service-Plattform zu nutzen, die aber auch ein einzelnes Artefakt zur Bereitstellung wünschen, das eine App und alle ihre Abhängigkeiten enthält. Weitere Informationen zur Verwendung von Containern in Azure finden Sie unter Vergleich von Azure-Containeroptionen.
In diesem Tutorial verwenden Sie die Docker-CLI und Docker, um optional ein Docker-Image zu erstellen und es lokal zu testen. Sie verwenden die Azure-CLI, um ein Docker-Image in einer Azure-Containerregistrierung zu erstellen und es in Azure App Service bereitzustellen. Die Web-App ist mit ihrer vom System zugewiesenen verwalteten Identität (kennwortlose Verbindungen) und dem rollenbasierten Azure-Zugriff konfiguriert, um das Docker-Image während der Bereitstellung aus der Azure Containerregistrierung zu ziehen. Sie können auch Visual Studio Code mit installierter Azure Tools Extension für die Bereitstellung verwenden.
Ein Beispiel für den Aufbau und die Erstellung eines Docker-Images zur Ausführung in Azure Container Apps finden Sie unter Bereitstellung einer Flask- oder FastPI-Web-Apps in Azure Container Apps.
Hinweis
In diesem Tutorial wird gezeigt, wie ein Docker-Image erstellt wird, das dann in App Service ausgeführt werden kann. Dies ist für die Nutzung von App Service nicht erforderlich. Sie können Code direkt aus einem lokalen Arbeitsbereich in App Service bereitstellen, ohne ein Docker-Image zu erstellen. Ein Beispiel sehen Sie unter Quickstart: Bereitstellung einer Python-Web-App (Django oder Flask) für Azure App Service.
Voraussetzungen
Um die Schritte dieses Tutorials abzuschließen, benötigen Sie Folgendes:
Ein Azure-Konto, über das Sie eine Web-App für Azure App Service und Azure Containerregistrierung bereitstellen können. Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.
Azure CLI zum Erstellen eines Docker-Images und dessen Bereitstellung in App Service. Und optional Docker und die Docker-CLI, um ein Docker zu erstellen und es in Ihrer lokalen Umgebung zu testen.
Beispielcode herunterladen
Rufen Sie in Ihrer Umgebung den Code ab.
git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart.git
cd msdocs-python-flask-webapp-quickstart
Hinzufügen von Dockerfile- und .dockerignore-Dateien
Fügen Sie einen Dockerfile hinzu, um Docker anzuweisen, wie das Image erstellt werden soll. Der Dockerfile gibt die Verwendung von Gunicorn an, einem Webserver auf Produktionsebene, der Anforderungen an die Frameworks Flask und FastAPI weiterleitet. Die Befehle ENTRYPOINT und CMD weisen Gunicorn an, Anforderungen für das App-Objekt zu verarbeiten.
# syntax=docker/dockerfile:1
FROM python:3.11
WORKDIR /code
COPY requirements.txt .
RUN pip3 install -r requirements.txt
COPY . .
EXPOSE 50505
ENTRYPOINT ["gunicorn", "app:app"]
50505
wird in diesem Beispiel für den Containerport (intern) verwendet, aber Sie können jeden freien Port verwenden.
Überprüfen Sie die Datei requirements.txt, um sicherzustellen, dass sie gunicorn
enthält.
Flask==2.2.2
gunicorn
Werkzeug==2.2.2
Fügen Sie eine .dockerignore-Datei hinzu, um unnötige Dateien aus dem Bild auszuschließen.
.git*
**/*.pyc
.venv/
Konfiguration von Gunicorn
Gunicorn kann mit einer gunicorn.conf.py-Datei konfiguriert werden. Wenn sich die Datei gunicorn.conf.py im selben Verzeichnis befindet, in dem Gunicorn ausgeführt wird, müssen Sie ihren Speicherort nicht in der Dockerfile angeben. Weitere Informationen zur Angabe der Konfigurationsdatei finden Sie unter Gunicorn-Einstellungen.
In diesem Tutorial wird Gunicorn mithilfe der vorgeschlagenen Konfigurationsdatei so konfiguriert, dass die Anzahl der Mitarbeiter basierend auf der Anzahl der verfügbaren Cores erhöht wird. Weitere Informationen zu Einstellungen von gunicorn.conf.py-Dateien, finden Sie unter Gunicorn-Konfiguration.
# Gunicorn configuration file
import multiprocessing
max_requests = 1000
max_requests_jitter = 50
log_file = "-"
bind = "0.0.0.0:50505"
workers = (multiprocessing.cpu_count() * 2) + 1
threads = workers
timeout = 120
Lokales Erstellen und Ausführen des Images
Lokale Erstellung des Images.
Hinweis
Wenn der Befehl docker build
einen Fehler zurückgibt, stellen Sie sicher, dass der Docker-Daemon ausgeführt wird. Stellen Sie unter Windows sicher, dass Docker Desktop ausgeführt wird.
Führen Sie das Image lokal in einem Docker-Container aus.
docker run --detach --publish 5000:50505 flask-demo
Öffnen Sie die http://localhost:5000
URL in Ihrem Browser, um die Web-App lokal auszuführen.
Die --detach
Option führt den Container im Hintergrund aus. Die --publish
Option ordnet den Containerport einem Port auf dem Host zu. Der (externe) Host-Port steht an erster Stelle des Paares und der (interne) Container-Port an zweiter Stelle. Weitere Informationen finden Sie in der Referenz zur Docker-Ausführung.
Erstellen Sie eine Ressourcengruppe und ein Azure-Container-Register
Führen Sie den Befehl az login aus, um sich bei Azure anzumelden.
az login
Führen Sie den Befehl az upgrade aus, um sicherzustellen, dass Ihre Version von Azure CLI aktuell ist.
az upgrade
Erstellen Sie eine Gruppe mit dem Befehl az group create.
az group create --name web-app-simple-rg --location eastus
Eine Azure-Ressourcengruppe ist ein logischer Container, in dem Azure-Ressourcen bereitgestellt und verwaltet werden. Wenn Sie eine Ressourcengruppe erstellen, geben Sie einen Speicherort an, z. B. eastus.
Erstellen Sie eine Azure Containerregistrierung mit dem Befehl az acr create.
az acr create --resource-group web-app-simple-rg \ --name webappacr123 --sku Basic
Hinweis
Der Registrierungsname muss in Azure eindeutig sein. Wenn Sie eine Fehlermeldung erhalten, versuchen Sie es mit einem anderen Namen. Registernamen können aus 5-50 alphanumerischen Zeichen bestehen. Bindestriche und Unterstriche sind nicht erlaubt. Weitere Informationen erhalten Sie unter Namensregeln für Azure Containerregistrierung. Wenn Sie einen anderen Namen verwenden, achten Sie darauf, dass Sie in den Befehlen, die in den folgenden Abschnitten auf die Registrierung und die Registrierungsartefakte verweisen, Ihren Namen und nicht
webappacr123
verwenden.Eine Azure Containerregistrierung ist eine private Docker-Registrierung, die Images zur Verwendung in Azure Container Instances, Azure App Service, Azure Kubernetes Service und anderen Diensten speichert. Wenn Sie eine Registrierung erstellen, geben Sie einen Namen, eine SKU und eine Ressourcengruppe an.
Erstellen eines Image in Azure Containerregistrierung
Erstellen Sie das Docker-Image in Azure mit dem Befehl az acr build. Der Befehl verwendet die Dockerdatei im aktuellen Verzeichnis und überträgt das Image in die Registrierung.
az acr build \
--resource-group web-app-simple-rg \
--registry webappacr123 \
--image webappsimple:latest .
Die Option --registry
gibt den Registrierungsnamen an und die Option --image
den Namen des Images. Der Image-Name hat das folgende Format registry.azurecr.io/repository:tag
.
Bereitstellen der Web-App in Azure
Erstellen Sie einen App Service Plan mit dem Befehl az appservice plan.
az appservice plan create \ --name webplan \ --resource-group web-app-simple-rg \ --sku B1 \ --is-linux
Setzen Sie eine Umgebungsvariable auf Ihre Abonnement-ID. Diese wird im Parameter
--scope
des nächsten Befehls verwendet.SUBSCRIPTION_ID=$(az account show --query id --output tsv)
Der Befehl zur Erstellung der Umgebungsvariablen wird für die Bash-Shell angezeigt. Ändern Sie die Syntax entsprechend für andere Umgebungen.
Erstellen Sie die Web-App mit dem Befehl az webapp create.
az webapp create \ --resource-group web-app-simple-rg \ --plan webplan --name webappsimple123 \ --assign-identity [system] \ --role AcrPull \ --scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/web-app-simple-rg \ --acr-use-identity --acr-identity [system] \ --container-image-name webappacr123.azurecr.io/webappsimple:latest
Hinweise:
Der Name der Web-App muss in Azure eindeutig sein. Wenn Sie eine Fehlermeldung erhalten, versuchen Sie es mit einem anderen Namen. Der Name kann aus alphanumerischen Zeichen und Bindestrichen bestehen, darf aber nicht mit einem Bindestrich beginnen oder enden. Weitere Informationen finden Sie unter Microsoft.Web Namensregeln.
Wenn Sie einen anderen Namen als
webappacr123
für Ihre Azure Containerregistrierung verwenden, stellen Sie sicher, dass Sie den Parameter--container-image-name
entsprechend aktualisieren.Die Parameter
--assign-identity
,--role
und--scope
aktivieren die vom System zugewiesene verwaltete Identität in der Web-App und weisen ihr dieAcrPull
Rolle in der Ressourcengruppe zu. Damit erhält die verwaltete Identität die Berechtigung, Images von jeder Azure Containerregistrierung in der Ressourcengruppe zu beziehen.Die Parameter
--acr-use-identity
und--acr-identity
konfigurieren die Web-App so, dass sie ihre vom System zugewiesene verwaltete Identität verwendet, um Images aus der Azure Containerregistrierung zu beziehen.Es kann ein paar Minuten dauern, bis die Web-App erstellt ist. Sie können die Protokolle der Bereitstellung mit dem Befehl az webapp log tail überprüfen. Beispiel:
az webapp log tail --resource-group web-app-simple-rg --name webappsimple123
. Wenn Sie Einträge mit „warmup“ sehen, wird der Container gerade bereitgestellt.Die URL der Web-App lautet
<web-app-name>.azurewebsites.net
, z. B.https://webappsimple123.azurewebsites.net
.
Aktualisierungen vornehmen und erneut bereitstellen
Nachdem Sie Codeänderungen vorgenommen haben, können Sie den App Service mit den Befehlen az acr build und az webapp update erneut bereitstellen.
Bereinigung
Alle in diesem Tutorial erstellten Azure-Ressourcen befinden sich in der gleichen Ressourcengruppe. Das Entfernen der Ressourcengruppe entfernt alle Ressourcen in der Ressourcengruppe und ist der schnellste Weg, um alle Azure-Ressourcen zu entfernen, die für Ihre App verwendet werden.
Um Ressourcen zu entfernen, verwenden Sie den Befehl az group delete.
az group delete --name web-app-simple-rg
Sie können die Gruppe auch im Azure-Portal oder in Visual Studio Code und der Azure Tools Extension entfernen.
Nächste Schritte
Weitere Informationen finden Sie in den folgenden Ressourcen: