Skapa och köra en containerbaserad Python-webbapp lokalt

I den här delen av självstudieserien får du lära dig hur du skapar och kör en containerbaserad Django eller en Flask Python-webbapp på din lokala dator. Om du vill lagra data för den här appen kan du använda antingen en lokal MongoDB-instans eller Azure Cosmos DB för MongoDB. Den här artikeln är del 2 i en självstudieserie i fem delar. Du bör slutföra del 1 innan du påbörjar den här artikeln.

Följande tjänstdiagram visar de lokala komponenter som beskrivs i den här artikeln. I den här artikeln lär du dig också hur du använder Azure Cosmos DB för MongoDB med en lokal Docker-avbildning i stället för en lokal instans av MongoDB.

Skärmbild av självstudien – Containeriserad Python-app på Azure med lokal del markerad.

Klona eller ladda ned Python-exempelappen

I det här avsnittet ska du klona eller ladda ned python-exempelappen som du använder för att skapa en Docker-avbildning. Du kan välja mellan en Django- eller Flask Python-webbapp. Om du har en egen Python-webbapp kan du välja att använda den i stället. Om du använder din egen Python-webbapp kontrollerar du att appen har en Dockerfile i rotmappen och kan ansluta till en MongoDB-databas.

  1. Klona antingen Django- eller Flask-lagringsplatsen till en lokal mapp med något av följande kommandon:

    # Django
    git clone https://github.com/Azure-Samples/msdocs-python-django-container-web-app.git
    
  2. Gå till rotmappen för den klonade lagringsplatsen.

    # Django
    cd msdocs-python-django-container-web-app
    

Skapa en Docker-avbildning

I det här avsnittet skapar du en Docker-avbildning för Python-webbappen med antingen Visual Studio Code eller Azure CLI. Docker-avbildningen innehåller Python-webbappen, dess beroenden och Python-körningen. Du skapar Docker-avbildningen från en Dockerfile som definierar avbildningens innehåll och beteende. Dockerfile finns i rotmappen för exempelappen som du klonade eller laddade ned (eller angav själv).

Tips/Råd

Om du inte har använt Azure CLI tidigare kan du läsa Komma igång med Azure CLI för att lära dig hur du laddar ned och installerar Azure CLI lokalt eller hur du kör Azure CLI-kommandon i Azure Cloud Shell.

Om du vill skapa Docker-avbildningen med hjälp av Docker CLI behöver du Docker. När du har installerat Docker öppnar du ett terminalfönster och går till exempelmappen.

Anmärkning

Stegen i det här avsnittet kräver att Docker-daemon körs. I vissa installationer, till exempel på Windows, måste du öppna Docker Desktop som startar daemonen innan du kan fortsätta.

  1. Bekräfta att Docker är tillgängligt genom att köra följande kommando i rotmappen för exempelappen.

    docker
    

    Om du efter att ha kört det här kommandot ser hjälpen för Docker CLI är Docker tillgänglig. Annars kontrollerar du att Docker är installerat och att ditt terminalfönster har åtkomst till Docker CLI.

  2. Skapa Docker-avbildningen för Python-webbappen med hjälp av kommandot Docker build .

    Kommandots allmänna form är docker build --rm --pull --file "<path-to-project-root>/Dockerfile" --label "com.microsoft.created-by=docker-cli" --tag "<container-name>:latest" "<path-to-project-root>".

    Om du är i rotmappen för projektet använder du följande kommando för att skapa Docker-avbildningen. Punkten (".") i slutet av kommandot refererar till den aktuella katalogen där kommandot körs. Om du vill tvinga fram en ombyggnad lägger du till --no-cache.

    Anmärkning

    Exempellagringsplatsen använder Python 3.8. Om du skapar en egen Dockerfile använder du en Python version som stöds, till exempel 3.12 eller 3.13. Mer information om versioner som stöds finns i Python version.

    #!/bin/bash
    docker build --rm --pull \
      --file "Dockerfile" \
      --label "com.microsoft.created-by=docker-cli" \
      --tag "msdocspythoncontainerwebapp:latest" \
        .
    
  3. Bekräfta att avbildningen har skapats med kommandot Docker Images .

    docker images
    

    Kommandot returnerar en lista över avbildningar efter LAGRINGSPLATSnamn, TAGG och SKAPAT datum bland andra bildegenskaper.

