Condividi tramite


Compilare ed eseguire un'app Web Python in contenitori in locale

In questa parte della serie di esercitazioni si apprenderà come compilare ed eseguire un'app Web Django in contenitori o Flask Python nel computer locale. Per archiviare i dati per questa app, è possibile usare un'istanza locale di MongoDB o Azure Cosmos DB per MongoDB. Questo articolo è la parte 2 di una serie di esercitazioni in 5 parti. È consigliabile completare la parte 1 prima di iniziare questo articolo.

Il diagramma dei servizi seguente illustra i componenti locali illustrati in questo articolo In questo articolo viene illustrato anche come usare Azure Cosmos DB per MongdoDB con un'immagine Docker locale, anziché un'istanza locale di MongoDB.

Schermata dell'esercitazione - App Python containerizzata in Azure con la parte locale evidenziata.

Clonare o scaricare l'app Python di esempio

In questa sezione si clona o si scarica l'app Python di esempio usata per compilare un'immagine Docker. È possibile scegliere tra un'app Web Django o Flask Python. Se si ha un'app Web Python personalizzata, è possibile scegliere di usarla. Se si usa la propria app Web Python, assicurarsi che l'app abbia un Dockerfile nella cartella radice e possa connettersi a un database MongoDB.

  1. Clonare il repository Django o Flask in una cartella locale usando uno dei comandi seguenti:

    # Django
    git clone https://github.com/Azure-Samples/msdocs-python-django-container-web-app.git
    
  2. Vai alla cartella radice del tuo repository clonato.

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

Creare un'immagine Docker

In questa sezione viene creata un'immagine Docker per l'app Web Python usando Visual Studio Code o l'interfaccia della riga di comando di Azure. L'immagine Docker contiene l'app Web Python, le relative dipendenze e il runtime Python. L'immagine Docker viene compilata da un Dockerfile che definisce il contenuto e il comportamento dell'immagine. Il Dockerfile si trova nella cartella radice dell'app di esempio clonata o scaricata (o fornita manualmente).

Suggerimento

Se non si ha familiarità con 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 come eseguire i comandi dell'interfaccia della riga di comando di Azure in Azure Cloud Shell.

Docker è necessario per compilare l'immagine Docker usando l'interfaccia della riga di comando di Docker. Dopo aver installato Docker, aprire una finestra del terminale e passare alla cartella di esempio.

Annotazioni

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.

  1. Verificare che Docker sia accessibile eseguendo il comando seguente nella cartella radice dell'app di esempio.

    docker
    

    Se, dopo l'esecuzione di questo comando, viene visualizzata la Guida del CLI di Docker, Docker è accessibile. In caso contrario, assicurarsi che Docker sia installato e che la shell abbia accesso all'interfaccia della riga di comando di Docker.

  2. Compilare l'immagine Docker per l'app Web Python usando il comando di compilazione Docker .

    Il formato generale del comando è 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>".

    Se si è nella cartella radice del progetto, usare il comando seguente per compilare l'immagine Docker. Il punto (".") alla fine del comando fa riferimento alla directory corrente in cui viene eseguito il comando. Per forzare una ricompilazione, aggiungere --no-cache.

    #!/bin/bash
    docker build --rm --pull \
      --file "Dockerfile" \
      --label "com.microsoft.create-by=docker-cli" \
      --tag "msdocspythoncontainerwebapp:latest" \
        .
    
  3. Verificare che l'immagine sia stata compilata correttamente usando il comando Docker images .

    docker images
    

    Il comando restituisce un elenco di immagini in base al nome del REPOSITORY, al TAG e alla data di creazione, tra le altre caratteristiche delle immagini.

A questo punto, è disponibile un'immagine Docker locale denominata "msdocspythoncontainerwebapp" con il tag "latest". I tag consentono di definire i dettagli della versione, l'uso previsto, la stabilità e altre informazioni pertinenti. Per altre informazioni, vedere Raccomandazioni per l'assegnazione di tag e il controllo delle versioni delle immagini del contenitore.

Annotazioni

Le immagini compilate da VS Code o usando direttamente l'interfaccia della riga di comando di Docker possono essere visualizzate anche con l'applicazione Docker Desktop .

Configurare MongoDB

Per archiviare i dati, l'app Web Python richiede un database MongoDB denominato restaurants_reviews e una raccolta denominata restaurants_reviews . In questa esercitazione si userà sia un'installazione locale di MongoDB che un'istanza di Azure Cosmos DB per MongoDB per creare e accedere al database e alla raccolta.

Importante

Non usare un database MongoDB usato nell'ambiente di produzione. In questa esercitazione si archivia la stringa di connessione MongoDB a una di queste istanze di MongoDB in una variabile di ambiente (osservabile da chiunque sia in grado di controllare il contenitore, ad esempio usando docker inspect).

MongoDB locale

