Lokales Erstellen und Ausführen einer containerisierten Python-Web-App mit MongoDB
Artikel
Dieser Artikel ist Teil eines Lernprogramms zum Containerisieren und Bereitstellen einer containerisierten Python-Web-App für Azure-App Service. Mit App Service können Sie containerisierte Web-Apps ausführen und über die Funktionen für kontinuierliche Integration/kontinuierliche Bereitstellung (CI/CD) mit Docker Hub, Azure Container Registry und Visual Studio Team Services bereitstellen. In diesem Teil des Lernprogramms erfahren Sie, wie Sie die containerisierte Python-Web-App lokal erstellen und ausführen. Dieser Schritt ist optional und ist nicht erforderlich, um die Beispiel-App in Azure bereitzustellen.
Das lokale Ausführen eines Docker-Images in Ihrer Entwicklungsumgebung erfordert ein Setup über die Bereitstellung in Azure hinaus. Stellen Sie sich diese Investition als Investition vor, die zukünftige Entwicklungszyklen vereinfachen kann, insbesondere, wenn Sie über Beispiel-Apps hinausgehen und mit der Erstellung eigener Web-Apps beginnen. Um die Beispiel-Apps für Django und Flask bereitzustellen, können Sie diesen Schritt überspringen und zum nächsten Schritt in diesem Lernprogramm wechseln. Sie können nach der Bereitstellung in Azure immer zurückkehren und diese Schritte durcharbeiten.
Das folgende Dienstdiagramm hebt die in diesem Artikel behandelten Komponenten hervor.
Entpacken Sie die ZIP-Datei in einen Ordner, und öffnen Sie dann ein Terminalfenster in diesem Ordner.
2. Erstellen eines Docker-Images
Wenn Sie eine der Framework-Beispiel-Apps verwenden, die für Django und Flask verfügbar sind, können Sie loslegen. Wenn Sie mit Ihrer eigenen Beispiel-App arbeiten, schauen Sie sich an, wie die Beispiel-Apps eingerichtet sind, insbesondere die Dockerfile im Stammverzeichnis.
Diese Anweisungen erfordern Visual Studio Code und die Docker-Erweiterung. Wechseln Sie zum Beispielordner, den Sie geklont oder heruntergeladen haben, und öffnen Sie VS Code mit dem Befehl code ..
Hinweis
Die Schritte in diesem Abschnitt erfordern die Ausführung des Docker-Daemons. In einigen Installationen, z. B. unter Windows, müssen Sie Docker Desktop öffnen, der den Daemon startet, bevor Sie fortfahren.
Anweisungen
Screenshot
Öffnen Sie die Docker-Erweiterung.
Wenn die Docker-Erweiterung einen Fehler "Fehler beim Herstellen einer Verbindung" meldet, stellen Sie sicher, dass Docker installiert und ausgeführt wird. Wenn Sie zum ersten Mal mit Docker arbeiten, verfügen Sie wahrscheinlich nicht über Container, Images oder verbundene Registrierungen.
Erstellen des Images.
Klicken Sie im Projekt-Explorer mit den Projektdateien mit der rechten Maustaste auf die Dockerfile-Datei , und wählen Sie "Image erstellen" aus.
Alternativ können Sie die Befehlspalette (F1 oder STRG+UMSCHALT+P) verwenden und "Docker Images: Build Images" eingeben, um den Befehl aufzurufen.
Weitere Informationen zur Dockerfile-Syntax finden Sie in der Dockerfile-Referenz.
Bestätigen Sie, dass das Image erstellt wurde.
Wechseln Sie zum ABSCHNITT IMAGES der Docker-Erweiterung.
Suchen Sie nach kürzlich erstellten Bildern. Der Name des Containerimages lautet "msdocspythoncontainerwebapp", das in der DATEI .vscode/tasks.json festgelegt ist.
Die Schritte in diesem Abschnitt erfordern die Ausführung des Docker-Daemons. In einigen Installationen, z. B. unter Windows, müssen Sie Docker Desktop öffnen, der den Daemon startet, bevor Sie fortfahren.
Beginnen Sie im Stamm der Beispiel-App, die Sie geklont oder heruntergeladen haben.
Schritt 1. Vergewissern Sie sich bei einer Shell-Eingabeaufforderung, dass auf Docker zugegriffen werden kann.
docker
Wenn nach dem Ausführen dieses Befehls Hilfe für die Docker CLI angezeigt wird, fahren Sie mit dem Vorgang fort. Stellen Sie andernfalls sicher, dass Docker installiert ist oder Ihre Shell Zugriff auf die Docker CLI hat.
Schritt 2. Erstellen des Images.
Die allgemeine Form des Docker-Buildbefehls lautet 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>".
Wenn Sie sich beispielsweise im Stammverzeichnis des Projektverzeichnisses befinden, können Sie den Folgenden Befehl verwenden, um ein Image zu erstellen:
Notieren Sie sich den Punkt (".") am Ende des Befehls, der auf den Aktuellen verweist, in dem der Befehl ausgeführt wird. Sie können hinzufügen --no-cache , um eine Neuerstellung zu erzwingen.
Schritt 3. Bestätigen Sie, dass das Image erstellt wurde.
Unter anderen Bildmerkmalen sollten Bilder nach REPOSITORY-Name, TAG und CREATED-Datum aufgelistet werden.
An diesem Punkt haben Sie ein Image lokal erstellt. Das von Ihnen erstellte Bild hat den Namen "msdocspythoncontainerwebapp" und das Tag "latest". Tags sind eine Möglichkeit, Versionsinformationen, beabsichtigte Verwendung, Stabilität oder andere Informationen zu definieren. Weitere Informationen finden Sie unter Empfehlungen für das Taggen und die Versionsverwaltung von Containerimages.
Images, die aus VS Code oder aus der direkten Verwendung der Docker CLI erstellt wurden, können auch mit der Docker Desktop-Anwendung angezeigt werden.
3. Einrichten von MongoDB
Für dieses Lernprogramm benötigen Sie eine MongoDB-Datenbank mit dem Namen restaurants_reviews und eine Sammlung mit dem Namen restaurants_reviews. Die Schritte in diesem Abschnitt zeigen Ihnen, wie Sie eine lokale Installation von MongoDB oder Azure Cosmos DB für MongoDB zum Erstellen und Zugreifen auf die Datenbank und Sammlung verwenden.
Wichtig
Verwenden Sie keine MongoDB-Datenbank, die Sie in der Produktion verwenden. In diesem Lernprogramm speichern Sie die MongoDB-Verbindungszeichenfolge in einer Umgebungsvariable. Dies macht es von jedem, der in der Lage ist, Ihren Container (z. B. die Verwendung docker inspect) zu prüfen.
Der folgende Befehl gibt die Shell ein und gibt Ihnen die Version des mongosh- und mongoDB-Servers, der auf Ihrem System installiert ist:
mongosh
Mit dem folgenden Befehl erhalten Sie nur die Version des MongoDB-Servers, der auf Ihrem System installiert ist:
mongosh --quiet --exec 'db.version()'
Wenn diese Befehle nicht funktionieren, müssen Sie möglicherweise mongosh explizit installieren oder Mongosh mit Ihrem MongoDB-Server verbinden.
Eine Alternative in einigen Installationen besteht darin, den Mongo-Daemon direkt aufzurufen.
mongod --version
Schritt 2: Bearbeiten Sie die Datei mongod.cfg, um die IP-Adresse Ihres Computers hinzuzufügen.
Die Mongod-Konfigurationsdatei verfügt über einen bindIp Schlüssel, der Hostnamen und IP-Adressen definiert, die MongoDB auf Clientverbindungen lauscht. Fügen Sie die aktuelle IP Ihres lokalen Entwicklungscomputers hinzu. Die lokal in einem Docker-Container ausgeführte Beispiel-App kommuniziert mit dieser Adresse mit dem Hostcomputer.
Ein Teil der Konfigurationsdatei sollte z. B. wie folgt aussehen:
Starten Sie MongoDB neu, um Änderungen an der Konfigurationsdatei zu übernehmen.
Schritt 3: Erstellen einer Datenbank und Sammlung in der lokalen MongoDB-Datenbank.
Legen Sie den Datenbanknamen auf "restaurants_reviews" und den Sammlungsnamen auf "restaurants_reviews" fest. Sie können eine Datenbank und Sammlung mit der VS Code MongoDB-Erweiterung, der MongoDB-Shell (Mongosh) oder einem beliebigen anderen MondoDB-fähigen Tool erstellen.
Für die MongoDB-Shell sind hier Beispielbefehle zum Erstellen der Datenbank und Sammlung aufgeführt:
> help
> use restaurants_reviews
> db.restaurants_reviews.insertOne({})
> show dbs
> exit
An diesem Punkt ist Ihre lokale MongoDB-Verbindungszeichenfolge "mongodb://127.0.0.1:27017/", der Datenbankname ist "restaurants_reviews", und der Sammlungsname ist "restaurants_reviews".
Sie können Azure CLI-Befehle verwenden, um ein Azure Cosmos DB für MongoDB-Konto zu erstellen und dann die erforderliche Datenbank und Sammlung für dieses Lernprogramm zu erstellen. Wenn Sie die Azure CLI noch nicht verwendet haben, lesen Sie erste Schritte mit Azure CLI , um zu erfahren, wie Sie die Azure CLI lokal herunterladen und installieren oder wie Sie Azure CLI-Befehle in Azure Cloud Shell ausführen.
Ersetzen Sie vor dem Ausführen des folgenden Skripts den Speicherort und den Azure Cosmos DB-Kontonamen für MongoDB durch entsprechende Werte. Sie können den im Skript angegebenen Ressourcengruppennamen verwenden oder ihn ändern. Auf beide Weise empfehlen wir die Verwendung derselben Ressourcengruppe für alle Azure-Ressourcen, die in den verschiedenen Artikeln dieses Lernprogramms erstellt wurden. Sie können sie einfacher löschen, wenn Sie mit dem Lernprogramm fertig sind. Wenn Sie hier von Teil 4 angekommen sind. Stellen Sie container-App Service bereit, verwenden Sie den Ressourcengruppennamen und den Speicherort, den Sie bereits für Ihre Ressourcen verwendet haben.
Das Skript geht davon aus, dass Sie eine Bash-Shell verwenden. Wenn Sie eine andere Shell verwenden möchten, müssen Sie die Variabledeklaration und die Ersetzungsyntax ändern. Das Skript kann einige Minuten dauern.
#!/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"
Kopieren Sie nach Abschluss des Skripts die primäre MongoDB-Verbinden ionzeichenfolge aus der Ausgabe des letzten Befehls.
An diesem Punkt sollten Sie über eine Azure Cosmos DB für MongoDB Verbindungszeichenfolge des Formulars mongodb://<server-name>:<password>@<server-name>.mongo.cosmos.azure.com:10255/?ssl=true&<other-parameters>verfügen, eine Datenbank mit dem Namen und eine Sammlung mit dem Namen restaurants_reviewsrestaurants_reviews.
In der Erweiterung VS Code Azure Databases können Sie mit der rechten Maustaste auf den MongoDB-Server klicken und die Verbindungszeichenfolge abrufen.
4. Lokales Ausführen des Images in einem Container
Mit Informationen zum Herstellen einer Verbindung mit einer MongoDB können Sie den Container lokal ausführen. Die Beispiel-App erwartet, dass MongoDB-Verbindungsinformationen in Umgebungsvariablen übergeben werden. Es gibt verschiedene Möglichkeiten, Umgebungsvariablen abzurufen, die lokal an Container übergeben werden. Jeder hat Vor- und Nachteile in Bezug auf Sicherheit. Sie sollten das Einchecken vertraulicher Informationen oder das Verlassen vertraulicher Informationen im Code im Container vermeiden.
Hinweis
Wenn sie in Azure bereitgestellt wird, ruft die Web-App Verbindungsinformationen aus Umgebungswerten ab, die als App Service-Konfigurationseinstellungen festgelegt sind, und es gelten keine Änderungen für das szenario für die lokale Entwicklungsumgebung.
Im Vscode-Ordner der Beispiel-App definiert die Datei settings.json, was passiert, wenn Sie die Docker-Erweiterung verwenden und im Kontextmenü eines Tags "Ausführen" oder "Interaktiv ausführen" auswählen. Die Datei settings.json enthält zwei Vorlagen für die (MongoDB local) einzelnen Und (MongoDB Azure) Szenarien.
Wenn Sie eine lokale MongoDB-Datenbank verwenden:
Ersetzen Sie beide Instanzen durch <YOUR_IP_ADDRESS> Ihre IP-Adresse.
Ersetzen Sie beide Instanzen <CONNECTION_STRING> durch die Verbindungszeichenfolge für Ihre MongoDB-Datenbank.
Wenn Sie eine Azure Cosmos DB für MongoDB-Datenbank verwenden:
Ersetzen Sie beide Instanzen von <CONNECTION_STRING> Azure Cosmos DB für mongoDB-Verbindungszeichenfolge.
Legen Sie die docker.dockerPath von den Vorlagen verwendete Konfigurationseinstellung fest. Öffnen Sie zum Festlegen docker.dockerPathdie VS-Codebefehlspalette (STRG+UMSCHALT+P), geben Sie "Einstellungen: Arbeitsbereich öffnen Einstellungen" ein, und geben Sie dann "docker.dockerPath" in das Sucheinstellungsfeld ein. Geben Sie "docker" (ohne anführungszeichen) für den Wert der Einstellung ein.
Hinweis
Sowohl der Datenbankname als auch der Sammlungsname werden als angenommen restaurants_reviews.
Führen Sie das Bild aus.
Suchen Sie im Abschnitt IMAGES der Docker-Erweiterung das integrierte Image.
Erweitern Sie das Bild, um das neueste Tag zu finden, klicken Sie mit der rechten Maustaste, und wählen Sie "Interaktiv ausführen" aus.
Sie werden aufgefordert, die für Ihr Szenario geeignete Aufgabe auszuwählen, entweder "Interactive run configuration (MongoDB local)" oder "Interactive run configuration (MongoDB Azure)".
Bei interaktiver Ausführung werden alle Druckanweisungen im Code angezeigt, die für das Debuggen nützlich sein können. Sie können auch "Ausführen" auswählen, das nicht interaktiv ist und die Standardeingabe nicht geöffnet bleibt.
Wichtig
Dieser Schritt schlägt fehl, wenn das Standardterminalprofil auf die Eingabeaufforderung (Windows) festgelegt ist. Um das Standardprofil zu ändern, öffnen Sie die VS-Codebefehlspalette (STRG+UMSCHALT+P), geben Sie "Terminal: Standardprofil auswählen" ein, und wählen Sie dann ein anderes Profil aus dem Dropdownmenü aus, z. B. Git Bash oder PowerShell.
Vergewissern Sie sich, dass der Container ausgeführt wird.
Suchen Sie im Containerabschnitt der Docker-Erweiterung den Container.
Erweitern Sie den Knoten "Einzelne Container ", und vergewissern Sie sich, dass "msdocspythoncontainerwebapp" ausgeführt wird. Es sollte ein grünes Dreieckssymbol neben dem Containernamen angezeigt werden, wenn es ausgeführt wird.
Testen Sie die Web-App, indem Sie mit der rechten Maustaste auf den Containernamen klicken und im Browser öffnen auswählen.
Der Browser wird in Ihrem Standardbrowser als "http://127.0.0.1:8000" für Django oder "http://127.0.0.1:5000/" für Flask.
Beenden Sie den Container .
Suchen Sie im Abschnitt CONTAINER der Docker-Erweiterung den ausgeführten Container.
Klicken Sie mit der rechten Maustaste auf den Container, und wählen Sie "Beenden" aus.
Tipp
Sie können auch den Container ausführen, der eine Ausführungs- oder Debugkonfiguration auswählt. Die Docker-Erweiterungsaufgaben in tasks.json werden aufgerufen, wenn Sie ausführen oder debuggen. Die aufgerufene Aufgabe hängt davon ab, welche Startkonfiguration Sie auswählen. Geben Sie für die Aufgabe "Docker: Python (MongoDB local)" IHRE-IP-ADRESSE> an<. Geben Sie für die Aufgabe "Docker: Python (MongoDB Azure)" CONNECTION-STRING> an<.
Schritt 1. Führen Sie die neueste Version des Images aus.
# 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
Der obige Befehl ist für die Bash-Shell formatiert. Wenn Sie PowerShell, Eingabeaufforderung oder eine andere Shell verwenden, müssen Sie möglicherweise das Zeilenfortsetzungs- und Umgebungsvariablenformat entsprechend anpassen.
# 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
Der obige Befehl ist für die Bash-Shell formatiert. Wenn Sie PowerShell, Eingabeaufforderung oder eine andere Shell verwenden, müssen Sie möglicherweise das Zeilenfortsetzungs- und Umgebungsvariablenformat entsprechend anpassen.
Das Übergeben vertraulicher Informationen, wie hier gezeigt, dient zu Demonstrationszwecken. Die Verbindungszeichenfolge Informationen können angezeigt werden, indem sie den Container mit der Docker-Containerprüfung prüfen. Eine weitere Möglichkeit zum Behandeln geheimer Schlüssel besteht darin, die BuildKit-Funktionalität von Docker zu verwenden.
Schritt 2. Vergewissern Sie sich, dass der Container ausgeführt wird.
Ihr Container "msdocspythoncontainerwebapp:latest:latest" sollte in der Liste angezeigt werden. Notieren Sie sich die NAMES Spalte der Ausgabe und der PORTS Spalte. Sie können den Namen verwenden, um den Container zu beenden.
Schritt 3. Testen Sie die Web-App.
Gehe zu "http://127.0.0.1:8000" für Django und "http://127.0.0.1:5000/" für Flask, wenn sie mit der lokalen MongoDB ausgeführt wird.
Schritt 4. Herunterfahren des Containers
docker container stop <container-name>
Sie können einen Container auch über ein Image starten und mit der Docker Desktop-Anwendung beenden.