Condividi tramite


Distribuire un'app Web Flask o FastAPI in contenitori nel servizio app Azure

Questa esercitazione illustra come effettuare il deployment di un'app Web Python Flask o FastAPI in Azure App Service usando la funzionalità Web App for Containers. Questo approccio offre un percorso semplificato per gli sviluppatori che vogliono i vantaggi di una piattaforma completamente gestita durante la distribuzione dell'app come singolo artefatto in contenitori con tutte le dipendenze incluse. 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 compilare e testare facoltativamente un'immagine Docker in locale. Si usa quindi l'interfaccia della riga di comando di Azure per eseguire il push dell'immagine Docker in Registro Azure Container e distribuirla nel servizio app di Azure. L'app Web è configurata con l'identità gestita assegnata dal sistema per un accesso sicuro e senza password per recuperare l'immagine da Azure Container Registry usando il controllo degli accessi basato sui ruoli di Azure. È anche possibile eseguire la distribuzione con Visual Studio Code con l'estensione Strumenti di Azure installata.

Per un esempio di costruzione e creazione di un'immagine Docker da eseguire in Azure Container Apps, vedere Distribuire un'app Web Flask o FastAPI in Azure Container Apps.

Nota

Questa esercitazione illustra come creare un'immagine Docker che può essere distribuita nel servizio app di Azure. Tuttavia, l'uso di un'immagine Docker non è necessario per la distribuzione nel servizio app. È anche possibile distribuire il codice dell'applicazione direttamente dall'area di lavoro locale al 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:

Scaricare il codice di esempio

Nell'ambiente locale, ottieni 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==3.1.0
gunicorn

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 worker 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.

docker build --tag flask-demo .

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 localmente 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

  1. Eseguire il comando az login per accedere ad Azure.

    az login
    
  2. Esegui il comando az upgrade per assicurarti che la versione della CLI di Azure sia aggiornata.

    az upgrade
    
  3. Creare un gruppo con il comando az group create .

    RESOURCE_GROUP_NAME=<resource-group-name>
    LOCATION=<location>
    az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
    

    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à come eastus. Sostituire <location> con il luogo scelto. Alcuni SKU non sono disponibili in determinate posizioni, pertanto è possibile che venga visualizzato un errore che indica questo problema. Usare una posizione diversa e riprovare.

  4. Creare un Registro Azure Container con il comando az acr create. Sostituire <container-registry-name> con un nome univoco per l'istanza.

    CONTAINER_REGISTRY_NAME=<container-registry-name>
    az acr create --resource-group $RESOURCE_GROOUP_NAME \
    --name $CONTAINER_REGISTRY_NAME --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 Regole per i nomi nel registro Azure Container. Se utilizzi un nome diverso, assicurati di usare il tuo nome anziché webappacr123 nei comandi che fanno riferimento al registro e agli artefatti di registro 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.

Creare l'immagine nel Registro dei Contenitori di Azure

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 $RESOURCE_GROUP_NAME \
  --registry $CONTAINER_REGISTRY_NAME \
  --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

  1. Crea un piano dei servizi App con il comando az appservice plan.

    az appservice plan create \
    --name webplan \
    --resource-group $RESOURCE_GROUP_NAME \
    --sku B1 \
    --is-linux
    
  2. Impostare una variabile di ambiente all'ID della propria 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.

  3. Creare l'app Web con il comando az webapp create .

    export MSYS_NO_PATHCONV=1 # This line is for Windows users to prevent path conversion issues in Git Bash.
    az webapp create \
    --resource-group $RESOURCE_GROUP_NAME \
    --plan webplan --name <container-registry-name> \
    --assign-identity [system] \
    --role AcrPull \
    --scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME \
    --acr-use-identity --acr-identity [system] \
    --container-image-name $CONTAINER_REGISTRY_NAME.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-identityparametri , --rolee --scope abilitano l'identità gestita assegnata dal sistema nell'app Web e assegnano il AcrPull ruolo nel gruppo di risorse. Questo conferisce all'identità gestita l'autorizzazione per scaricare le immagini da qualsiasi Registro di contenitori di Azure 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 vedi delle voci contenenti "warmup", significa che il contenitore è in fase di distribuzione.

    • L'URL dell'app Web è <web-app-name>.azurewebsites.net, ad esempio https://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 $RESOURCE_GROUP_NAME --yes --no-wait

È 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: