Delen via


Een in een container geplaatste Flask- of FastAPI-web-app implementeren in Azure-app Service

In deze zelfstudie leert u hoe u een Python Flask- of FastAPI-web-app implementeert in Azure-app Service met behulp van de functie Web App for Containers. Deze aanpak biedt een gestroomlijnd pad voor ontwikkelaars die de voordelen van een volledig beheerd platform willen tijdens het implementeren van hun app als één containerartefact met alle afhankelijkheden. Zie Azure-containeropties vergelijken voor meer informatie over het gebruik van containers in Azure.

In deze zelfstudie gebruikt u de Docker CLI en Docker om een Docker-image lokaal optioneel te bouwen en te testen. Vervolgens gebruikt u de Azure CLI om de Docker-installatiekopieën naar Azure Container Registry (ACR) te pushen en te implementeren in Azure App Service. De webapp is geconfigureerd met de door het systeem toegewezen beheerde identiteit voor veilige, wachtwoordloze toegang om de image uit ACR op te halen met behulp van Azure op rollen gebaseerd toegangsbeheer (RBAC). U kunt ook implementeren met Visual Studio Code , waarbij de Azure Tools-extensie is geïnstalleerd.

Zie Een Flask- of FastAPI-web-app implementeren in Azure Container Apps voor een voorbeeld van het bouwen en maken van een Docker-image om uit te voeren in Azure Container Apps.

Notitie

In deze handleiding laten we zien hoe u een Docker-image maakt dat gedeployed kan worden naar Azure App Service. Het gebruik van een Docker-image is echter niet noodzakelijk om uit te rollen naar App Service. U kunt uw toepassingscode ook rechtstreeks vanuit uw lokale werkruimte uitrollen naar App Service zonder een Docker-image te maken. Zie quickstart: Een Python-web-app (Django of Flask) implementeren in Azure-app Service voor een voorbeeld.

Vereisten

U hebt het volgende nodig om deze zelfstudie te voltooien:

De voorbeeldcode halen

Haal de code op in uw lokale omgeving.

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

Dockerfile- en .dockerignore-bestanden toevoegen

Voeg een Dockerfile toe om Docker te instrueren hoe de afbeelding te bouwen. Het Dockerfile specificeert het gebruik van Gunicorn, een webserver op productieniveau die webaanvragen doorstuurt naar de Flask- en FastAPI-frameworks. Met de OPDRACHTEN ENTRYPOINT en CMD wordt Gunicorn geïnstrueerd om aanvragen voor het app-object te verwerken.

# 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 wordt in dit voorbeeld gebruikt voor de containerpoort (intern), maar u kunt elke gratis poort gebruiken.

Controleer het requirements.txt bestand om er zeker van te zijn dat het bestand bevat gunicorn.

Flask==3.1.0
gunicorn

Voeg een .dockerignore-bestand toe om overbodige bestanden uit de installatiekopie uit te sluiten.

.git*
**/*.pyc
.venv/

Gunicorn configureren

Gunicorn kan worden geconfigureerd met een gunicorn.conf.py bestand. Wanneer het bestand gunicorn.conf.py zich in dezelfde map bevindt waarin gunicorn wordt uitgevoerd, hoeft u de locatie ervan niet op te geven in het Dockerfile. Zie Gunicorn-instellingen voor meer informatie over het opgeven van het configuratiebestand.

In deze zelfstudie configureert het voorgestelde configuratiebestand gunicorn om het aantal werkers te verhogen op basis van het aantal beschikbare CPU-kernen. Zie Gunicorn-configuratie voor meer informatie over gunicorn.conf.py bestandsinstellingen.

# 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

De image lokaal bouwen en uitvoeren

Bouw het image lokaal.

docker build --tag flask-demo .

Notitie

Als de docker build opdracht een fout retourneert, controleert u of de docker-deamon wordt uitgevoerd. Zorg ervoor dat Docker Desktop wordt uitgevoerd in Windows.

Voer de image lokaal uit in een Docker-container.

docker run --detach --publish 5000:50505 flask-demo

Open de http://localhost:5000 URL in uw browser om de web-app lokaal uit te voeren.

Met --detach de optie wordt de container op de achtergrond uitgevoerd. De --publish optie wijst de containerpoort toe aan een poort op de host. De hostpoort (extern) bevindt zich eerst in het paar en de containerpoort (intern) is tweede. Zie Docker run referentie voor meer informatie.

Een resourcegroep en Azure Container Registry maken

  1. Voer de opdracht az login uit om u aan te melden bij Azure.

    az login
    
  2. Voer de opdracht az upgrade uit om te controleren of uw versie van de Azure CLI actueel is.

    az upgrade
    
  3. Maak een groep met de opdracht az group create .

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

    Een Azure-resourcegroep is een logische container waarin Azure-resources worden geïmplementeerd en beheerd. Bij het maken van een resourcegroep geeft u een locatie op, zoals eastus. Vervang door <location> de locatie die u kiest. Bepaalde SKU's zijn niet beschikbaar op bepaalde locaties, dus u krijgt mogelijk een foutmelding die dit aangeeft. Gebruik een andere locatie en probeer het opnieuw.

  4. Maak een Azure Container Registry met de opdracht az acr create . Vervang <container-registry-name> door een unieke naam voor uw instantie.

    CONTAINER_REGISTRY_NAME=<container-registry-name>
    az acr create --resource-group $RESOURCE_GROOUP_NAME \
    --name $CONTAINER_REGISTRY_NAME --sku Basic
    

    Notitie

    De registernaam moet uniek zijn in Azure. Krijgt u een foutmelding, probeer dan een andere naam. Registernamen kunnen bestaan uit 5-50 alfanumerieke tekens. Afbreekstreepjes en onderstrepingstekens zijn niet toegestaan. Zie Azure Container Registry-naamregels voor meer informatie. Als u een andere naam gebruikt, moet u ervoor zorgen dat u uw naam gebruikt in plaats van webappacr123 in de opdrachten die verwijzen naar de register- en registerartefacten in de volgende secties.

    Een Azure Container Registry is een privé Docker-register waarin installatiekopieën worden opgeslagen voor gebruik in Azure Container Instances, Azure App Service, Azure Kubernetes Service en andere services. Bij het maken van een register geeft u een naam, SKU en resourcegroep op.

De image bouwen in Azure Container Registry

Bouw de Docker-image in Azure met de az acr build-opdracht. De opdracht maakt gebruik van de Dockerfile in de huidige map en uploadt de afbeeldingen naar het depôt.

az acr build \
  --resource-group $RESOURCE_GROUP_NAME \
  --registry $CONTAINER_REGISTRY_NAME \
  --image webappsimple:latest .

De --registry optie specificeert de registernaam en de --image optie specificeert de afbeeldingsnaam. De naam van de afbeelding heeft de indeling registry.azurecr.io/repository:tag.

Web-app implementeren in Azure

  1. Maak een App Service-plan met de opdracht az appservice plan .

    az appservice plan create \
    --name webplan \
    --resource-group $RESOURCE_GROUP_NAME \
    --sku B1 \
    --is-linux
    
  2. Stel een omgevingsvariabele in op uw abonnements-id. Deze wordt gebruikt in de --scope parameter in de volgende opdracht.

    SUBSCRIPTION_ID=$(az account show --query id --output tsv)
    

    De opdracht voor het maken van de omgevingsvariabele wordt weergegeven voor de Bash-shell. Wijzig de syntaxis zo nodig voor andere omgevingen.

  3. Maak de web-app met de opdracht 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 
    

    Opmerkingen:

    • De naam van de web-app moet uniek zijn in Azure. Krijgt u een foutmelding, probeer dan een andere naam. De naam kan bestaan uit alfanumerieke tekens en afbreekstreepjes, maar kan niet beginnen of eindigen met een afbreekstreepje. Zie Microsoft.Web-naamregels voor meer informatie.

    • Als u een andere naam gebruikt dan webappacr123 voor uw Azure Container Registry, moet u ervoor zorgen dat u de parameter op de --container-image-name juiste manier bijwerkt.

    • Met de parameters --assign-identity, --role, en --scope wordt de systeemtoegewezen beheerde identiteit ingeschakeld in de webapp en de AcrPull-rol toegekend aan de resourcegroep. Dit geeft de beheerde identiteit toestemming om afbeeldingen uit een Azure Container Registry in de resourcegroep te halen.

    • De parameters --acr-use-identity en --acr-identity configureren de web-app om de systeemtoegewezen beheerde identiteit te gebruiken voor het ophalen van afbeeldingen uit de Azure Container Registry.

    • Het kan enkele minuten duren voordat de web-app is gemaakt. U kunt de implementatielogboeken controleren met de opdracht az webapp log tail . Bijvoorbeeld: az webapp log tail --resource-group web-app-simple-rg --name webappsimple123. Als u vermeldingen ziet met 'warmup' erin, wordt de container uitgerold.

    • De URL van de web-app is <web-app-name>.azurewebsites.netbijvoorbeeld https://webappsimple123.azurewebsites.net.

Updates maken en opnieuw implementeren

Nadat u codewijzigingen hebt aangebracht, kunt u opnieuw implementeren naar App Service met de opdrachten az acr build en az webapp update.

Opschonen

Alle Azure-resources die in deze zelfstudie zijn gemaakt, bevinden zich in dezelfde resourcegroep. Als u de resourcegroep verwijdert, worden alle resources in de resourcegroep verwijderd. Dit is de snelste manier om alle Azure-resources te verwijderen die voor uw app worden gebruikt.

Als u resources wilt verwijderen, gebruikt u de opdracht az group delete .

az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait

U kunt de groep ook verwijderen in de Azure portal of in Visual Studio Code en de Azure Tools-extensie.

Volgende stappen

Voor meer informatie raadpleegt u de volgende bronnen: