Compilare ed eseguire un'app Web Python in contenitori in locale con MongoDB
Articolo
Questo articolo fa parte di un'esercitazione su come inserire e distribuire un'app Web Python in contenitori in app Azure Servizio. servizio app consente di eseguire app Web in contenitori e di distribuire tramite funzionalità di integrazione continua/distribuzione continua (CI/CD) con Docker Hub, Registro Azure Container e Visual Studio Team Services. In questa parte dell'esercitazione si apprenderà come compilare ed eseguire l'app Web Python in contenitori in locale. Questo passaggio è facoltativo e non è necessario distribuire l'app di esempio in Azure.
L'esecuzione di un'immagine Docker in locale nell'ambiente di sviluppo richiede la configurazione oltre la distribuzione in Azure. Si consideri un investimento che può semplificare i cicli di sviluppo futuri, soprattutto quando si passa oltre le app di esempio e si inizia a creare app Web personalizzate. Per distribuire le app di esempio per Django e Flask, è possibile ignorare questo passaggio e passare al passaggio successivo di questa esercitazione. È sempre possibile tornare dopo la distribuzione in Azure e seguire questa procedura.
Il diagramma dei servizi seguente illustra i componenti trattati in questo articolo.
Decomprimere il file ZIP in una cartella e quindi aprire una finestra del terminale in tale cartella.
2. Creare un'immagine Docker
Se si usa una delle app di esempio del framework disponibili per Django e Flask, è possibile procedere. Se si usa la propria app di esempio, vedere come vengono configurate le app di esempio, in particolare il Dockerfile nella directory radice.
Queste istruzioni richiedono Visual Studio Code e l'estensione Docker. Passare alla cartella di esempio clonata o scaricata e aprire VS Code con il comando code ..
Nota
I passaggi descritti in questa sezione richiedono l'esecuzione del daemon Docker. In alcune installazioni, ad esempio in Windows, è necessario aprire Docker Desktop, che avvia il daemon, prima di procedere.
Istruzioni
Schermata
Aprire l'estensione Docker.
Se l'estensione Docker segnala un errore "Failed to connect", assicurarsi che Docker sia installato ed eseguito. Se questa è la prima volta che si lavora con Docker, è probabile che non siano presenti contenitori, immagini o registri connessi.
Compilare l'immagine.
In Esplora progetti che mostra i file di progetto fare clic con il pulsante destro del mouse sul Dockerfile e scegliere Compila immagine....
In alternativa, è possibile usare il riquadro comandi (F1 o CTRL+MAIUSC+P) e digitare "Docker Images: Build Images" per richiamare il comando.
Passare alla sezione IMAGES dell'estensione Docker.
Cercare l'immagine compilata di recente. Il nome dell'immagine del contenitore è "msdocspythoncontainerwebapp", impostato nel file .vscode/tasks.json .
I passaggi descritti in questa sezione richiedono l'esecuzione del daemon Docker. In alcune installazioni, ad esempio in Windows, è necessario aprire Docker Desktop, che avvia il daemon, prima di procedere.
Iniziare nella radice dell'app di esempio clonata o scaricata.
Passaggio 1: Al prompt della shell verificare che Docker sia accessibile.
docker
Se dopo l'esecuzione di questo comando viene visualizzata la Guida per l'interfaccia della riga di comando di Docker, continuare. In caso contrario, assicurarsi che Docker sia installato o che la shell abbia accesso all'interfaccia della riga di comando di Docker.
Passaggio 2. Compilare l'immagine.
Il formato generale del comando di compilazione docker è 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>".
Ad esempio, se si è nella radice della directory del progetto, è possibile usare il comando seguente per compilare un'immagine:
Si noti il punto (".") alla fine del comando che fa riferimento direttamente all'oggetto corrente in cui viene eseguito il comando. È possibile aggiungere --no-cache per forzare una ricompilazione.
Passaggio 3. Verificare che l'immagine sia stata compilata.
Le immagini dovrebbero essere elencate in base a nome repository, TAG e data CREATED tra le altre caratteristiche dell'immagine.
A questo punto, è stata creata un'immagine in locale. L'immagine creata ha il nome "msdocspythoncontainerwebapp" e il tag "latest". I tag sono un modo per definire le informazioni sulla versione, l'uso previsto, la stabilità o altre informazioni. Per altre informazioni, vedere Consigli per l'assegnazione di tag e il controllo delle versioni delle immagini del contenitore.
Le immagini compilate da VS Code o dall'uso diretto dell'interfaccia della riga di comando di Docker possono essere visualizzate anche con l'applicazione Docker Desktop .
3. Configurare MongoDB
Per questa esercitazione è necessario un database MongoDB denominato restaurants_reviews e una raccolta denominata restaurants_reviews. I passaggi descritti in questa sezione illustrano come usare un'installazione locale di MongoDB o Azure Cosmos DB per MongoDB per creare e accedere al database e alla raccolta.
Importante
Non usare un database MongoDB che verrà usato nell'ambiente di produzione. In questa esercitazione si archivieranno i stringa di connessione MongoDB in una variabile di ambiente. Ciò rende osservabile da chiunque sia in grado di ispezionare il contenitore , ad esempio usando docker inspect.
Un'alternativa in alcune installazioni consiste nell'richiamare direttamente il daemon Mongo.
mongod --version
Passaggio 2: Modificare il file mongod.cfg per aggiungere l'indirizzo IP del computer.
Il file di configurazione mongod ha una bindIp chiave che definisce nomi host e indirizzi IP in ascolto delle connessioni client di MongoDB. Aggiungere l'indirizzo IP corrente del computer di sviluppo locale. L'app di esempio in esecuzione in locale in un contenitore Docker comunicherà al computer host con questo indirizzo.
Ad esempio, una parte del file di configurazione dovrebbe essere simile alla seguente:
Riavviare MongoDB per selezionare le modifiche apportate al file di configurazione.
Passaggio 3: Creare un database e una raccolta nel database MongoDB locale.
Impostare il nome del database su "restaurants_reviews" e il nome della raccolta su "restaurants_reviews". È possibile creare un database e una raccolta con l'estensione MongoDB di VS Code, mongoDB Shell (mongosh) o qualsiasi altro strumento compatibile con MondoDB.
Per la shell MongoDB, ecco i comandi di esempio per creare il database e la raccolta:
> help
> use restaurants_reviews
> db.restaurants_reviews.insertOne({})
> show dbs
> exit
A questo punto, il stringa di connessione MongoDB locale è "mongodb://127.0.0.1:27017/", il nome del database è "restaurants_reviews" e il nome della raccolta è "restaurants_reviews".
È possibile usare i comandi dell'interfaccia della riga di comando di Azure per creare un account Azure Cosmos DB per MongoDB e quindi creare il database e la raccolta necessari per questa esercitazione. Se in precedenza non è stata usata l'interfaccia della riga di comando di Azure, vedere Introduzione all'interfaccia della riga di comando di Azure per informazioni su come scaricare e installare l'interfaccia della riga di comando di Azure in locale o su come eseguire i comandi dell'interfaccia della riga di comando di Azure in Azure Cloud Shell.
Prima di eseguire lo script seguente, sostituire il percorso e il nome dell'account Azure Cosmos DB per MongoDB con i valori appropriati. È possibile usare il nome del gruppo di risorse specificato nello script o modificarlo. In entrambi i casi, è consigliabile usare lo stesso gruppo di risorse per tutte le risorse di Azure create nei diversi articoli di questa esercitazione. Semplifica l'eliminazione al termine dell'esercitazione. Se sei arrivato qui dalla parte 4. Distribuire il contenitore servizio app, usare il nome e la posizione del gruppo di risorse già in uso per le risorse.
Lo script presuppone che si stia usando una shell Bash. Se si vuole usare una shell diversa, è necessario modificare la dichiarazione della variabile e la sintassi di sostituzione. L'esecuzione dello script potrebbe richiedere alcuni minuti.
#!/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 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"
Al termine dello script, copiare il Connessione String di MongoDB primario dall'output dell'ultimo comando.
A questo punto, è necessario avere un'istanza di Azure Cosmos DB per MongoDB stringa di connessione nel formato mongodb://<server-name>:<password>@<server-name>.mongo.cosmos.azure.com:10255/?ssl=true&<other-parameters>, un database denominato restaurants_reviewse una raccolta denominata restaurants_reviews.
Nell'estensione Database di Azure di VS Code è possibile fare clic con il pulsante destro del mouse sul server MongoDB e ottenere il stringa di connessione.
4. Eseguire l'immagine in locale in un contenitore
Con informazioni su come connettersi a mongoDB, è possibile eseguire il contenitore in locale. L'app di esempio prevede che le informazioni di connessione di MongoDB vengano passate nelle variabili di ambiente. Esistono diversi modi per passare le variabili di ambiente al contenitore in locale. Ognuno presenta vantaggi e svantaggi in termini di sicurezza. È consigliabile evitare di controllare eventuali informazioni riservate o di lasciare informazioni riservate nel codice nel contenitore.
Nota
Quando viene distribuita in Azure, l'app Web otterrà informazioni di connessione dai valori dell'ambiente impostati come servizio app impostazioni di configurazione e nessuna delle modifiche per lo scenario dell'ambiente di sviluppo locale si applica.
Nella cartella vscode dell'app di esempio il file settings.json definisce cosa accade quando si usa l'estensione Docker e selezionare Esegui o Esegui interattivo dal menu di scelta rapida di un tag. Il file settings.json contiene due modelli ciascuno per gli (MongoDB local) scenari e (MongoDB Azure) .
Se si usa un database MongoDB locale:
Sostituire entrambe le istanze di <YOUR_IP_ADDRESS> con l'indirizzo IP.
Sostituire entrambe le istanze di <CONNECTION_STRING> con il stringa di connessione per il database MongoDB.
Se si usa un database Azure Cosmos DB per MongoDB:
Sostituire entrambe le istanze di <CONNECTION_STRING> con l'stringa di connessione di Azure Cosmos DB per MongoDB.
Impostare l'impostazione docker.dockerPath di configurazione usata dai modelli. Per impostare docker.dockerPath, aprire il riquadro comandi di VS Code (CTRL+MAIUSC+P), immettere "Preferenze: Apri area di lavoro Impostazioni", quindi immettere "docker.dockerPath" nella casella Impostazioni di ricerca. Immettere "docker" (senza le virgolette) per il valore dell'impostazione.
Nota
Si presuppone che sia il nome del database che il nome della raccolta siano restaurants_reviews.
Eseguire l'immagine.
Nella sezione IMAGES dell'estensione Docker trovare l'immagine compilata.
Espandere l'immagine per trovare il tag più recente, fare clic con il pulsante destro del mouse e selezionare Esegui interattivo.
Verrà richiesto di selezionare l'attività appropriata per lo scenario, ovvero "Configurazione di esecuzione interattiva (mongoDB locale)" o "Configurazione di esecuzione interattiva (Azure MongoDB)".
Con l'esecuzione interattiva, nel codice verranno visualizzate tutte le istruzioni di stampa, che possono essere utili per il debug. È anche possibile selezionare Esegui che non è interattivo e non mantiene aperto l'input standard.
Importante
Questo passaggio ha esito negativo se il profilo del terminale predefinito è impostato su (Windows) Prompt dei comandi. Per modificare il profilo predefinito, aprire il riquadro comandi di VS Code (CTRL+MAIUSC+P), immettere "Terminale: Seleziona profilo predefinito" e quindi selezionare un profilo diverso dal menu a discesa, ad esempio Git Bash o PowerShell.
Verificare che il contenitore sia in esecuzione.
Nella sezione CONTENITORi dell'estensione Docker trovare il contenitore.
Espandere il nodo Singoli contenitori e verificare che "msdocspythoncontainerwebapp" sia in esecuzione. Se è in esecuzione, verrà visualizzato un simbolo di triangolo verde accanto al nome del contenitore.
Testare l'app Web facendo clic con il pulsante destro del mouse sul nome del contenitore e scegliendo Apri nel browser.
Il browser si aprirà nel browser predefinito come "http://127.0.0.1:8000" per Django o "http://127.0.0.1:5000/" per Flask.
Arrestare il contenitore.
Nella sezione CONTENITORi dell'estensione Docker trovare il contenitore in esecuzione.
Fare clic con il pulsante destro del mouse sul contenitore e scegliere Arresta.
Suggerimento
È anche possibile eseguire il contenitore selezionando una configurazione di esecuzione o debug. Le attività di estensione Docker in tasks.json vengono chiamate quando si esegue o si esegue il debug. L'attività chiamata dipende dalla configurazione di avvio selezionata. Per l'attività "Docker: Python (MongoDB locale)", specificare <YOUR-IP-ADDRESS>. Per l'attività "Docker: Python (MongoDB Azure)", specificare <CONNECTION-STRING>.
Passaggio 1: Eseguire la versione più recente dell'immagine.
# 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
Il comando precedente è formattato per la shell Bash. Se si usa PowerShell, prompt dei comandi o un'altra shell, potrebbe essere necessario modificare di conseguenza la continuazione della riga e il formato delle variabili di ambiente.
# 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
Il comando precedente è formattato per la shell Bash. Se si usa PowerShell, prompt dei comandi o un'altra shell, potrebbe essere necessario modificare di conseguenza la continuazione della riga e il formato delle variabili di ambiente.
Il passaggio di informazioni riservate, come illustrato di seguito, è a scopo dimostrativo. Le informazioni stringa di connessione possono essere visualizzate esaminando il contenitore con il comando docker container inspect. Un altro modo per gestire i segreti consiste nell'usare la funzionalità BuildKit di Docker.
Passaggio 2. Verificare che il contenitore sia in esecuzione.
Aprire una seconda shell ed eseguire il comando ls del contenitore Docker.
docker container ls
Nell'elenco dovrebbe essere visualizzato il contenitore "msdocspythoncontainerwebapp:latest:latest". Prendere nota della NAMES colonna dell'output e della PORTS colonna. È possibile usare il nome per arrestare il contenitore.
Passaggio 3. Testare l'app Web.
Vai a "http://127.0.0.1:8000" per Django e "http://127.0.0.1:5000/" per Flask durante l'esecuzione con MongoDB locale.
Passaggio 4. Arrestare il contenitore
docker container stop <container-name>
È anche possibile avviare un contenitore da un'immagine e arrestarlo con l'applicazione Docker Desktop .