Compartir a través de


Compilación y ejecución de una aplicación web de Python en contenedores localmente

En esta parte de la serie de tutoriales, aprenderás a crear y ejecutar una aplicación web de Python contenedorizada usando Django o Flask en tu equipo local. Para almacenar datos para esta aplicación, puede usar una instancia local de MongoDB o Azure Cosmos DB para MongoDB. Este artículo es la parte 2 de una serie de tutoriales de 5 partes. Se recomienda completar la parte 1 antes de comenzar este artículo.

En el diagrama de servicio siguiente se resaltan los componentes locales descritos en este artículo En este artículo, también aprenderá a usar Azure Cosmos DB para MongdoDB con una imagen de Docker local, en lugar de una instancia local de MongoDB.

Captura de pantalla del tutorial: aplicación de Python en contenedor en Azure con la parte local resaltada.

Clonar o descargar la aplicación de Python de ejemplo

En esta sección, clonará o descargará la aplicación de Python de ejemplo que se usa para compilar una imagen de Docker. Puede elegir entre una aplicación web de Django o Flask para Python. Si tiene su propia aplicación web de Python, puede optar por usarla en su lugar. Si usa su propia aplicación web de Python, asegúrese de que la aplicación tiene un Dockerfile en la carpeta raíz y puede conectarse a una base de datos de MongoDB.

  1. Clone el repositorio de Django o Flask en una carpeta local mediante uno de los siguientes comandos:

    # Django
    git clone https://github.com/Azure-Samples/msdocs-python-django-container-web-app.git
    
  2. Vaya a la carpeta raíz del repositorio clonado.

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

Creación de una imagen de Docker

En esta sección, creará una imagen de Docker para la aplicación web de Python mediante Visual Studio Code o la CLI de Azure. La imagen de Docker contiene la aplicación web de Python, sus dependencias y el entorno de ejecución de Python. La imagen de Docker se crea a partir de un Dockerfile que define el contenido y el comportamiento de la imagen. El Dockerfile se encuentra en la carpeta raíz de la aplicación de ejemplo que ha clonado o descargado (o proporcionado usted mismo).

Sugerencia

Si no está familiarizado con la CLI de Azure, consulte Introducción a la CLI de Azure para obtener información sobre cómo descargar e instalar la CLI de Azure localmente o cómo ejecutar comandos de la CLI de Azure en Azure Cloud Shell.

Docker es necesario para compilar la imagen de Docker mediante la CLI de Docker. Una vez instalado Docker, abra una ventana de terminal y vaya a la carpeta de ejemplo.

Nota:

Los pasos de esta sección requieren que se ejecute el demonio Docker. En algunas instalaciones, por ejemplo, en Windows, debe abrir Docker Desktop, que inicia el servicio, antes de continuar.

  1. Confirme que Docker es accesible mediante la ejecución del siguiente comando en la carpeta raíz de la aplicación de ejemplo.

    docker
    

    Si, después de ejecutar este comando, ve la ayuda para la CLI de Docker, significa que se puede acceder a Docker. De lo contrario, asegúrese de que Docker esté instalado y de que el shell tenga acceso a la CLI de Docker.

  2. Compile la imagen de Docker para la aplicación web de Python mediante el comando de compilación de Docker .

    La forma general del comando es 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>".

    Si está en la carpeta raíz del proyecto, use el siguiente comando para compilar la imagen de Docker. El punto (".") al final del comando hace referencia al directorio actual en el que se ejecuta el comando. Para forzar una recompilación, agregue --no-cache.

    #!/bin/bash
    docker build --rm --pull \
      --file "Dockerfile" \
      --label "com.microsoft.create-by=docker-cli" \
      --tag "msdocspythoncontainerwebapp:latest" \
        .
    
  3. Confirme que la imagen se ha compilado correctamente mediante el comando Imágenes de Docker .

    docker images
    

    El comando devuelve una lista de imágenes por nombre de repositorio, etiqueta y fecha de creación, entre otras características de imagen.

En este momento, tiene una imagen de Docker local denominada "msdocspythoncontainerwebapp" con la etiqueta "latest". Las etiquetas ayudan a definir los detalles de la versión, el uso previsto, la estabilidad y otra información relevante. Para más información, consulte Recomendaciones para el etiquetado y control de versiones de las imágenes de contenedor.

Nota:

Las imágenes compiladas a partir de VS Code o mediante la CLI de Docker directamente también se pueden ver con la aplicación Docker Desktop .

Configuración de MongoDB

La aplicación web de Python requiere una base de datos de MongoDB denominada restaurants_reviews y se requiere una colección denominada restaurants_reviews para almacenar datos. En este tutorial, usará una instalación local de MongoDB y una instancia de Azure Cosmos DB para MongoDB para crear y acceder a la base de datos y la colección.

Importante

No use una base de datos de MongoDB que use en producción. En este tutorial, almacenará la cadena de conexión de MongoDB en una de estas instancias de MongoDB en una variable de entorno (que es observable por cualquier persona capaz de inspeccionar el contenedor, como mediante docker inspect).

Local MongoDB

Comencemos creando una instancia local de MongoDB mediante la CLI de Azure.

  1. Instale MongoDB (si aún no está instalado).

    Puede comprobar la instalación de MongoDB mediante el Shell de MongoDB (mongosh). Si los siguientes comandos no funcionan, es posible que tenga que instalar explícitamente mongosh o conectar mongosh al servidor de MongoDB.

    • Use el siguiente comando para abrir el shell de MongoDB y obtener la versión del shell de MongoDB y el servidor de MongoDB:

      mongosh
      

      Sugerencia

      Para devolver solo la versión del servidor de MongoDB instalado en el sistema, cierre y vuelva a abrir el shell de MongoDB y use el siguiente comando: mongosh --quiet --exec 'db.version()'

      En algunas configuraciones, también puede invocar directamente el demonio de Mongo en el shell de Bash.

      mongod --version
      
  2. Edite el archivo mongod.cfg en la \MongoDB\Server\8.0\bin carpeta y agregue la dirección IP local del equipo a la bindIP clave.

    La bindip clave del archivo de configuración de MongoD define los nombres de host y las direcciones IP que MongoDB escucha para las conexiones de cliente. Agregue la dirección IP actual del equipo de desarrollo local. La aplicación web de Python de ejemplo que se ejecuta localmente en un contenedor de Docker se comunica con el equipo host con esta dirección.

    Por ejemplo, parte del archivo de configuración debe tener este aspecto:

    net:
      port: 27017
      bindIp: 127.0.0.1,<local-ip-address>
    
  3. Guarde los cambios realizados en este archivo de configuración.

    Importante

    Necesita privilegios administrativos para guardar los cambios realizados en este archivo de configuración.

  4. Reinicie MongoDB para recoger los cambios en el archivo de configuración.

  5. Abra un shell de MongoDB y ejecute el siguiente comando para establecer el nombre de la base de datos en "restaurants_reviews" y el nombre de la colección en "restaurants_reviews". También puede crear una base de datos y una colección con la extensión MongoDB de VS Code o cualquier otra herramienta compatible con MongoDB.

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

Después de completar el paso anterior, la cadena de conexión local de MongoDB es "mongodb://127.0.0.1:27017/", el nombre de la base de datos es "restaurants_reviews" y el nombre de la colección es "restaurants_reviews".

Azure Cosmos DB para MongoDB

Ahora, también vamos a crear una instancia de Azure Cosmos DB para MongoDB mediante la CLI de Azure.

Nota:

En la parte 4 de esta serie de tutoriales, usará la instancia de Azure Cosmos DB para MongoDB para ejecutar la aplicación web en Azure App Service.

Antes de ejecutar el siguiente script, reemplace la ubicación, el grupo de recursos y el nombre de la cuenta de Azure Cosmos DB para MongoDB por los valores adecuados (opcional). Se recomienda usar el mismo grupo de recursos para todos los recursos de Azure creados en este tutorial para que sean más fáciles de eliminar cuando haya terminado.

