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. Debe 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 MongoDB con una imagen local de Docker, 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 compila 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.

Para compilar la imagen de Docker mediante la CLI de Docker, necesita Docker. Después de instalar 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, como en Windows, es necesario abrir Docker Desktop, que inicia el demonio, antes de poder 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.

    Nota:

    El repositorio de ejemplo usa Python 3.8. Si va a crear su propio Dockerfile, use una versión de Python compatible, como 3.12 o 3.13. Consulte Python compatibilidad con versiones para ver las versiones admitidas actualmente.

    #!/bin/bash
    docker build --rm --pull \
      --file "Dockerfile" \
      --label "com.microsoft.created-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:

También puede ver imágenes que compile desde VS Code o mediante la CLI de Docker directamente mediante la aplicación Docker Desktop .

Configuración de MongoDB

La aplicación web de Python requiere una base de datos de MongoDB y una colección, ambas denominadas 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, almacene la cadena de conexión de una de estas instancias de MongoDB en una variable de entorno. Cualquier persona que pueda inspeccionar el contenedor (por ejemplo, mediante docker inspect) puede ver este cadena de conexión.

Local MongoDB

Cree una instancia local de MongoDB mediante el CLI de Azure.

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

    Para comprobar si MongoDB está instalado, use el shell de MongoDB (mongosh). Si los comandos siguientes 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.

    Nota:

    La ruta de acceso del archivo de configuración varía según el sistema operativo y la versión de MongoDB. En macOS, busque /usr/local/etc/mongod.conf o /opt/homebrew/etc/mongod.conf. En Linux, compruebe /etc/mongod.conf.

    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, cree un Azure Cosmos DB para la instancia de MongoDB mediante el 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). Use el mismo grupo de recursos para todos los recursos de Azure que cree en este tutorial para facilitar su eliminación 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 finalice el script, copie la cadena de conexión principal de MongoDB desde 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 el CLI de Azure para ejecutar la imagen localmente. La aplicación de ejemplo espera que la información de conexión de MongoDB se pase mediante variables de entorno. Existen varios métodos para pasar variables de entorno a un contenedor localmente. Cada método tiene ventajas y desventajas en términos de seguridad. Evite subir o dejar información sensible en el código del contenedor.

Nota:

Al implementar la aplicación web 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. 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" \
      --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
    

    Verá el contenedor msdocspythoncontainerwebapp: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.

    Ve 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
    

    Para fines de demostración, en este ejemplo se muestra cómo pasar información confidencial. Puede ver la información de cadena de conexión inspeccionando el contenedor mediante 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
    

    Ve su contenedor msdocspythoncontainerwebapp: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.

    Ve 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 mediante la aplicación Docker Desktop .

Paso siguiente