Introducción a python Container Apps en Azure

En este artículo se describe cómo pasar del código del proyecto de Python (por ejemplo, una aplicación web) a un contenedor de Docker implementado en Azure. Se trata del proceso general de contenedorización, opciones de implementación para contenedores en Azure y configuración específica de Python de contenedores en Azure.

La naturaleza de los contenedores de Docker es que crear una imagen de Docker a partir del código e implementar esa imagen en un contenedor de Azure es similar en todos los lenguajes de programación. Las consideraciones específicas del lenguaje ( Python en este caso) se encuentran en la configuración durante el proceso de contenedorización en Azure, en particular la estructura de Dockerfile y la configuración que admiten marcos web de Python, como Django, Flask y FastAPI.

Escenarios de flujo de trabajo de contenedor

Para el desarrollo de contenedores de Python, algunos flujos de trabajo típicos para pasar de código a contenedor son:

Escenario Descripción Flujo de trabajo
Dev Compile imágenes de Docker de Python en el entorno de desarrollo. Código: código de clonación de Git en el entorno de desarrollo (con Docker instalado).

Compilación: use la CLI de Docker, VS Code (con extensiones), PyCharm (con complemento). Se describe en la sección Trabajar con imágenes y contenedores de Docker de Python.

Prueba: en el entorno de desarrollo de un contenedor de Docker.

Inserción: en un registro como Azure Container Registry, Docker Hub o en un registro privado.

Implementación: en el servicio de Azure desde el registro.
Híbrido Desde el entorno de desarrollo, compile imágenes de Docker de Python en Azure. Código: código de clonación de Git en el entorno de desarrollo (no es necesario para instalar Docker).

Compilación: VS Code (con extensiones), CLI de Azure.

Inserción: en Azure Container Registry

Implementación: en el servicio de Azure desde el registro.
Azure Todo en la nube; use Azure Cloud Shell para compilar código de imágenes de Docker de Python desde el repositorio de GitHub. Código: git clone repositorio de GitHub en Azure Cloud Shell.

Compilación: en Azure Cloud Shell, use la CLI de Azure o la CLI de Docker.

Inserción: para el registro como Azure Container Registry, Docker Hub o registro privado.

Implementación: en el servicio de Azure desde el registro.

El objetivo final de estos flujos de trabajo es tener un contenedor que se ejecute en uno de los recursos de Azure que admiten contenedores de Docker, como se muestra en la sección siguiente.

Un entorno de desarrollo puede ser la estación de trabajo local con Visual Studio Code o PyCharm, Codespaces (un entorno de desarrollo hospedado en la nube) o Contenedores de desarrollo de Visual Studio (un contenedor como entorno de desarrollo).

Opciones de contenedor de implementación en Azure

Las aplicaciones de contenedor de Python se admiten en los siguientes servicios.

Servicio Descripción
Web App for Containers Un servicio de hospedaje totalmente administrado para aplicaciones web en contenedores, incluidos sitios web y API web. Las aplicaciones web en contenedores en Azure App Service pueden escalar según sea necesario y usar flujos de trabajo de CI/CD optimizados con Docker Hub, Azure Container Registry y GitHub. Ideal como una fácil rampa para que los desarrolladores aprovechen la plataforma de servicio de App de Azure totalmente administrada, pero que también quieren un único artefacto implementable que contenga una aplicación y todas sus dependencias.

Ejemplo: Implemente una aplicación web de Flask o FastPI en App de Azure Service.
Azure Container Apps (ACA) Un servicio de contenedor sin servidor totalmente administrado con tecnología de Kubernetes y tecnologías de código abierto como Dapr, KEDA y envoy. En función de los procedimientos recomendados y optimizados para contenedores de uso general. La infraestructura del clúster se administra mediante ACA y no se admite el acceso directo a la API de Kubernetes. Proporciona muchos conceptos específicos de la aplicación sobre contenedores, incluidos certificados, revisiones, escalado y entornos. Ideal para equipos que quieran empezar a crear microservicios de contenedor sin tener que administrar la complejidad subyacente de Kubernetes.