El script tarda unos minutos en ejecutarse.

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

Cuando se complete el script, copie la cadena de conexión principal de MongoDB de la salida del último comando al Portapapeles o a otra ubicación.

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

    ...
  ]
}

Después de completar el paso anterior, tiene una cadena de conexión de Azure Cosmos DB para MongoDB con el formato mongodb://<server-name>:<password>@<server-name>.mongo.cosmos.azure.com:10255/?ssl=true&<other-parameters>, una base de datos denominada restaurants_reviewsy una colección denominada restaurants_reviews.

Para más información sobre cómo usar la CLI de Azure para crear una cuenta de Cosmos DB para MongoDB y crear bases de datos y colecciones, consulte Creación de una base de datos y una colección para MongoDB para Azure Cosmos DB mediante la CLI de Azure. También puede usar PowerShell, la extensión Azure Databases de VS Code y Azure Portal.

Sugerencia

En la extensión Azure Databases de VS Code, puede hacer clic con el botón derecho en el servidor de MongoDB y obtener la cadena de conexión.

Ejecute la imagen localmente en un contenedor

Ya está listo para ejecutar el contenedor de Docker localmente mediante la instancia local de MongoDB o la instancia de Cosmos DB para MongoDB. En esta sección del tutorial, aprenderá a usar VS Code o la CLI de Azure para ejecutar la imagen localmente. La aplicación de ejemplo espera que la información de conexión de MongoDB se le proporcione mediante variables de entorno. Hay varias maneras de obtener las variables de entorno que se pasan al contenedor localmente. Cada uno tiene ventajas y desventajas en términos de seguridad. Debe evitar la comprobación de cualquier información confidencial o dejar información confidencial en el código del contenedor.

Nota:

Cuando la aplicación web se implementa en Azure, la aplicación web obtiene información de conexión de los valores de entorno establecidos como opciones de configuración de App Service y no se aplica ninguna de las modificaciones para el escenario de entorno de desarrollo local.

MongoDB local

Use los siguientes comandos con la instancia local de MongoDB para ejecutar la imagen de Docker localmente.

  1. Ejecute la versión más reciente de la imagen.

    #!/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. Confirme que el contenedor está en ejecución. En otra ventana de consola, ejecute el comando docker container ls .

    docker container ls
    

    Consulte el contenedor "msdocspythoncontainerwebapp:latest:latest" en la lista. Observe la NAMES columna de la salida y la PORTS columna. Use el nombre del contenedor para detener el contenedor.

  3. Pruebe la aplicación web.

    Vaya a "http://127.0.0.1:8000" para Django y "http://127.0.0.1:5000/" para Flask.

  4. Apague el contenedor.

    docker container stop <container-name>
    

Azure Cosmos DB para MongoDB

Use los siguientes comandos con la instancia de Azure Cosmos DB para MongoDB para ejecutar la imagen de Docker en Azure.

  1. Ejecute la versión más reciente de la imagen.

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

    Pasar información confidencial solo se muestra con fines de demostración. La información de la cadena de conexión se puede ver inspeccionando el contenedor con el comando docker container inspect. Otra manera de controlar secretos es usar la funcionalidad BuildKit de Docker.

  2. Abra una nueva ventana de consola y ejecute el siguiente comando docker container ls para confirmar que el contenedor se está ejecutando.

    docker container ls
    

    Consulte el contenedor "msdocspythoncontainerwebapp:latest:latest" en la lista. Observe la NAMES columna de la salida y la PORTS columna. Use el nombre del contenedor para detener el contenedor.

  3. Pruebe la aplicación web.

    Vaya a "http://127.0.0.1:8000" para Django y "http://127.0.0.1:5000/" para Flask.

  4. Apague el contenedor.

    docker container stop <container-name>
    

También puede iniciar un contenedor desde una imagen y detenerlo con la aplicación Docker Desktop .

Paso siguiente