Skapa och köra en containerbaserad Python-webbapp lokalt med MongoDB
Artikel
Den här artikeln är en del av en självstudie om hur du containeriserar och distribuerar en containerbaserad Python-webbapp till Azure App Service. Med App Service kan du köra containerbaserade webbappar och distribuera dem via CI/CD-funktioner (kontinuerlig integrering/kontinuerlig distribution) med Docker Hub, Azure Container Registry och Visual Studio Team Services. I den här delen av självstudien får du lära dig hur du skapar och kör den containerbaserade Python-webbappen lokalt. Det här steget är valfritt och krävs inte för att distribuera exempelappen till Azure.
Om du kör en Docker-avbildning lokalt i utvecklingsmiljön krävs installation utöver distribution till Azure. Tänk på det som en investering som kan göra framtida utvecklingscykler enklare, särskilt när du går bortom exempelappar och du börjar skapa egna webbappar. Om du vill distribuera exempelapparna för Django och Flask kan du hoppa över det här steget och gå till nästa steg i den här självstudien. Du kan alltid återvända när du har distribuerat till Azure och gå igenom de här stegen.
Följande tjänstdiagram visar de komponenter som beskrivs i den här artikeln.
Packa upp ZIP-filen i en mapp och öppna sedan ett terminalfönster i mappen.
2. Skapa en Docker-avbildning
Om du använder en av de ramverksexempelappar som är tillgängliga för Django och Flask är du inställd på att gå. Om du arbetar med din egen exempelapp tar du en titt för att se hur exempelapparna har konfigurerats, särskilt Dockerfile i rotkatalogen.
Dessa instruktioner kräver Visual Studio Code och Docker-tillägget. Gå till exempelmappen som du klonade eller laddade ned och öppna VS Code med kommandot code ..
Kommentar
Stegen i det här avsnittet kräver att Docker-daemon körs. I vissa installationer, till exempel i Windows, måste du öppna Docker Desktop, som startar daemonen, innan du fortsätter.
Instruktioner
Skärmbild
Öppna Docker-tillägget.
Om Docker-tillägget rapporterar felet "Det gick inte att ansluta" kontrollerar du att Docker är installerat och körs. Om det här är första gången du arbetar med Docker har du förmodligen inga containrar, avbildningar eller anslutna register.
Skapa avbildningen.
I projektutforskaren som visar projektfilerna högerklickar du på Dockerfile och väljer Skapa avbildning....
Alternativt kan du använda kommandopaletten (F1 eller Ctrl+Skift+P) och skriva "Docker Images: Build Images" för att anropa kommandot.
Mer information om Dockerfile-syntax finns i Dockerfile-referensen.
Bekräfta att avbildningen har skapats.
Gå till avsnittet BILDER i Docker-tillägget.
Leta efter nyskapade avbildningar. Namnet på containeravbildningen är "msdocspythoncontainerwebapp", som anges i filen .vscode/tasks.json .
Stegen i det här avsnittet kräver att Docker-daemon körs. I vissa installationer, till exempel i Windows, måste du öppna Docker Desktop, som startar daemonen, innan du fortsätter.
Börja i roten för exempelappen som du klonade eller laddade ned.
Steg 1. Kontrollera att Docker är tillgängligt i en kommandotolk.
docker
Om du ser hjälpen för Docker CLI när du har kört det här kommandot fortsätter du. Annars kontrollerar du att Docker är installerat eller att gränssnittet har åtkomst till Docker CLI.
Steg 2. Skapa avbildningen.
Den allmänna formen av docker build-kommandot ä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 till exempel befinner dig i roten i projektkatalogen kan du använda kommandot så här för att skapa en avbildning:
Observera punkten (".") i slutet av kommandot som refererar till den aktuella direkt där kommandot körs. Du kan lägga till --no-cache för att framtvinga en återskapande.
Du bör bland annat se avbildningar som anges med lagringsplatsens namn, TAGG och SKAPAD-datum.
Nu har du skapat en avbildning lokalt. Avbildningen som du skapade har namnet "msdocspythoncontainerwebapp" och taggen "latest". Taggar är ett sätt att definiera versionsinformation, avsedd användning, stabilitet eller annan information. Mer information finns i Rekommendationer för taggning och versionshantering av containeravbildningar.
Avbildningar som har skapats från VS Code eller från att använda Docker CLI direkt kan också visas med Docker Desktop-programmet .
3. Konfigurera MongoDB
I den här självstudien behöver du en MongoDB-databas med namnet restaurants_reviews och en samling med namnet restaurants_reviews. Stegen i det här avsnittet visar hur du använder en lokal installation av MongoDB eller Azure Cosmos DB för MongoDB för att skapa och komma åt databasen och samlingen.
Viktigt!
Använd inte en MongoDB-databas som du ska använda i produktion. I den här självstudien ska du lagra MongoDB-anslutningssträng i en miljövariabel. Detta gör att den kan observeras av alla som kan inspektera din container (till exempel med ).docker inspect
Ett alternativ i vissa installationer är att direkt anropa Mongo-daemonen.
mongod --version
Steg 2: Redigera filen mongod.cfg för att lägga till datorns IP-adress.
Mongod-konfigurationsfilen har en bindIp nyckel som definierar värdnamn och IP-adresser som MongoDB lyssnar efter klientanslutningar. Lägg till den aktuella IP-adressen för din lokala utvecklingsdator. Exempelappen 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:
Starta om MongoDB för att hämta ändringar i konfigurationsfilen.
Steg 3: Skapa en databas och samling i den lokala MongoDB-databasen.
Ange databasnamnet till "restaurants_reviews" och samlingsnamnet till "restaurants_reviews". Du kan skapa en databas och samling med VS Code MongoDB-tillägget, MongoDB Shell (mongosh) eller något annat MondoDB-medvetet verktyg.
För MongoDB-gränssnittet finns här exempelkommandon för att skapa databasen och samlingen:
> help
> use restaurants_reviews
> db.restaurants_reviews.insertOne({})
> show dbs
> exit
Nu är din lokala MongoDB-anslutningssträng "mongodb://127.0.0.1:27017/", databasnamnet är "restaurants_reviews" och samlingsnamnet är "restaurants_reviews".
Du kan använda Azure CLI-kommandon för att skapa ett Azure Cosmos DB för MongoDB-konto och sedan skapa den databas och samling som krävs för den här självstudien. 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.
Innan du kör följande skript ersätter du platsen och Azure Cosmos DB för MongoDB-kontonamnet med lämpliga värden. Du kan använda resursgruppens namn som anges i skriptet eller ändra det. Hur som helst rekommenderar vi att du använder samma resursgrupp för alla Azure-resurser som skapats i de olika artiklarna i den här självstudien. Det gör dem enklare att ta bort när du är klar med självstudien. Om du har kommit hit från del 4. Distribuera containern App Service, använd resursgruppens namn och plats som du redan har använt för dina resurser.
Skriptet förutsätter att du använder ett Bash-gränssnitt. Om du vill använda ett annat gränssnitt måste du ändra variabeldeklarationen och ersättningssyntaxen. Det kan ta 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.
# RESOURCE_GROUP_NAME: The resource group name. Can contain underscores, hyphens, periods, parenthesis, letters, and numbers.
# ACCOUNT_NAME: The Azure Cosmos DB for MongDB account name. Can contain lowercase letters, hyphens, and numbers.
LOCATION='eastus'
RESOURCE_GROUP_NAME='msdocs-web-app-rg'
ACCOUNT_NAME='<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 restaraunts_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-Anslut ionssträngen från utdata från det senaste kommandot.
Nu bör du ha en Azure Cosmos DB för MongoDB-anslutningssträng av 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.
I VS Code Azure Databases-tillägget kan du högerklicka på MongoDB-servern och hämta anslutningssträng.
4. Kör avbildningen lokalt i en container
Med information om hur du ansluter till en MongoDB är du redo att köra containern lokalt. Exempelappen förväntar sig att MongoDB-anslutningsinformation skickas i miljövariabler. Det finns flera sätt att hämta miljövariabler som skickas till containern lokalt. Var och en har fördelar och nackdelar när det gäller säkerhet. Du bör undvika att checka in känslig information eller lämna känslig information i koden i containern.
Kommentar
När den distribueras till Azure får webbappen anslutningsinformation från miljövärden som angetts som App Service-konfigurationsinställningar och ingen av ändringarna för scenariot för den lokala utvecklingsmiljön gäller.
I mappen .vscode i exempelappen definierar filen settings.json vad som händer när du använder Docker-tillägget och väljer Kör eller Kör interaktivt på snabbmenyn för en tagg. Filen settings.json innehåller två mallar vardera för scenarierna (MongoDB local) och (MongoDB Azure) .
Om du använder en lokal MongoDB-databas:
Ersätt båda instanserna av <YOUR_IP_ADDRESS> med din IP-adress.
Ersätt båda instanserna av <CONNECTION_STRING> med anslutningssträng för din MongoDB-databas.
Om du använder en Azure Cosmos DB för MongoDB-databas:
Ersätt båda instanserna av <CONNECTION_STRING> med Azure Cosmos DB för MongoDB anslutningssträng.
Ange konfigurationsinställningen docker.dockerPath som används av mallarna. Om du vill ange docker.dockerPathöppnar du kommandopaletten för VS Code (Ctrl+Skift+P), anger "Inställningar: Öppna arbetsyta Inställningar" och anger sedan "docker.dockerPath" i rutan Sökinställningar. Ange "docker" (utan citattecken) som värde för inställningen.
Kommentar
Både databasnamnet och samlingsnamnet antas vara restaurants_reviews.
Kör avbildningen.
I avsnittet BILDER i Docker-tillägget hittar du den skapade avbildningen.
Expandera bilden för att hitta den senaste taggen, högerklicka och välj Kör interaktiv.
Du uppmanas att välja den uppgift som är lämplig för ditt scenario, antingen "Interaktiv körningskonfiguration (Lokal MongoDB)" eller "Konfiguration av interaktiv körning (MongoDB Azure)".
Med interaktiv körning ser du eventuella utskriftsuttryck i koden, vilket kan vara användbart för felsökning. Du kan också välja Kör som inte är interaktiv och inte håller standardindata öppna.
Viktigt!
Det här steget misslyckas om standardterminalprofilen är inställd på (Windows) kommandotolk. Om du vill ändra standardprofilen öppnar du kommandopaletten för VS Code (Ctrl+Skift+P), anger "Terminal: Välj standardprofil" och väljer sedan en annan profil från listrutan, till exempel Git Bash eller PowerShell.
Bekräfta att containern körs.
I avsnittet CONTAINRAR i Docker-tillägget letar du reda på containern.
Expandera noden Enskilda containrar och bekräfta att "msdocspythoncontainerwebapp" körs. Du bör se en grön triangelsymbol bredvid containernamnet om den körs.
Testa webbappen genom att högerklicka på containernamnet och välja Öppna i webbläsare.
Webbläsaren öppnas i standardwebbläsaren som "http://127.0.0.1:8000" för Django eller "http://127.0.0.1:5000/" för Flask.
Stoppa containern.
I avsnittet CONTAINRAR i Docker-tillägget letar du reda på containern som körs.
Högerklicka på containern och välj Stoppa.
Dricks
Du kan också köra containern och välja en körnings- eller felsökningskonfiguration. Docker-tilläggsuppgifterna i tasks.json anropas när du kör eller felsöker. Uppgiften som anropas beror på vilken startkonfiguration du väljer. För uppgiften "Docker: Python (MongoDB local)" anger du <YOUR-IP-ADDRESS>. För uppgiften "Docker: Python (MongoDB Azure)" anger du <CONNECTION-STRING>.
Steg 1. Kör den senaste versionen av avbildningen.
# PORT=8000 for Django and 5000 for Flask
export PORT=<port-number>
export YOUR_IP_ADDRESS=<your-machine-ip-address>
docker run --rm -it \
--publish $PORT:$PORT --publish 27017:27017 \
--add-host mongoservice:$YOUR_IP_ADDRESS \
--env CONNECTION_STRING=mongodb://mongoservice:27017 --env DB_NAME=restaurants_reviews --env COLLECTION_NAME=restaurants_reviews \
msdocspythoncontainerwebapp:latest
Kommandot ovan är formaterat för Bash Shell. Om du använder PowerShell, kommandotolken eller ett annat gränssnitt kan du behöva justera radfortsättnings- och miljövariabelformatet i enlighet med detta.
# 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 \
msdocspythoncontainerwebapp:latest
Kommandot ovan är formaterat för Bash Shell. Om du använder PowerShell, kommandotolken eller ett annat gränssnitt kan du behöva justera radfortsättnings- och miljövariabelformatet i enlighet med detta.
Att skicka in känslig information som visas här är i demonstrationssyfte. Den anslutningssträng informationen kan visas genom att inspektera containern med kommandot docker container inspect. Ett annat sätt att hantera hemligheter är att använda BuildKit-funktionerna i Docker.
Du bör se containern "msdocspythoncontainerwebapp:latest:latest" i listan. Observera kolumnen för NAMES utdata och PORTS kolumnen. Du kan använda namnet för att stoppa containern.
Steg 3. Testa webbappen.
Gå till "http://127.0.0.1:8000" för Django och "http://127.0.0.1:5000/" för Flask när du kör med lokal MongoDB.