Nu har du en lokal Docker-avbildning med namnet "msdocspythoncontainerwebapp" med taggen "latest". Taggar hjälper dig att definiera versionsinformation, avsedd användning, stabilitet och annan relevant information. Mer information finns i Rekommendationer för taggning och versionshantering av containeravbildningar.

Anmärkning

Du kan också visa avbildningar som du skapar från VS Code eller med hjälp av Docker CLI direkt med hjälp av Docker Desktop-programmet .

Konfigurera MongoDB

Din Python webbapp kräver en MongoDB-databas och en samling, båda med namnet restaurants_reviews, för att lagra data. I den här självstudien använder du både en lokal installation av MongoDB och en Azure Cosmos DB för MongoDB-instans för att skapa och komma åt databasen och kollektionen.

Viktigt!

Använd inte en MongoDB-databas som du använder i produktion. I den här självstudien lagrar du MongoDB-anslutningssträngen till en av dessa MongoDB-instanser i en miljövariabel. Alla som kan inspektera din container – till exempel med hjälp av docker inspect – kan se den här anslutningssträngen.

Lokal MongoDB

Skapa en lokal instans av MongoDB med hjälp av Azure CLI.

  1. Installera MongoDB om det inte redan är installerat.

    Om du vill kontrollera om MongoDB är installerat använder du MongoDB Shell (mongosh). Om följande kommandon inte fungerar kan du behöva installera mongosh eller ansluta mongosh till MongoDB-servern.

    • Använd följande kommando för att öppna MongoDB-gränssnittet och hämta versionen av både MongoDB-gränssnittet och MongoDB-servern:

      mongosh
      

      Tips/Råd

      Om du bara vill returnera den version av MongoDB-servern som är installerad på systemet stänger du och öppnar MongoDB-gränssnittet igen och använder följande kommando: mongosh --quiet --exec 'db.version()'

      I vissa installationer kan du också direkt anropa Mongo-daemon i bash-gränssnittet.

      mongod --version
      
  2. Redigera filen mongod.cfg i \MongoDB\Server\8.0\bin mappen och lägg till datorns lokala IP-adress i bindIP nyckeln.

    Anmärkning

    Sökvägen till konfigurationsfilen varierar beroende på operativsystem och MongoDB-version. På macOS letar du efter /usr/local/etc/mongod.conf eller /opt/homebrew/etc/mongod.conf. I Linux kontrollerar du /etc/mongod.conf.

    Nyckeln bindip i MongoD-konfigurationsfilen definierar de värdnamn och IP-adresser som MongoDB lyssnar efter klientanslutningar. Lägg till den aktuella IP-adressen för din lokala utvecklingsdator. Python-exempelwebbappen som körs lokalt i en Docker-container kommunicerar med värddatorn med den här adressen.

    En del av konfigurationsfilen bör till exempel se ut så här:

    net:
      port: 27017
      bindIp: 127.0.0.1,<local-ip-address>
    
  3. Spara ändringarna i den här konfigurationsfilen.

    Viktigt!

    Du behöver administratörsbehörighet för att spara de ändringar du gör i den här konfigurationsfilen.

  4. Starta om MongoDB för att hämta ändringar i konfigurationsfilen.

  5. Öppna ett MongoDB-gränssnitt och kör följande kommando för att ange databasnamnet till "restaurants_reviews" och samlingsnamnet till "restaurants_reviews". Du kan också skapa en databas och samling med VS Code MongoDB-tillägget eller något annat MongoDB-medvetet verktyg.

    > help
    > use restaurants_reviews
    > db.restaurants_reviews.insertOne({})
    > show dbs
    > exit
    

När du har slutfört föregående steg är den lokala MongoDB-anslutningssträngen "mongodb://127.0.0.1:27017/", databasnamnet är "restaurants_reviews" och samlingsnamnet är "restaurants_reviews".

