Share via


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 Azure e distribuirla nel servizio app Azure. È 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:

Scaricare il codice di esempio

Nell'ambiente locale ottenere il codice.

git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart.git

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.

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

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

  2. Creare un Registro Azure Container con il comando az acr create.

    az acr create --resource-group web-app-simple-rg \
    --name webappacr123 --sku Basic --admin-enabled true
    

    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. Il secondo comando salva la password in una variabile con il comando az credential show . La password viene usata per eseguire l'autenticazione nel Registro di sistema in un passaggio successivo.

  3. Impostare una variabile di ambiente sul valore della password per il Registro di sistema.

    ACR_PASSWORD=$(az acr credential show \
    --resource-group web-app-simple-rg \
    --name webappacr123 \
    --query "passwords[?name == 'password'].value" \
    --output tsv)
    

    Il comando per la creazione della variabile di ambiente viene visualizzato per la shell Bash. Modificare la sintassi e il carattere di continuazione (\) in base alle esigenze di altre shell.

    È anche possibile ottenere la password (ACR_PASSWORD) dal portale di Azure passando al Registro di sistema, selezionando Chiavi di accesso e copiando la password.

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

  1. 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
    
  2. Creare l'app Web con il comando az webapp create .

    az webapp create \
    --resource-group web-app-simple-rg \
    --plan webplan --name webappsimple123 \
    --docker-registry-server-password $ACR_PASSWORD \
    --docker-registry-server-user webappacr123 \
    --role acrpull \
    --deployment-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 i --docker-registry-server-user parametri e --deployment-container-image-name in modo appropriato.

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