Ejemplo: Implementación de una aplicación web de Flask o FastPI en Azure Container Apps.
Azure Container Instances (ACI) Una oferta sin servidor que proporciona un único pod de contenedores aislados de Hyper-V a petición. Facturado por consumo en lugar de recursos aprovisionados. Los conceptos como la escala, el equilibrio de carga y los certificados no se proporcionan con los contenedores de ACI. Los usuarios suelen interactuar con ACI a través de otros servicios; por ejemplo, AKS para orquestación. Ideal si necesita un bloque de creación menos "con opinión" que no se alinee con los escenarios para los que Azure Container Apps está optimizando.

Ejemplo: Creación de una imagen de contenedor para la implementación en Azure Container Instances. (El tutorial no es específico de Python, pero los conceptos que se muestran se aplican a todos los lenguajes).
Azure Kubernetes Service (AKS) Una opción de Kubernetes totalmente administrada en Azure. Admite el acceso directo a la API de Kubernetes y ejecuta cualquier carga de trabajo de Kubernetes. El clúster completo reside en su suscripción, con las configuraciones y las operaciones del clúster bajo su control y responsabilidad. Ideal para los equipos que buscan una versión totalmente administrada de Kubernetes en Azure.

Ejemplo: Implementación de un clúster de Azure Kubernetes Service mediante la CLI de Azure.
Funciones de Azure Una solución de funciones como servicio (FAAS) controlada por eventos y sin servidor. Comparte muchas características con Azure Container Apps en torno a la escala y la integración con eventos, pero está optimizada para funciones efímeras implementadas como código o contenedores. Ideal para los equipos que buscan desencadenar la ejecución de funciones en eventos; por ejemplo, para enlazar a otros orígenes de datos.

Ejemplo: Creación de una función en Linux mediante un contenedor personalizado.

Para obtener una comparación más detallada de estos servicios, consulte Comparación de aplicaciones de contenedor con otras opciones de contenedor de Azure.

Entornos virtuales y contenedores

Cuando se ejecuta un proyecto de Python en un entorno de desarrollo, el uso de un entorno virtual es una forma común de administrar las dependencias y garantizar la reproducibilidad de la configuración del proyecto. Un entorno virtual tiene un intérprete, bibliotecas y scripts de Python instalados que requiere el código del proyecto que se ejecuta en ese entorno. Las dependencias de los proyectos de Python se administran mediante el archivo requirements.txt .

Sugerencia

Con los contenedores, los entornos virtuales no son necesarios a menos que los use por motivos de prueba u otros motivos. Si usa entornos virtuales, no los copie en la imagen de Docker. Use el archivo .dockerignore para excluirlos.

Puede pensar en contenedores de Docker como proporcionar funcionalidades similares a los entornos virtuales, pero con ventajas adicionales en la reproducibilidad y portabilidad. El contenedor de Docker se puede ejecutar en cualquier lugar donde se puedan ejecutar contenedores, independientemente del sistema operativo.

Un contenedor de Docker contiene el código del proyecto de Python y todo lo que el código necesita ejecutar. Para llegar a ese punto, debe compilar el código del proyecto de Python en una imagen de Docker y, a continuación, crear un contenedor, una instancia ejecutable de esa imagen.

Para incluir en contenedores proyectos de Python, los archivos de clave son:

Archivo del proyecto Descripción
requirements.txt Se usa durante la compilación de la imagen de Docker para obtener las dependencias correctas en la imagen.
Dockerfile Se usa para especificar cómo compilar la imagen de Docker de Python. Para obtener más información, consulte la sección Instrucciones de Dockerfile para Python.
.dockerignore Los archivos y directorios de .dockerignore no se copian en la imagen de Docker con el COPY comando en el Dockerfile. El archivo .dockerignore admite patrones de exclusión similares a los archivos .gitignore . Para obtener más información, vea archivo .dockerignore.