Azure Cosmos DB för MongoDB

Skapa nu en Azure Cosmos DB för MongoDB-instansen med hjälp av Azure CLI.

Anmärkning

I del 4 i den här självstudieserien använder du Azure Cosmos DB for MongoDB-instansen för att köra webbappen i Azure App Service.

Innan du kör följande skript ersätter du platsen, resursgruppen och Azure Cosmos DB för MongoDB-kontonamnet med lämpliga värden (valfritt). Använd samma resursgrupp för alla Azure resurser som du skapar i den här självstudien för att göra dem enklare att ta bort när du är klar.

Det tar några minuter att köra skriptet.

#!/bin/bash
# LOCATION: The Azure region. Use the "az account list-locations -o table" command to find a region near you.
LOCATION='westus'
# RESOURCE_GROUP_NAME: The resource group name, which can contain underscores, hyphens, periods, parenthesis, letters, and numbers.
RESOURCE_GROUP_NAME='msdocs-web-app-rg'
# ACCOUNT_NAME: The Azure Cosmos DB for MongDB account name, which can contain lowercase letters, hyphens, and numbers.
ACCOUNT_NAME='msdocs-cosmos-db-account-name'

# Create a resource group
echo "Creating resource group $RESOURCE_GROUP_NAME in $LOCATION..."
az group create --name $RESOURCE_GROUP_NAME --location $LOCATION

# Create a Cosmos account for MongoDB API
echo "Creating $ACCOUNT_NAME. This command may take a while to complete."
az cosmosdb create --name $ACCOUNT_NAME --resource-group $RESOURCE_GROUP_NAME --kind MongoDB

# Create a MongoDB API database
echo "Creating database restaurants_reviews"
az cosmosdb mongodb database create --account-name $ACCOUNT_NAME --resource-group $RESOURCE_GROUP_NAME --name restaurants_reviews

# Create a MongoDB API collection
echo "Creating collection restaurants_reviews"
az cosmosdb mongodb collection create --account-name $ACCOUNT_NAME --resource-group $RESOURCE_GROUP_NAME --database-name restaurants_reviews --name restaurants_reviews

# Get the connection string for the MongoDB database
echo "Get the connection string for the MongoDB account"
az cosmosdb keys list --name $ACCOUNT_NAME --resource-group $RESOURCE_GROUP_NAME --type connection-strings

echo "Copy the Primary MongoDB Connection String from the list above"

När skriptet är klart kopierar du den primära MongoDB-anslutningssträngen från utdata från det senaste kommandot till Urklipp eller någon annan plats.

{
  "connectionStrings": [
    {
      "connectionString": ""mongodb://msdocs-cosmos-db:pnaMGVtGIRAZHUjsg4GJBCZMBJ0trV4eg2IcZf1TqV...5oONz0WX14Ph0Ha5IeYACDbuVrBPA==@msdocs-cosmos-db.mongo.cosmos.azure.com:10255/?ssl=true&replicaSet=globaldb&retrywrites=false&maxIdleTimeMS=120000&appName=@msdocs-cosmos-db@"",
      "description": "Primary MongoDB Connection String",
      "keyKind": "Primary",
      "type": "MongoDB"
    },

    ...
  ]
}

När du har slutfört föregående steg har du en Azure Cosmos DB för MongoDB-anslutningssträng i formuläret mongodb://<server-name>:<password>@<server-name>.mongo.cosmos.azure.com:10255/?ssl=true&<other-parameters>, en databas med namnet restaurants_reviewsoch en samling med namnet restaurants_reviews.

Mer information om hur du använder Azure CLI för att skapa ett Cosmos DB för MongoDB-konto och för att skapa databaser och samlingar finns i Skapa en databas och samling för MongoDB för Azure Cosmos DB med Azure CLI. Du kan också använda PowerShell, VS Code Azure Databases-tillägget och Azure-portalen.

Tips/Råd

I TILLÄGGET VS Code Azure Databases kan du högerklicka på MongoDB-servern och hämta anslutningssträngen.

Kör avbildningen lokalt i en container

