Compilación y ejecución de una aplicación web de Python en contenedores localmente con MongoDB
Artículo
Este artículo forma parte de un tutorial sobre cómo incluir e implementar una aplicación web de Python en contenedor en App de Azure Service. App Service le permite ejecutar aplicaciones web en contenedor e implementarlas mediante funcionalidades de integración continua e implementación continua (CI/CD) con Docker Hub, Azure Container Registry y Visual Studio Team Services. En esta parte del tutorial, aprenderá a compilar y ejecutar la aplicación web de Python en contenedores localmente. Este paso es opcional y no es necesario para implementar la aplicación de ejemplo en Azure.
La ejecución de una imagen de Docker localmente en el entorno de desarrollo requiere la instalación más allá de la implementación en Azure. Piense en ella como una inversión que pueda facilitar los ciclos de desarrollo futuros, especialmente cuando se mueve más allá de las aplicaciones de ejemplo y se empieza a crear sus propias aplicaciones web. Para implementar las aplicaciones de ejemplo para Django y Flask, puede omitir este paso y ir al siguiente paso de este tutorial. Siempre puede volver después de implementar en Azure y trabajar con estos pasos.
En el diagrama de servicio siguiente se resaltan los componentes descritos en este artículo.
Seleccione Code (Código) y, después, Download ZIP (Descargar ZIP).
Desempaquete el archivo ZIP en una carpeta y abra una ventana de terminal en esa carpeta.
2. Compilación de una imagen de Docker
Si usa una de las aplicaciones de ejemplo de marco disponibles para Django y Flask, está configurado para ir. Si está trabajando con su propia aplicación de ejemplo, eche un vistazo a cómo se configuran las aplicaciones de ejemplo, en particular el Dockerfile en el directorio raíz.
Estas instrucciones requieren Visual Studio Code y la extensión de Docker. Vaya a la carpeta de ejemplo que ha clonado o descargado y abra VS Code con el comando code ..
Nota:
Los pasos de esta sección requieren que se ejecute el demonio de Docker. En algunas instalaciones, por ejemplo, en Windows, debe abrir Docker Desktop, que inicia el demonio, antes de continuar.
Instrucciones
Instantánea
Abra la extensión de Docker.
Si la extensión de Docker notifica un error "No se pudo conectar", asegúrese de que Docker está instalado y en ejecución. Si esta es la primera vez que trabaja con Docker, probablemente no tendrá ningún contenedor, imágenes ni registros conectados.
Compile la imagen.
En el Explorador de proyectos que muestra los archivos del proyecto, haga clic con el botón derecho en dockerfile y seleccione Compilar imagen....
Como alternativa, puede usar la paleta de comandos (F1 o Ctrl+Mayús+P) y escribir "Docker Images: Build Images" para invocar el comando.
Para obtener más información sobre la sintaxis de Dockerfile, consulte la referencia de Dockerfile.
Confirme que se ha compilado la imagen.
Vaya a la sección IMAGES de la extensión de Docker.
Busque la imagen compilada recientemente. El nombre de la imagen de contenedor es "msdocspythoncontainerwebapp", que se establece en el archivo .vscode/tasks.json .
Los pasos de esta sección requieren que se ejecute el demonio de Docker. En algunas instalaciones, por ejemplo, en Windows, debe abrir Docker Desktop, que inicia el demonio, antes de continuar.
Comience en la raíz de la aplicación de ejemplo que ha clonado o descargado.
Paso 1. En un símbolo del sistema del shell, confirme que Docker es accesible.
docker
Si después de ejecutar este comando, verá ayuda para la CLI de Docker y, a continuación, continúe. De lo contrario, asegúrese de que Docker esté instalado o que el shell tenga acceso a la CLI de Docker.
Paso 2. Compile la imagen.
La forma general del comando docker build 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>".
Por ejemplo, si está en la raíz del directorio del proyecto, puede usar el comando como este para compilar una imagen:
Anote el punto (".") al final del comando que hace referencia al actual directamente en el que se ejecuta el comando. Puede agregar --no-cache para forzar una recompilación.
Debería ver imágenes enumeradas por nombre del REPOSITORIO, ETIQUETA y FECHA CREADA entre otras características de imagen.
En este punto, ha creado una imagen localmente. La imagen que creó tiene el nombre "msdocspythoncontainerwebapp" y etiqueta "latest". Las etiquetas son una manera de definir información de versión, uso previsto, estabilidad u otra información. Para más información, consulte Recomendaciones para el etiquetado y control de versiones de las imágenes de contenedor.
Las imágenes compiladas a partir de VS Code o desde el uso de la CLI de Docker directamente también se pueden ver con la aplicación Docker Desktop .
3. Configuración de MongoDB
Para este tutorial, necesita una base de datos de MongoDB denominada restaurants_reviews y una colección denominada restaurants_reviews. Los pasos de esta sección muestran cómo usar una instalación local de MongoDB o 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 usará en producción. En este tutorial, almacenará el cadena de conexión de MongoDB en una variable de entorno. Esto hace que sea observable por cualquier persona capaz de inspeccionar el contenedor (por ejemplo, mediante docker inspect).
Una alternativa en algunas instalaciones es invocar directamente el demonio de Mongo.
mongod --version
Paso 2: Edite el archivo mongod.cfg para agregar la dirección IP del equipo.
El archivo de configuración mongod tiene una bindIp clave que 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 de ejemplo que se ejecuta localmente en un contenedor de Docker se comunicará con la máquina host con esta dirección.
Por ejemplo, parte del archivo de configuración debe tener este aspecto:
Reinicie MongoDB para recoger los cambios en el archivo de configuración.
Paso 3: Crear una base de datos y una colección en la base de datos local de MongoDB.
Establezca el nombre de la base de datos en "restaurants_reviews" y el nombre de la colección en "restaurants_reviews". Puede crear una base de datos y una colección con la extensión mongoDB de VS Code, el shell de MongoDB (mongosh) o cualquier otra herramienta compatible con MondoDB.
Para el shell de MongoDB, estos son comandos de ejemplo para crear la base de datos y la colección:
> help
> use restaurants_reviews
> db.restaurants_reviews.insertOne({})
> show dbs
> exit
En este momento, el 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".
Puede usar comandos de la CLI de Azure para crear una cuenta de Azure Cosmos DB para MongoDB y, a continuación, crear la base de datos y la colección necesarias para este tutorial. Si no ha usado la CLI de Azure antes, 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.
Antes de ejecutar el siguiente script, reemplace la ubicación y el nombre de la cuenta de Azure Cosmos DB para MongoDB por los valores adecuados. Puede usar el nombre del grupo de recursos especificado en el script o cambiarlo. En cualquier caso, se recomienda usar el mismo grupo de recursos para todos los recursos de Azure creados en los distintos artículos de este tutorial. Facilita la eliminación cuando haya terminado con el tutorial. Si has llegado aquí desde la parte 4. Implemente el contenedor App Service, use el nombre y la ubicación del grupo de recursos que ya ha usado para los recursos.
El script supone que usa un shell de Bash. Si desea usar otro shell, deberá cambiar la sintaxis de sustitución y declaración de variable. El script puede tardar 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.
# 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"
Cuando se complete el script, copie la cadena de Conectar ion principal de MongoDB de la salida del último comando.
En este momento, debe tener 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.
En la extensión Azure Databases de VS Code, puede hacer clic con el botón derecho en el servidor de MongoDB y obtener el cadena de conexión.
4. Ejecutar la imagen localmente en un contenedor
Con información sobre cómo conectarse a mongoDB, está listo para ejecutar el contenedor localmente. La aplicación de ejemplo espera que la información de conexión de MongoDB se pase en 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 se implementa en Azure, la aplicación web obtendrá información de conexión de los valores de entorno establecidos como opciones de configuración de App Service y ninguna de las modificaciones del escenario del entorno de desarrollo local se aplica.
En la carpeta .vscode de la aplicación de ejemplo, el archivo settings.json define lo que sucede cuando se usa la extensión de Docker y se selecciona Ejecutar o Ejecutar interactivo en el menú contextual de una etiqueta. El archivo settings.json contiene dos plantillas para los (MongoDB local) escenarios y (MongoDB Azure) .
Si usa una base de datos local de MongoDB:
Reemplace ambas instancias de <YOUR_IP_ADDRESS> por la dirección IP.
Reemplace ambas instancias de por el cadena de conexión de la base de <CONNECTION_STRING> datos de MongoDB.
Si usa una base de datos de Azure Cosmos DB para MongoDB:
Reemplace ambas instancias de <CONNECTION_STRING> por el cadena de conexión de Azure Cosmos DB para MongoDB.
Establezca la docker.dockerPath configuración usada por las plantillas. Para establecer docker.dockerPath, abra la paleta de comandos de VS Code (Ctrl+Mayús+P), escriba "Preferencias: Abrir área de trabajo Configuración", escriba "docker.dockerPath" en el cuadro Configuración de búsqueda. Escriba "docker" (sin las comillas) para el valor de la configuración.
Nota:
Se supone que tanto el nombre de la base de datos como el nombre de la colección son restaurants_reviews.
Ejecute la imagen.
En la sección IMAGES de la extensión docker, busque la imagen compilada.
Expanda la imagen para buscar la etiqueta más reciente, haga clic con el botón derecho y seleccione Ejecutar interactiva.
Se le pedirá que seleccione la tarea adecuada para su escenario, ya sea "Configuración de ejecución interactiva (local de MongoDB)" o "Configuración de ejecución interactiva (Azure de MongoDB)".
Con la ejecución interactiva, verá las instrucciones de impresión en el código, lo que puede resultar útil para la depuración. También puede seleccionar Ejecutar que no es interactivo y no mantiene abierta la entrada estándar.
Importante
Este paso produce un error si el perfil de terminal predeterminado está establecido en (Windows) Símbolo del sistema. Para cambiar el perfil predeterminado, abra la paleta de comandos de VS Code (Ctrl+Mayús+P), escriba "Terminal: Seleccionar perfil predeterminado" y, a continuación, seleccione otro perfil en el menú desplegable; por ejemplo, Git Bash o PowerShell.
Confirme que el contenedor se está ejecutando.
En la sección CONTENEDORES de la extensión de Docker, busque el contenedor.
Expanda el nodo Contenedores individuales y confirme que se está ejecutando "msdocspythoncontainerwebapp". Debería ver un símbolo de triángulo verde junto al nombre del contenedor si se está ejecutando.
Pruebe la aplicación web haciendo clic con el botón derecho en el nombre del contenedor y seleccionando Abrir en el explorador.
El explorador se abrirá en el explorador predeterminado como "http://127.0.0.1:8000" para Django o "http://127.0.0.1:5000/" para Flask.
Detención del contenedor .
En la sección CONTENEDORES de la extensión de Docker, busque el contenedor en ejecución.
Haga clic con el botón derecho en el contenedor y seleccione Detener.
Sugerencia
También puede ejecutar el contenedor seleccionando una configuración de ejecución o depuración. Se llama a las tareas de extensión de Docker en tasks.json al ejecutar o depurar. La tarea a la que se llama depende de la configuración de inicio que seleccione. Para la tarea "Docker: Python (mongoDB local)", especifique <YOUR-IP-ADDRESS>. Para la tarea "Docker: Python (MongoDB Azure)", especifique <CONNECTION-STRING>.
Paso 1. Ejecute la versión más reciente de la imagen.
# 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
El comando anterior tiene el formato shell de Bash. Si usa PowerShell, símbolo del sistema u otro shell, es posible que tenga que ajustar el formato de continuación de línea y variable de entorno según corresponda.
# 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
El comando anterior tiene el formato shell de Bash. Si usa PowerShell, símbolo del sistema u otro shell, es posible que tenga que ajustar el formato de continuación de línea y variable de entorno según corresponda.
Pasar información confidencial como se muestra aquí es para fines de demostración. La información 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.
Paso 2. Confirme que el contenedor se está ejecutando.
Debería ver el contenedor "msdocspythoncontainerwebapp:latest:latest" en la lista. Anote la NAMES columna de la salida y la PORTS columna. Puede usar el nombre para detener el contenedor.
Paso 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 cuando se ejecuta con MongoDB local.