La exclusión de archivos ayuda al rendimiento de la compilación de imágenes, pero también debe usarse para evitar agregar información confidencial a la imagen donde se puede inspeccionar. Por ejemplo, .dockerignore debe contener líneas para omitir .env y .venv (entornos virtuales).

Configuración de contenedor para marcos web

Los marcos web tienen puertos predeterminados en los que escuchan las solicitudes web. Al trabajar con algunas soluciones de contenedor de Azure, debe especificar el puerto en el que escucha el contenedor que recibirá tráfico.

Marco de trabajo web Port
Django 8000
Flask 5000 o 5002
FastAPI (uvicorn) 8000 o 80

En la tabla siguiente se muestra cómo establecer el puerto para las soluciones de contenedor de Azure diferentes.

Solución de contenedor de Azure Cómo establecer el puerto de la aplicación web
Web App for Containers De forma predeterminada, el servicio App Service da por hecho que el contenedor personalizado escucha en los puertos 80 u 8080. Si el contenedor escucha un puerto diferente, establezca la configuración de la aplicación WEBSITES_PORT en la aplicación de App Service. Para obtener más información, consulte Configuración de un contenedor personalizado para App de Azure Service.
Aplicaciones de contenedores de Azure Azure Container Apps permite exponer la aplicación contenedora a la web pública, a la VNET o a otras aplicaciones contenedoras dentro de su entorno si habilita la entrada. Establezca la entrada targetPort en el puerto en el que escucha el contenedor para las solicitudes entrantes. El punto de conexión de entrada de la aplicación siempre se expone en el puerto 443. Para más información, consulte Configuración de la entrada HTTPS o TCP en Azure Container Apps.
Azure Container Instances, Azure Kubernetes Establezca el puerto durante la creación de un contenedor. Debe asegurarse de que la solución tiene un marco web, un servidor de aplicaciones (por ejemplo, gunicorn, uvicorn) y un servidor web (por ejemplo, nginx). Por ejemplo, puede crear dos contenedores, un contenedor con un marco web y un servidor de aplicaciones, y otro marco con un servidor web. Los dos contenedores se comunican en un puerto y el contenedor del servidor web expone el 80/443 para las solicitudes externas.

Python Dockerfile

Un Dockerfile es un archivo de texto que contiene instrucciones para compilar una imagen de Docker. La primera línea indica la imagen base con la que empezar. Esta línea va seguida de instrucciones para instalar programas necesarios, copiar archivos y otras instrucciones para crear un entorno de trabajo. Por ejemplo, algunos ejemplos específicos de Python para las instrucciones clave de Dockerfile de Python se muestran en la tabla siguiente.

Instrucción Fin Ejemplo
FROM Establece la imagen base para obtener instrucciones posteriores. FROM python:3.8-slim
EXPONER Indica a Docker que el contenedor escucha en los puertos de red especificados en tiempo de ejecución. EXPOSE 5000
COPY Copia archivos o directorios del origen especificado y los agrega al sistema de archivos del contenedor en la ruta de acceso de destino especificada. COPY . /app
EJECUTAR Ejecuta un comando dentro de la imagen de Docker. Por ejemplo, extraiga dependencias. El comando se ejecuta una vez en tiempo de compilación. RUN python -m pip install -r requirements.txt
CMD El comando proporciona el valor predeterminado para ejecutar un contenedor. Solo puede haber una instrucción CMD. CMD ["gunicorn", "--bind", "0.0.0.0:5000", "wsgi:app"]

El comando docker build compila imágenes de Docker a partir de un Dockerfile y un contexto. El contexto de una compilación es el conjunto de archivos ubicados en la ruta de acceso o dirección URL especificadas. Normalmente, creará una imagen a partir de la raíz del proyecto de Python y la ruta de acceso para el comando de compilación es "." como se muestra en el ejemplo siguiente.

docker build --rm --pull  --file "Dockerfile"  --tag "mywebapp:latest"  .

El proceso de compilación puede hacer referencia a cualquiera de los archivos del contexto. Por ejemplo, la compilación puede usar una instrucción COPY para hacer referencia a un archivo en el contexto. Este es un ejemplo de un Dockerfile para un proyecto de Python mediante el marco de Flask :

FROM python:3.8-slim

EXPOSE 5000

# Keeps Python from generating .pyc files in the container.
ENV PYTHONDONTWRITEBYTECODE=1

# Turns off buffering for easier container logging
ENV PYTHONUNBUFFERED=1

# Install pip requirements.
COPY requirements.txt .
RUN python -m pip install -r requirements.txt

WORKDIR /app
COPY . /app

# Creates a non-root user with an explicit UID and adds permission to access the /app folder.
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser

# Provides defaults for an executing container; can be overridden with Docker CLI.
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "wsgi:app"]

Puede crear un Dockerfile manualmente o crearlo automáticamente con VS Code y la extensión de Docker. Para obtener más información, consulte Generación de archivos de Docker.

El comando docker build forma parte de la CLI de Docker. Cuando se usan IDE como VS Code o PyCharm, los comandos de interfaz de usuario para trabajar con imágenes de Docker llaman al comando de compilación automáticamente y automatizan la especificación de opciones.

Trabajar con contenedores e imágenes de Docker de Python

VS Code y PyCharm

No es necesario trabajar en un entorno de desarrollo integrado (IDE) para el desarrollo de contenedores de Python, pero puede simplificar muchas tareas relacionadas con contenedores. Estas son algunas de las cosas que puede hacer con VS Code y PyCharm.

  • Descargue y compile imágenes de Docker.

    • Cree imágenes en el entorno de desarrollo.
    • Compile imágenes de Docker en Azure sin Docker instaladas en el entorno de desarrollo. (Para PyCharm, use la CLI de Azure para compilar imágenes en Azure).
  • Cree y ejecute contenedores de Docker desde una imagen existente, una imagen extraída o directamente desde un Dockerfile.

  • Ejecute aplicaciones multicontenedor con Docker Compose.

  • Conectar y trabajar con registros de contenedor como Docker Hub, GitLab, JetBrains Space, Docker V2 y otros registros de Docker autohospedados.

  • (Solo VS Code) Agregue un dockerfile y archivos de Docker compose que se adapten al proyecto de Python.

Para configurar VS Code y PyCharm para ejecutar contenedores de Docker en el entorno de desarrollo, siga estos pasos.

Si aún no lo ha hecho, instale Azure Tools para VS Code.

Instrucciones Instantánea
Paso 1: Use MAYÚS + ALT + A para abrir la extensión de Azure y confirmar que está conectado a Azure.

También puede seleccionar el icono de Azure en la barra de extensiones de VS Code.

Si no ha iniciado sesión, seleccione Iniciar sesión en Azure y siga las indicaciones.

Si tiene problemas para acceder a la suscripción de Azure, puede deberse a que está detrás de un proxy. Para resolver problemas de conexión, consulte Red Conectar ions en Visual Studio Code.
Screenshot showing how Azure Tools looks once signed in.Screenshot showing how Azure Tools looks if you aren't signed in.
Paso 2: Use CTRL + MAYÚS + X para abrir Extensiones, busque la extensión de Docker e instale la extensión.

También puede seleccionar el icono Extensiones en la barra de extensiones de VS Code.
Screenshot showing how to add Docker extension to VS Code.
Paso 3: Seleccione el icono de Docker en la barra de extensiones, expanda imágenes y haga clic con el botón derecho en una imagen que la ejecute como contenedor. Screenshot showing how to use the Docker extension in VS Code to run a container from a Docker image.
Paso 4: Supervisar la salida de ejecución de Docker en la ventana Terminal . Screenshot showing an example of running a container in VS Code.

CLI de Azure y CLI de Docker

También puede trabajar con imágenes y contenedores de Docker de Python mediante la CLI de Azure y la CLI de Docker. VS Code y PyCharm tienen terminales donde puede ejecutar estas CLIs.

Use una CLI cuando desee un control más preciso sobre los argumentos de compilación y ejecución, y para la automatización. Por ejemplo, el siguiente comando muestra cómo usar la CLI de Azure az acr build para especificar el nombre de la imagen de Docker.

az acr build --registry <registry-name> \
  --resource-group <resource-group> \
  --target pythoncontainerwebapp:latest .

Como otro ejemplo, considere el siguiente comando que muestra cómo usar el comando run de la CLI de Docker. En el ejemplo se muestra cómo ejecutar un contenedor de Docker que se comunica con una instancia de MongoDB en el entorno de desarrollo, fuera del contenedor. Los distintos valores para completar el comando son más fáciles de automatizar cuando se especifican en una línea de comandos.

docker run --rm -it \
  --publish <port>:<port> --publish 27017:27017 \
  --add-host mongoservice:<your-server-IP-address> \
  --env CONNECTION_STRING=mongodb://mongoservice:27017 \
  --env DB_NAME=<database-name> \
  --env COLLECTION_NAME=<collection-name> \
  containermongo:latest  

Para obtener más información sobre este escenario, consulte Compilación y prueba de una aplicación web de Python en contenedores localmente.

Variables de entorno en contenedores

Los proyectos de Python suelen usar variables de entorno para pasar datos al código. Por ejemplo, puede especificar información de conexión de base de datos en una variable de entorno para que se pueda cambiar fácilmente durante las pruebas. O bien, al implementar el proyecto en producción, la conexión de base de datos se puede cambiar para hacer referencia a una instancia de base de datos de producción.

Los paquetes como python-dotenv se usan a menudo para leer pares clave-valor de un archivo .env y establecerlos como variables de entorno. Un archivo .env es útil cuando se ejecuta en un entorno virtual, pero no se recomienda al trabajar con contenedores. No copie el archivo .env en la imagen de Docker, especialmente si contiene información confidencial y el contenedor se hará público. Use el archivo .dockerignore para excluir que los archivos se copien en la imagen de Docker. Para obtener más información, consulte la sección Entornos virtuales y contenedores de este artículo.

Puede pasar variables de entorno a contenedores de varias maneras:

  1. Se define en el Dockerfile como instrucciones enV .
  2. Se pasa como --build-arg argumentos con el comando de compilación de Docker.
  3. Se pasa como --secret argumentos con el comando de compilación de Docker y el back-end buildKit .
  4. Se pasa como --env argumentos o --env-file con el comando Docker run .

Las dos primeras opciones tienen el mismo inconveniente que se indicó anteriormente con archivos .env , es decir, que está codificando información potencialmente confidencial en una imagen de Docker. Puede inspeccionar una imagen de Docker y ver las variables de entorno, por ejemplo, con el comando docker image inspect.

La tercera opción con BuildKit permite pasar información secreta que se usará en el Dockerfile para compilar imágenes de Docker de una manera segura que no termine almacenada en la imagen final.

La cuarta opción de pasar variables de entorno con el comando Docker run significa que la imagen de Docker no contiene las variables. Sin embargo, las variables siguen siendo visibles inspeccionando la instancia de contenedor (por ejemplo, con la inspección del contenedor de Docker). Esta opción puede ser aceptable cuando el acceso a la instancia de contenedor se controla o en escenarios de pruebas o desarrollo.

Este es un ejemplo de cómo pasar variables de entorno mediante el comando run de la CLI de Docker y mediante el --env argumento .

# PORT=8000 for Django and 5000 for Flask
export PORT=<port-number>

docker run --rm -it \
  --publish $PORT:$PORT \
  --env CONNECTION_STRING=<connection-info> \
  --env DB_NAME=<database-name> \
  <dockerimagename:tag>

Si usa VS Code o PyCharm, las opciones de interfaz de usuario para trabajar con imágenes y contenedores usan en última instancia comandos de la CLI de Docker como el que se muestra anteriormente.

Por último, especificar variables de entorno al implementar un contenedor en Azure es diferente de usar variables de entorno en el entorno de desarrollo. Por ejemplo:

  • En el caso de Web App for Containers, se configuran las opciones de la aplicación durante la configuración de App Service. Esta configuración está disponible para el código de la aplicación como variables de entorno y se puede acceder a ella mediante el patrón estándar os.environ. Puede cambiar los valores después de la implementación inicial cuando sea necesario. Para obtener más información, consulte Access app settings as environment variables (Configuración de la aplicación de Access como variables de entorno).

  • Para Azure Container Apps, puede configurar variables de entorno durante la configuración inicial de la aplicación contenedora. La modificación posterior de las variables de entorno crea una revisión del contenedor. Además, Azure Container Apps permite definir secretos en el nivel de aplicación y, a continuación, hacer referencia a ellos en variables de entorno. Para más información, consulte Administración de secretos en Azure Container Apps.

Como otra opción, puede usar Service Conectar or para ayudarle a conectar los servicios de proceso de Azure a otros servicios de respaldo. Este servicio establece la configuración de red y la información de conexión (por ejemplo, la generación de variables de entorno) entre los servicios de proceso y los servicios de respaldo de destino en el plano de administración.

Visualización de los registros de contenedores

Vea los registros de instancia de contenedor para ver la salida de mensajes de diagnóstico del código y solucionar problemas en el código del contenedor. Estas son varias maneras de ver los registros al ejecutar un contenedor en el entorno de desarrollo:

  • Al ejecutar un contenedor con VS Code o PyCharm, como se muestra en la sección VS Code y PyCharm, puede ver los registros en las ventanas de terminal abiertas cuando se ejecuta Docker.

  • Si usa el comando run de la CLI de Docker con la marca -itinteractiva , verá la salida siguiendo el comando .

  • En Docker Desktop, también puede ver los registros de un contenedor en ejecución.

Al implementar un contenedor en Azure, también tiene acceso a los registros de contenedor. Estos son varios servicios de Azure y cómo acceder a los registros de contenedor en Azure Portal.

Servicio de Azure Acceso a los registros en Azure Portal
Web App for Containers Vaya al recurso Diagnosticar y resolver problemas para ver los registros. El diagnóstico es una experiencia inteligente e interactiva para ayudarle a solucionar problemas de la aplicación sin que se requiera ninguna configuración. Para obtener una vista en tiempo real de los registros, vaya al flujo de registro de supervisión - . Para obtener consultas y configuraciones de registros más detalladas, consulte los demás recursos en Supervisión.
Azure Container Apps Vaya al recurso de entorno Diagnóstico y solución de problemas para solucionar problemas de entorno. Con más frecuencia, querrá ver los registros de contenedor. En el recurso de contenedor, en Administración - de revisiones de aplicaciones, seleccione la revisión y, desde allí, puede ver los registros del sistema y de la consola. Para obtener consultas de registro y configuración más detalladas, consulte los recursos en Supervisión.
Azure Container Instances Vaya al recurso Contenedores y seleccione Registros.

Para los mismos servicios enumerados anteriormente, estos son los comandos de la CLI de Azure para acceder a los registros.

Servicio de Azure Comando de la CLI de Azure para acceder a los registros
Web App for Containers az webapp log
Azure Container Apps az containerapps logs
Azure Container Instances az container logs

También se admite la visualización de registros en VS Code. Debe tener instaladas las herramientas de Azure para VS Code . A continuación se muestra un ejemplo de visualización de registros de Web Apps for Containers (App Service) en VS Code.

Screenshot showing how to view logs in VS Code for Web Apps for Containers.

Pasos siguientes