Nu är du redo att köra Docker-containern lokalt med hjälp av antingen din lokala MongoDB-instans eller Cosmos DB för MongoDB-instansen. I det här avsnittet av självstudien lär du dig hur du använder antingen VS Code eller Azure CLI för att köra avbilden lokalt. Exempelappen förväntar sig att MongoDB-anslutningsinformationen skickas med hjälp av miljövariabler. Det finns flera metoder för att skicka miljövariabler till en container lokalt. Varje metod har fördelar och nackdelar när det gäller säkerhet. Undvik att checka in eller lämna känsliga uppgifter i kod som finns i containern.

Anmärkning

När du distribuerar webbappen till Azure hämtar webbappen anslutningsinformation från miljövärden som angetts som App Service-konfigurationsinställningar. Ingen av ändringarna för scenariot för den lokala utvecklingsmiljön gäller.

MongoDB lokal

Använd följande kommandon med din lokala instans av MongoDB för att köra Docker-avbildningen lokalt.

  1. Kör den senaste versionen av avbildningen.

    #!/bin/bash
    
    # Define variables
    # Set the port number based on the framework being used:
    # 8000 for Django, 5000 for Flask
    export PORT=<port-number>  # Replace with actual port (e.g., 8000 or 5000)
    
    # Set your computer''s IP address (replace with actual IP)
    export YOUR_IP_ADDRESS=<your-computer-ip-address>  # Replace with actual IP address
    
    # Run the Docker container with the required environment variables
    docker run --rm -it \
      --publish "$PORT:$PORT" \
      --add-host "mongoservice:$YOUR_IP_ADDRESS" \
      --env CONNECTION_STRING=mongodb://mongoservice:27017 \
      --env DB_NAME=restaurants_reviews \
      --env COLLECTION_NAME=restaurants_reviews \
      --env SECRET_KEY="supersecretkeythatispassedtopythonapp" \
      msdocspythoncontainerwebapp:latest
    
  2. Bekräfta att containern är igång. Kör kommandot docker container ls i ett annat konsolfönster.

    docker container ls
    

    Du ser behållaren msdocspythoncontainerwebapp:latest i listan. Observera kolumnen för NAMES utdata och PORTS kolumnen. Använd containernamnet för att stoppa containern.

  3. Testa webbappen.

    Gå till http://127.0.0.1:8000 för Django och http://127.0.0.1:5000/ för Flask.

  4. Stäng av containern.

    docker container stop <container-name>
    

Azure Cosmos DB för MongoDB

Använd följande kommandon med din Azure Cosmos DB for MongoDB-instans för att köra Docker-avbildningen i Azure.

  1. Kör den senaste versionen av avbildningen.

    #!/bin/bash
    # PORT=8000 for Django and 5000 for Flask
    export PORT=<port-number>
    export CONNECTION_STRING="<connection-string>"
    
    docker run --rm -it \
      --publish $PORT:$PORT/tcp \
      --env CONNECTION_STRING=$CONNECTION_STRING \
      --env DB_NAME=restaurants_reviews \
      --env COLLECTION_NAME=restaurants_reviews \
      --env SECRET_KEY=supersecretkeythatyougenerate \
      msdocspythoncontainerwebapp:latest
    

    I demonstrationssyfte visar det här exemplet att känslig information skickas. Du kan visa reťazec pripojenia information genom att inspektera containern med hjälp av kommandot docker container inspect. Ett annat sätt att hantera hemligheter är att använda BuildKit-funktionerna i Docker.

  2. Öppna ett nytt konsolfönster och kör följande docker container ls-kommando för att bekräfta att containern körs.

    docker container ls
    

    Du ser behållaren msdocspythoncontainerwebapp:latest i listan. Observera kolumnen för NAMES utdata och PORTS kolumnen. Använd containernamnet för att stoppa containern.

  3. Testa webbappen.

    Gå till http://127.0.0.1:8000 för Django och http://127.0.0.1:5000/ för Flask.

  4. Stäng av containern.

    docker container stop <container-name>
    

Du kan också starta en container från en avbild och stoppa den genom att använda Docker Desktop-programmet.

Nästa steg