Distribuire un'app Web Flask o FastAPI in contenitori nel servizio app Azure
Questa esercitazione illustra come distribuire un'app Web Python Flask o FastAPI in app Azure Service usando la funzionalità App Web per contenitori. L'app Web per contenitori offre agli sviluppatori una semplice possibilità di sfruttare la piattaforma del servizio app Azure completamente gestita, ma che vuole anche un singolo artefatto distribuibile contenente un'app e tutte le relative dipendenze. Per altre informazioni sull'uso dei contenitori in Azure, vedere Confronto delle opzioni dei contenitori di Azure.
In questa esercitazione si usa l'interfaccia della riga di comando di Docker e Docker per creare facoltativamente un'immagine Docker e testarla in locale. Usare l'interfaccia della riga di comando di Azure per creare un'immagine Docker in un Registro Azure Container e distribuirla nel servizio app Azure. L'app Web viene configurata con l'identità gestita assegnata dal sistema (connessioni senza password) e l'accesso in base al ruolo di Azure per eseguire il pull dell'immagine Docker dalla Registro Azure Container durante la distribuzione. È anche possibile eseguire la distribuzione con Visual Studio Code con l'estensione Strumenti di Azure installata.
Per un esempio di compilazione e creazione di un'immagine Docker da eseguire in App Azure Container, vedere Distribuire un'app Web Flask o FastPI in App Contenitore di Azure.
Nota
Questa esercitazione illustra la creazione di un'immagine Docker che può essere eseguita in servizio app. Non è necessario usare servizio app. È possibile distribuire il codice direttamente da un'area di lavoro locale per servizio app senza creare un'immagine Docker. Per un esempio, vedere Avvio rapido: Distribuire un'app Web Python (Django o Flask) nel servizio app Azure.
Prerequisiti
Per completare questa esercitazione è necessario:
Un account Azure in cui è possibile distribuire un'app Web nel servizio app Azure e Registro Azure Container. Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.
Interfaccia della riga di comando di Azure per creare un'immagine Docker e distribuirla in servizio app. Facoltativamente, Dockere l'interfaccia della riga di comando docker per creare un Docker e testarlo nell'ambiente locale.
Scaricare il codice di esempio
Nell'ambiente locale ottenere il codice.
git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart.git
cd msdocs-python-flask-webapp-quickstart
Aggiungere file Dockerfile e dockerignore
Aggiungere un Dockerfile per indicare a Docker come compilare l'immagine. Il Dockerfile specifica l'uso di Gunicorn, un server Web a livello di produzione che inoltra le richieste Web ai framework Flask e FastAPI. I comandi ENTRYPOINT e CMD indicano a Gunicorn di gestire le richieste per l'oggetto app.
# 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
viene usato per la porta del contenitore (interna) in questo esempio, ma è possibile usare qualsiasi porta libera.
Controllare il file requirements.txt per assicurarsi che contenga gunicorn
.
Flask==2.2.2
gunicorn
Werkzeug==2.2.2
Aggiungere un file con estensione dockerignore per escludere i file non necessari dall'immagine.
.git*
**/*.pyc
.venv/
Configurare gunicorn
Gunicorn può essere configurato con un file gunicorn.conf.py . Quando il file gunicorn.conf.py si trova nella stessa directory in cui viene eseguito gunicorn, non è necessario specificarne la posizione nel Dockerfile. Per altre informazioni sulla specifica del file di configurazione, vedere Impostazioni di Gunicorn.
In questa esercitazione, il file di configurazione suggerito configura gunicorn per aumentare il numero di ruoli di lavoro in base al numero di core CPU disponibili. Per altre informazioni sulle impostazioni dei file di gunicorn.conf.py , vedere Configurazione di Gunicorn.
# 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
Compilare ed eseguire l'immagine in locale
Compilare l'immagine in locale.
Nota
Se il docker build
comando restituisce un errore, assicurarsi che il docker deamon sia in esecuzione. In Windows verificare che Docker Desktop sia in esecuzione.
Eseguire l'immagine in locale in un contenitore Docker.
docker run --detach --publish 5000:50505 flask-demo
Aprire l'URL http://localhost:5000
nel browser per visualizzare l'app Web in esecuzione in locale.
L'opzione --detach
esegue il contenitore in background. L'opzione --publish
esegue il mapping della porta del contenitore a una porta nell'host. La porta host (esterna) è la prima nella coppia e la porta del contenitore (interna) è la seconda. Per altre informazioni, vedere Informazioni di riferimento sull'esecuzione di Docker.
Creare un gruppo di risorse e Registro Azure Container
Eseguire il comando az login per accedere ad Azure.
az login
Eseguire il comando az upgrade per assicurarsi che la versione dell'interfaccia della riga di comando di Azure sia corrente.
az upgrade
Creare un gruppo con il comando az group create .
az group create --name web-app-simple-rg --location eastus
Un gruppo di risorse di Azure è un contenitore logico in cui le risorse di Azure vengono distribuite e gestite. Quando si crea un gruppo di risorse, si specifica una località, ad esempio eastus.
Creare un Registro Azure Container con il comando az acr create.
az acr create --resource-group web-app-simple-rg \ --name webappacr123 --sku Basic
Nota
Il nome del Registro di sistema deve essere univoco in Azure. Se viene visualizzato un errore, provare un nome diverso. I nomi del Registro di sistema possono essere costituiti da 5-50 caratteri alfanumerici. Non sono consentiti trattini e caratteri di sottolineatura. Per altre informazioni, vedere Registro Azure Container regole dei nomi. Se si usa un nome diverso, assicurarsi di usare il nome anziché
webappacr123
nei comandi che fanno riferimento agli artefatti del Registro di sistema e del Registro di sistema nelle sezioni seguenti.Un Registro Azure Container è un registro Docker privato che archivia le immagini da usare in Istanze di Azure Container, servizio app Azure, servizio Azure Kubernetes e altri servizi. Quando si crea un Registro di sistema, si specifica un nome, uno SKU e un gruppo di risorse.
Compilare l'immagine in Registro Azure Container
Compilare l'immagine Docker in Azure con il comando az acr build . Il comando usa il Dockerfile nella directory corrente ed esegue il push dell'immagine nel Registro di sistema.
az acr build \
--resource-group web-app-simple-rg \
--registry webappacr123 \
--image webappsimple:latest .
L'opzione --registry
specifica il nome del Registro di sistema e l'opzione --image
specifica il nome dell'immagine. Il nome dell'immagine è nel formato registry.azurecr.io/repository:tag
.
Distribuire un'app Web in Azure
Creare un piano servizio app con il comando az appservice plan.
az appservice plan create \ --name webplan \ --resource-group web-app-simple-rg \ --sku B1 \ --is-linux
Impostare una variabile di ambiente sul proprio ID sottoscrizione. Viene usato nel
--scope
parametro nel comando successivo.SUBSCRIPTION_ID=$(az account show --query id --output tsv)
Il comando per la creazione della variabile di ambiente viene visualizzato per la shell Bash. Modificare la sintassi in base alle esigenze di altri ambienti.
Creare l'app Web con il comando 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
Note:
Il nome dell'app Web deve essere univoco in Azure. Se viene visualizzato un errore, provare un nome diverso. Il nome può essere costituito da caratteri alfanumerici e trattini, ma non può iniziare o terminare con un trattino. Per altre informazioni, vedere Regole dei nomi Microsoft.Web.
Se si usa un nome diverso da
webappacr123
quello del Registro Azure Container, assicurarsi di aggiornare il--container-image-name
parametro in modo appropriato.I
--assign-identity
parametri ,--role
e--scope
abilitano l'identità gestita assegnata dal sistema nell'app Web e assegnano ilAcrPull
ruolo nel gruppo di risorse. In questo modo l'identità gestita è autorizzata a eseguire il pull delle immagini da qualsiasi Registro Azure Container nel gruppo di risorse.I
--acr-use-identity
parametri e--acr-identity
configurano l'app Web per l'uso dell'identità gestita assegnata dal sistema per eseguire il pull delle immagini dal Registro Azure Container.La creazione dell'app Web può richiedere alcuni minuti. È possibile controllare i log di distribuzione con il comando az webapp log tail . Ad esempio:
az webapp log tail --resource-group web-app-simple-rg --name webappsimple123
. Se vengono visualizzate voci con "warmup", il contenitore viene distribuito.L'URL dell'app Web è
<web-app-name>.azurewebsites.net
, ad esempiohttps://webappsimple123.azurewebsites.net
.
Apportare aggiornamenti e ridistribuire
Dopo aver apportato modifiche al codice, è possibile ridistribuire in servizio app con i comandi az acr build e az webapp update.
Eseguire la pulizia
Tutte le risorse di Azure create in questa esercitazione si trovano nello stesso gruppo di risorse. La rimozione del gruppo di risorse rimuove tutte le risorse nel gruppo di risorse ed è il modo più rapido per rimuovere tutte le risorse di Azure usate per l'app.
Per rimuovere le risorse, usare il comando az group delete .
az group delete --name web-app-simple-rg
È anche possibile rimuovere il gruppo nel portale di Azure o in Visual Studio Code e nell'estensione Strumenti di Azure.
Passaggi successivi
Per ulteriori informazioni, vedi le seguenti risorse: