Översikt över Python Container Apps i Azure

Den här artikeln beskriver hur du går från Python-projektkod (till exempel en webbapp) till en distribuerad Docker-container i Azure. Vi diskuterar den allmänna processen för containerisering, distributionsalternativ för containrar i Azure och Python-specifik konfiguration av containrar i Azure.

Docker-containrarnas natur är att skapandet av en Docker-avbildning från kod och distributionen av avbildningen till en container i Azure liknar alla programmeringsspråk. De språkspecifika övervägandena – Python i det här fallet – finns i konfigurationen under containeriseringsprocessen i Azure, särskilt Dockerfile-strukturen och konfigurationen som stöder Python-webbramverk som Django, Flask och FastAPI.

Scenarier för containerarbetsflöde

För utveckling av Python-containrar är några vanliga arbetsflöden för att flytta från kod till container:

Scenario beskrivning Arbetsflöde
Dev Skapa Python Docker-avbildningar i utvecklingsmiljön. Kod: git clone code to dev environment (med Docker installerat).

Build: Använd Docker CLI, VS Code (med tillägg), PyCharm (med plugin-program). Beskrivs i avsnittet Arbeta med Python Docker-avbildningar och containrar.

Test: I utvecklingsmiljön i en Docker-container.

Push: Till ett register som Azure Container Registry, Docker Hub eller ett privat register.

Distribuera: Till Azure-tjänsten från registret.
Hybrid Skapa Python Docker-avbildningar i Azure från utvecklingsmiljön. Kod: git clone code to dev environment (krävs inte för att Docker ska installeras).

Build: VS Code (med tillägg), Azure CLI.

Push-överföring: Till Azure Container Registry

Distribuera: Till Azure-tjänsten från registret.
Azure Allt i molnet; använd Azure Cloud Shell för att skapa Python Docker-avbildningskod från GitHub-lagringsplatsen. Kod: Git-klona GitHub-lagringsplats till Azure Cloud Shell.

Build: I Azure Cloud Shell använder du Azure CLI eller Docker CLI.

Push: Till register som Azure Container Registry, Docker Hub eller privat register.

Distribuera: Till Azure-tjänsten från registret.

Slutmålet med dessa arbetsflöden är att ha en container som körs i en av De Azure-resurser som stöder Docker-containrar enligt listan i nästa avsnitt.

En utvecklingsmiljö kan vara din lokala arbetsstation med Visual Studio Code eller PyCharm, Codespaces (en utvecklingsmiljö som finns i molnet) eller Visual Studio Dev Containers (en container som en utvecklingsmiljö).

Alternativ för distributionscontainer i Azure

Python-containerappar stöds i följande tjänster.

Tjänst beskrivning
Webbapp för containrar En fullständigt hanterad värdtjänst för containerbaserade webbprogram, inklusive webbplatser och webb-API:er. Containerbaserade webbappar i Azure App Service kan skalas efter behov och använda effektiva CI/CD-arbetsflöden med Docker Hub, Azure Container Registry och GitHub. Perfekt som en enkel ramp för utvecklare att dra nytta av den fullständigt hanterade Azure App Service-plattformen, men som också vill ha en enda distribuerbar artefakt som innehåller en app och alla dess beroenden.

Exempel: Distribuera en Flask- eller FastPI-webbapp i Azure App Service.
Azure Container Apps (ACA) En fullständigt hanterad serverlös containertjänst som drivs av Kubernetes och tekniker med öppen källkod som Dapr, KEDA och envoy. Baserat på metodtips och optimerad för allmänna containrar. Klusterinfrastrukturen hanteras av ACA och direkt åtkomst till Kubernetes API stöds inte. Innehåller många programspecifika begrepp ovanpå containrar, inklusive certifikat, revisioner, skalning och miljöer. Perfekt för team som vill börja skapa containermikrotjänster utan att behöva hantera kubernetes underliggande komplexitet.

Exempel: Distribuera en Flask- eller FastPI-webbapp i Azure Container Apps.
Azure Container Instances (ACI) Ett serverlöst erbjudande som tillhandahåller en enda podd med Isolerade Hyper-V-containrar på begäran. Faktureras för förbrukning i stället för etablerade resurser. Begrepp som skalning, belastningsutjämning och certifikat tillhandahålls inte med ACI-containrar. Användare interagerar ofta med ACI via andra tjänster. till exempel AKS för orkestrering. Perfekt om du behöver en mindre "åsiktsbaserad" byggsten som inte överensstämmer med de scenarier som Azure Container Apps optimerar för.

Exempel: Skapa en containeravbildning för distribution till Azure Container Instances. (Självstudien är inte Python-specifik, men de begrepp som visas gäller för alla språk.)
Azure Kubernetes Service (AKS) Ett fullständigt hanterat Kubernetes-alternativ i Azure. Stöder direkt åtkomst till Kubernetes API och kör alla Kubernetes-arbetsbelastningar. Det fullständiga klustret finns i din prenumeration, med klusterkonfigurationer och åtgärder inom din kontroll och ditt ansvar. Perfekt för team som letar efter en fullständigt hanterad version av Kubernetes i Azure.

Exempel: Distribuera ett Azure Kubernetes Service-kluster med hjälp av Azure CLI.
Azure Functions En händelsedriven, serverlös FAAS-lösning (functions-as-a-service). Delar många egenskaper med Azure Container Apps kring skalning och integrering med händelser, men är optimerad för tillfälliga funktioner som distribueras som antingen kod eller containrar. Perfekt för team som vill utlösa körningen av funktioner på händelser; till exempel för att binda till andra datakällor.

Exempel: Skapa en funktion i Linux med en anpassad container.

En mer detaljerad jämförelse av dessa tjänster finns i Jämföra containerappar med andra Azure-containeralternativ.

Virtuella miljöer och containrar

När du kör ett Python-projekt i en utvecklingsmiljö är användning av en virtuell miljö ett vanligt sätt att hantera beroenden och säkerställa reproducerbarhet för projektkonfigurationen. En virtuell miljö har en Python-tolk, bibliotek och skript installerade som krävs av den projektkod som körs i den miljön. Beroenden för Python-projekt hanteras via filen requirements.txt .

Dricks

Med containrar behövs inte virtuella miljöer om du inte använder dem av test eller andra orsaker. Om du använder virtuella miljöer ska du inte kopiera dem till Docker-avbildningen. Använd .dockerignore-filen för att exkludera dem.

Du kan betrakta Docker-containrar som liknande funktioner som virtuella miljöer, men med ytterligare fördelar när det gäller reproducerbarhet och portabilitet. Docker-containern kan köras var som helst där containrar kan köras, oavsett operativsystem.

En Docker-container innehåller din Python-projektkod och allt som koden behöver köra. För att komma till den punkten måste du skapa python-projektkoden i en Docker-avbildning och sedan skapa en container, en körbar instans av avbildningen.

För containerisering av Python-projekt är nyckelfilerna:

Projektfil beskrivning
requirements.txt Används under skapandet av Docker-avbildningen för att hämta rätt beroenden till avbildningen.
Dockerfile Används för att ange hur du skapar Python Docker-avbildningen. Mer information finns i avsnittet Dockerfile-instruktioner för Python.
.dockerignore Filer och kataloger i .dockerignore kopieras inte till Docker-avbildningen COPY med kommandot i Dockerfile. . dockerignore-filen stöder undantagsmönster som liknar .gitignore-filer . Mer information finns i .dockerignore-filen.

Exkludering av filer hjälper till att skapa bildprestanda, men bör också användas för att undvika att lägga till känslig information i avbildningen där den kan inspekteras. Till exempel ska .dockerignore innehålla rader för att ignorera .env och .venv (virtuella miljöer).

Containerinställningar för webbramverk

Webbramverk har standardportar där de lyssnar efter webbbegäranden. När du arbetar med vissa Azure-containerlösningar måste du ange den port som containern lyssnar på som tar emot trafik.

Webbramverk Port
Django 8000
Kolven 5000 eller 5002
FastAPI (uvicorn) 8000 eller 80

I följande tabell visas hur du ställer in porten för azure-containerlösningar för skillnad.

Azure-containerlösning Så här ställer du in webbappsport
Web App for Containers Som standard förutsätter App Service att din anpassade container lyssnar på port 80 eller port 8080. Om containern lyssnar på en annan port anger du inställningen WEBSITES_PORT app i App Service-appen. Mer information finns i Konfigurera en anpassad container för Azure App Service.
Azure Containers Apps Med Azure Container Apps kan du exponera din containerapp för den offentliga webben, för ditt virtuella nätverk eller för andra containerappar i din miljö genom att aktivera ingress. Ange ingressen targetPort till den port som containern lyssnar efter inkommande begäranden. Programmets ingressslutpunkt exponeras alltid på port 443. Mer information finns i Konfigurera HTTPS- eller TCP-ingress i Azure Container Apps.
Azure Container Instances, Azure Kubernetes Ange port när en container skapas. Du måste se till att din lösning har ett webbramverk, en programserver (till exempel gunicorn, uvicorn) och en webbserver (till exempel nginx). Du kan till exempel skapa två containrar, en container med ett webbramverk och en programserver och ett annat ramverk med en webbserver. De två containrarna kommunicerar på en port och webbservercontainern exponerar 80/443 för externa begäranden.

Python Dockerfile

En Dockerfile är en textfil som innehåller instruktioner för att skapa en Docker-avbildning. Den första raden anger basavbildningen till att börja med. Den här raden följs av instruktioner för att installera nödvändiga program, kopiera filer och andra instruktioner för att skapa en arbetsmiljö. Till exempel visas några Python-specifika exempel för viktiga Python Dockerfile-instruktioner i tabellen nedan.

Instruktion Syfte Exempel
FRÅN Anger basavbildningen för efterföljande instruktioner. FROM python:3.8-slim
EXPONERA Meddelar Docker att containern lyssnar på de angivna nätverksportarna vid körning. EXPOSE 5000
KOPIERA Kopierar filer eller kataloger från den angivna källan och lägger till dem i filsystemet för containern på den angivna målsökvägen. COPY . /app
KÖRA Kör ett kommando i Docker-avbildningen. Du kan till exempel hämta beroenden. Kommandot körs en gång vid byggtiden. RUN python -m pip install -r requirements.txt
CMD Kommandot tillhandahåller standardvärdet för att köra en container. Det kan bara finnas en CMD-instruktion. CMD ["gunicorn", "--bind", "0.0.0.0:5000", "wsgi:app"]

Docker build-kommandot skapar Docker-avbildningar från en Dockerfile och en kontext. En byggkontext är den uppsättning filer som finns i den angivna sökvägen eller URL:en. Vanligtvis skapar du en avbildning från python-projektets rot och sökvägen för build-kommandot är "." som du ser i följande exempel.

docker build --rm --pull  --file "Dockerfile"  --tag "mywebapp:latest"  .

Byggprocessen kan referera till någon av filerna i kontexten. Ditt bygge kan till exempel använda en COPY-instruktion för att referera till en fil i kontexten. Här är ett exempel på en Dockerfile för ett Python-projekt med flaskramverket:

FROM python:3.8-slim

EXPOSE 5000

# Keeps Python from generating .pyc files in the container.
ENV PYTHONDONTWRITEBYTECODE=1

# Turns off buffering for easier container logging
ENV PYTHONUNBUFFERED=1

# Install pip requirements.
COPY requirements.txt .
RUN python -m pip install -r requirements.txt

WORKDIR /app
COPY . /app

# Creates a non-root user with an explicit UID and adds permission to access the /app folder.
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser

# Provides defaults for an executing container; can be overridden with Docker CLI.
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "wsgi:app"]

Du kan skapa en Dockerfile för hand eller skapa den automatiskt med VS Code och Docker-tillägget. Mer information finns i Generera Docker-filer.

Docker Build-kommandot är en del av Docker CLI. När du använder IDE:er som VS Code eller PyCharm anropar användargränssnittskommandona för att arbeta med Docker-avbildningar build-kommandot åt dig och automatiserar att ange alternativ.

Arbeta med Python Docker-avbildningar och containrar

VS Code och PyCharm

Det är inte nödvändigt att arbeta i en integrerad utvecklingsmiljö (IDE) för utveckling av Python-containrar, men det kan förenkla många containerrelaterade uppgifter. Här är några av de saker du kan göra med VS Code och PyCharm.

  • Ladda ned och skapa Docker-avbildningar.

    • Skapa avbildningar i utvecklingsmiljön.
    • Skapa Docker-avbildningar i Azure utan Docker installerat i utvecklingsmiljön. (För PyCharm använder du Azure CLI för att skapa avbildningar i Azure.)
  • Skapa och kör Docker-containrar från en befintlig avbildning, en hämtad avbildning eller direkt från en Dockerfile.

  • Kör multicontainer-program med Docker Compose.

  • Anslut och arbeta med containerregister som Docker Hub, GitLab, JetBrains Space, Docker V2 och andra självvärdade Docker-register.

  • (endast VS Code) Lägg till en Dockerfile - och Docker-sammansättningsfiler som är skräddarsydda för ditt Python-projekt.

Använd följande steg för att konfigurera VS Code och PyCharm för att köra Docker-containrar i utvecklingsmiljön.

Om du inte redan har gjort det installerar du Azure Tools för VS Code.

Instruktioner Skärmbild
Steg 1: Använd SKIFT + ALT + A för att öppna Azure-tillägget och bekräfta att du är ansluten till Azure.

Du kan också välja Azure-ikonen i VS Code-tilläggsfältet.

Om du inte är inloggad väljer du Logga in på Azure och följer anvisningarna.

Om du har problem med att komma åt din Azure-prenumeration kan det bero på att du är bakom en proxyserver. Information om hur du löser anslutningsproblem finns i Nätverks Anslut ions i Visual Studio Code.
Screenshot showing how Azure Tools looks once signed in.Screenshot showing how Azure Tools looks if you aren't signed in.
Steg 2: Använd CTRL + SKIFT + X för att öppna Tillägg, söka efter Docker-tillägget och installera tillägget.

Du kan också välja tilläggsikonen i VS Code-tilläggsfältet.
Screenshot showing how to add Docker extension to VS Code.
Steg 3: Välj Docker-ikonen i tilläggsfältet, expandera bilder och högerklicka på en avbildning kör den som en container. Screenshot showing how to use the Docker extension in VS Code to run a container from a Docker image.
Steg 4: Övervaka Docker-körningens utdata i terminalfönstret . Screenshot showing an example of running a container in VS Code.

Azure CLI och Docker CLI

Du kan också arbeta med Python Docker-avbildningar och containrar med hjälp av Azure CLI och Docker CLI. Både VS Code och PyCharm har terminaler där du kan köra dessa CLI:er.

Använd ett CLI när du vill ha bättre kontroll över bygg- och körningsargument och för automatisering. Följande kommando visar till exempel hur du använder Azure CLI az acr build för att ange Docker-avbildningsnamnet.

az acr build --registry <registry-name> \
  --resource-group <resource-group> \
  --target pythoncontainerwebapp:latest .

Som ett annat exempel bör du överväga följande kommando som visar hur du använder Kommandot Docker CLI-körning. Exemplet visar hur du kör en Docker-container som kommunicerar med en MongoDB-instans i utvecklingsmiljön utanför containern. De olika värdena för att slutföra kommandot är enklare att automatisera när de anges på en kommandorad.

docker run --rm -it \
  --publish <port>:<port> --publish 27017:27017 \
  --add-host mongoservice:<your-server-IP-address> \
  --env CONNECTION_STRING=mongodb://mongoservice:27017 \
  --env DB_NAME=<database-name> \
  --env COLLECTION_NAME=<collection-name> \
  containermongo:latest  

Mer information om det här scenariot finns i Skapa och testa en containerbaserad Python-webbapp lokalt.

Miljövariabler i containrar

Python-projekt använder ofta miljövariabler för att skicka data till kod. Du kan till exempel ange information om databasanslutning i en miljövariabel så att den enkelt kan ändras under testningen. Eller när du distribuerar projektet till produktion kan databasanslutningen ändras för att referera till en instans av produktionsdatabasen.

Paket som python-dotenv används ofta för att läsa nyckel/värde-par från en .env-fil och ange dem som miljövariabler. En .env-fil är användbar när den körs i en virtuell miljö, men rekommenderas inte när du arbetar med containrar. Kopiera inte .env-filen till Docker-avbildningen, särskilt om den innehåller känslig information och containern kommer att offentliggöras. Använd .dockerignore-filen för att undanta filer från att kopieras till Docker-avbildningen. Mer information finns i avsnittet Virtuella miljöer och containrar i den här artikeln.

Du kan skicka miljövariabler till containrar på några sätt:

  1. Definieras i Dockerfile som ENV-instruktioner .
  2. Skickas som --build-arg argument med Kommandot Docker build .
  3. Skickas som --secret argument med Kommandot Docker build och BuildKit-serverdelen .
  4. Skickas som --env eller --env-file argument med Kommandot Docker-körning.

De två första alternativen har samma nackdel som ovan med .env-filer , nämligen att du hårdkodar potentiellt känslig information till en Docker-avbildning. Du kan inspektera en Docker-avbildning och se miljövariablerna, till exempel med kommandot docker-avbildningen inspekterad.

Med det tredje alternativet med BuildKit kan du skicka hemlig information som ska användas i Dockerfile för att skapa Docker-avbildningar på ett säkert sätt som inte lagras i den slutliga avbildningen.

Det fjärde alternativet för att skicka in miljövariabler med Kommandot Docker-körning innebär att Docker-avbildningen inte innehåller variablerna. Variablerna är dock fortfarande synliga och inspekterar containerinstansen (till exempel när dockercontainern inspekteras). Det här alternativet kan vara acceptabelt när åtkomsten till containerinstansen styrs eller i test- eller utvecklingsscenarier.

Här är ett exempel på hur du skickar miljövariabler med kommandot Docker CLI-körning och använder --env argumentet .

# PORT=8000 for Django and 5000 for Flask
export PORT=<port-number>

docker run --rm -it \
  --publish $PORT:$PORT \
  --env CONNECTION_STRING=<connection-info> \
  --env DB_NAME=<database-name> \
  <dockerimagename:tag>

Om du använder VS Code eller PyCharm använder användargränssnittsalternativen för att arbeta med avbildningar och containrar slutligen Docker CLI-kommandon som det som visas ovan.

Slutligen är det annorlunda att ange miljövariabler när du distribuerar en container i Azure än att använda miljövariabler i utvecklingsmiljön. Till exempel:

  • För Web App for Containers konfigurerar du programinställningar under konfigurationen av App Service. De här inställningarna är tillgängliga för din appkod som miljövariabler och används med standardmönstret os.environ . Du kan ändra värden efter den första distributionen när det behövs. Mer information finns i Åtkomst till appinställningar som miljövariabler.

  • För Azure Container Apps konfigurerar du miljövariabler under den inledande konfigurationen av containerappen. Efterföljande ändringar av miljövariabler skapar en revision av containern. Dessutom kan du med Azure Container Apps definiera hemligheter på programnivå och sedan referera till dem i miljövariabler. Mer information finns i Hantera hemligheter i Azure Container Apps.

Som ett annat alternativ kan du använda Service Anslut or för att hjälpa dig att ansluta Azure-beräkningstjänster till andra säkerhetskopieringstjänster. Den här tjänsten konfigurerar nätverksinställningar och anslutningsinformation (till exempel generera miljövariabler) mellan beräkningstjänster och målstödtjänster i hanteringsplanet.

Visa containerloggar

Visa containerinstansloggar för att se diagnostikmeddelanden som matas ut från kod och för att felsöka problem i containerns kod. Här är flera sätt att visa loggar när du kör en container i utvecklingsmiljön:

  • När du kör en container med VS Code eller PyCharm, som du ser i avsnittet VS Code och PyCharm, kan du se loggar i terminalfönster som öppnas när Docker-körningen körs.

  • Om du använder Kommandot Docker CLI-körning med den interaktiva flaggan -itvisas utdata som följer kommandot .

  • I Docker Desktop kan du också visa loggar för en container som körs.

När du distribuerar en container i Azure har du också åtkomst till containerloggar. Här är flera Azure-tjänster och hur du kommer åt containerloggar i Azure-portalen.

Azure-tjänst Så här kommer du åt loggar i Azure-portalen
Web App for Containers Gå till resursen Diagnostisera och lösa problem för att visa loggar. Diagnostik är en intelligent och interaktiv upplevelse som hjälper dig att felsöka din app utan att någon konfiguration krävs. En realtidsvy över loggar finns i övervakningsloggströmmen - . Mer detaljerade loggfrågor och konfiguration finns i de andra resurserna under Övervakning.
Azure Container Apps Gå till miljöresursen Diagnostisera och lösa problem för att felsöka miljöproblem. Oftare vill du se containerloggar. I containerresursen, under Programrevisionshantering - , väljer du revisionen och därifrån kan du visa system- och konsolloggar. Mer detaljerade loggfrågor och konfiguration finns i resurserna under Övervakning.
Azure Container Instances Gå till resursen Containrar och välj Loggar.

Här är Azure CLI-kommandona för att komma åt loggar för samma tjänster som anges ovan.

Azure-tjänst Azure CLI-kommando för att komma åt loggar
Web App for Containers az webapp log
Azure Container Apps az containerapps logs
Azure Container Instances az container logs

Det finns också stöd för att visa loggar i VS Code. Du måste ha Azure Tools for VS Code installerat. Nedan visas ett exempel på hur du visar Loggar för Web Apps for Containers (App Service) i VS Code.

Screenshot showing how to view logs in VS Code for Web Apps for Containers.

Nästa steg