Per iniziare, creare un'istanza locale di MongoDB usando l'interfaccia della riga di comando di Azure.

  1. Installare MongoDB (se non è già installato).

    È possibile verificare l'installazione di MongoDB usando mongoDB Shell (mongosh). Se i comandi seguenti non funzionano, potrebbe essere necessario installare in modo esplicito mongosh o connettere mongosh al server MongoDB.

    • Usare il comando seguente per aprire la shell MongoDB e ottenere la versione della shell MongoDB e del server MongoDB:

      mongosh
      

      Suggerimento

      Per restituire solo la versione del server MongoDB installato nel sistema, chiudere e riaprire la shell MongoDB e usare il comando seguente: mongosh --quiet --exec 'db.version()'

      In alcune configurazioni è anche possibile richiamare direttamente il daemon Mongo nella shell bash.

      mongod --version
      
  2. Modificare il file mongod.cfg nella \MongoDB\Server\8.0\bin cartella e aggiungere l'indirizzo IP locale del computer alla bindIP chiave.

    La bindip chiave nel file di configurazione MongoD definisce i nomi host e gli indirizzi IP su cui MongoDB è in ascolto per le connessioni client. Aggiungere l'indirizzo IP corrente del computer di sviluppo locale. L'app Web Python di esempio in esecuzione in locale in un contenitore Docker comunica al computer host con questo indirizzo.

    Ad esempio, una parte del file di configurazione dovrebbe essere simile alla seguente:

    net:
      port: 27017
      bindIp: 127.0.0.1,<local-ip-address>
    
  3. Salvare le modifiche apportate a questo file di configurazione.

    Importante

    Sono necessari privilegi amministrativi per salvare le modifiche apportate a questo file di configurazione.

  4. Riavviare MongoDB per selezionare le modifiche apportate al file di configurazione.

  5. Aprire una shell MongoDB ed eseguire il comando seguente per impostare il nome del database su "restaurants_reviews" e il nome della raccolta su "restaurants_reviews". È anche possibile creare un database e una raccolta con l'estensione MongoDB di VS Code o qualsiasi altro strumento compatibile con MongoDB.

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

Dopo aver completato il passaggio precedente, la stringa di connessione MongoDB locale è "mongodb://127.0.0.1:27017/", il nome del database è "restaurants_reviews" e il nome della raccolta è "restaurants_reviews".

Azure Cosmos DB per MongoDB

Si creerà ora anche un'istanza di Azure Cosmos DB per MongoDB usando l'interfaccia della riga di comando di Azure.

Annotazioni

Nella parte 4 di questa serie di esercitazioni si usa l'istanza di Azure Cosmos DB per MongoDB per eseguire l'app Web nel servizio app di Azure.

Prima di eseguire lo script seguente, sostituire il percorso, il gruppo di risorse e il nome dell'account Azure Cosmos DB per MongoDB con i valori appropriati (facoltativo). È consigliabile usare lo stesso gruppo di risorse per tutte le risorse di Azure create in questa esercitazione per semplificarne l'eliminazione al termine.

L'esecuzione dello script richiede alcuni minuti.

#!/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"

Al termine dello script, copiare la stringa di connessione MongoDB primaria dall'output dell'ultimo comando negli appunti o in un'altra posizione.

{
  "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"
    },

    ...
  ]
}

Dopo aver completato il passaggio precedente, si ha una stringa di connessione di Azure Cosmos DB per MongoDB 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.

Per altre informazioni su come usare l'interfaccia della riga di comando di Azure per creare un account Cosmos DB per MongoDB e per creare database e raccolte, vedere Creare un database e una raccolta per MongoDB per Azure Cosmos DB usando l'interfaccia della riga di comando di Azure. È anche possibile usare PowerShell, l'estensione Database di Azure di VS Code e il portale di Azure.

Suggerimento

Nell'estensione Database di Azure di VS Code è possibile fare clic con il pulsante destro del mouse sul server MongoDB e ottenere la stringa di connessione.

Eseguire l'immagine localmente in un contenitore

È ora possibile eseguire il contenitore Docker in locale usando l'istanza locale di MongoDB o l'istanza di Cosmos DB per MongoDB. In questa sezione dell'esercitazione si apprenderà come usare VS Code o l'interfaccia della riga di comando di Azure per eseguire l'immagine in locale. L'app di esempio si aspetta che le informazioni di connessione a MongoDB vengano fornite attraverso le 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.

Annotazioni

Quando l'app Web viene distribuita in Azure, l'app Web ottiene le informazioni di connessione dai valori di ambiente impostati come impostazioni di configurazione del servizio app e nessuna delle modifiche per lo scenario dell'ambiente di sviluppo locale si applica.

MongoDB locale

Usare i comandi seguenti con l'istanza locale di MongoDB per eseguire l'immagine Docker in locale.

  1. Eseguire la versione più recente dell'immagine.

    #!/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" \
      --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 \
      --env SECRET_KEY="supersecretkeythatispassedtopythonapp" \
      msdocspythoncontainerwebapp:latest
    
  2. Verificare che il contenitore sia in esecuzione. In un'altra finestra della console eseguire il comando ls del contenitore Docker .

    docker container ls
    

    Visualizza il contenitore "msdocspythoncontainerwebapp:latest:latest" nell'elenco. Si noti la NAMES colonna dell'output e la PORTS colonna. Utilizzare il nome del contenitore per arrestare il contenitore.

  3. Testare l'app Web.

    Vai a "http://127.0.0.1:8000" per Django e "http://127.0.0.1:5000/" per Flask.

  4. Spegnere il contenitore.

    docker container stop <container-name>
    

Azure Cosmos DB per MongoDB

Usare i comandi seguenti con l'istanza di Azure Cosmos DB per MongoDB per eseguire l'immagine Docker in Azure.

  1. Eseguire la versione più recente dell'immagine.

    #!/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
    

    Il passaggio di informazioni riservate viene visualizzato solo a scopo dimostrativo. Le informazioni sulla 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.

  2. Aprire una nuova finestra della console, eseguire il comando docker container ls seguente per verificare che il contenitore sia in esecuzione.

    docker container ls
    

    Visualizza il contenitore "msdocspythoncontainerwebapp:latest:latest" nell'elenco. Si noti la NAMES colonna dell'output e la PORTS colonna. Utilizzare il nome del contenitore per arrestare il contenitore.

  3. Testare l'app Web.

    Vai a "http://127.0.0.1:8000" per Django e "http://127.0.0.1:5000/" per Flask.

  4. Spegnere il contenitore.

    docker container stop <container-name>
    

È anche possibile avviare un contenitore da un'immagine e arrestarlo con l'applicazione Docker Desktop .

Passaggio successivo