Compartir a través de


Implementar una aplicación web de Flask o FastPI contenedorizada en Azure App Service

En este tutorial se muestra cómo implementar una aplicación web Flask o FastAPI de Python en Azure App Service mediante la característica Web App for Containers. Este enfoque proporciona una ruta de acceso simplificada para los desarrolladores que desean las ventajas de una plataforma totalmente administrada al implementar su aplicación como un único artefacto contenedorizado con todas las dependencias incluidas. Para obtener más información sobre el uso de contenedores en Azure, consulte Comparación de las opciones de contenedor de Azure.

En este tutorial, usa la CLI de Docker y Docker para, opcionalmente, compilar y probar una imagen de Docker localmente. Después, use la CLI de Azure para insertar la imagen de Docker en Azure Container Registry (ACR) e implementarla en Azure App Service. La aplicación web se configura con su identidad administrada asignada por el sistema para obtener acceso seguro y sin contraseña para extraer la imagen de ACR mediante el control de acceso basado en rol (RBAC) de Azure. También puede implementar con Visual Studio Code con la extensión de Azure Tools instalada.

Para obtener un ejemplo de cómo compilar y crear una imagen de Docker para ejecutarse en Azure Container Apps, consulte Implementación de una aplicación web Flask o FastPI en Azure Container Apps.

Nota:

En este tutorial se muestra cómo crear una imagen de Docker que se pueda implementar en Azure App Service. Sin embargo, no es necesario usar una imagen de Docker para implementarla en App Service. También puede implementar el código de la aplicación directamente desde el área de trabajo local en App Service sin crear una imagen de Docker. Para ver ejemplo, consulte Inicio rápido: implementación de una aplicación web de Python (Django o Flask) en Azure App Service.

Requisitos previos

Para completar este tutorial, necesita:

Obtención del código de ejemplo

En el entorno local, obtenga el código.

git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart.git
cd msdocs-python-flask-webapp-quickstart

Adición de archivos Dockerfile y .dockerignore

Agregue un Dockerfile para indicar a Docker cómo compilar la imagen. El Dockerfile especifica el uso de Gunicorn, un servidor web de nivel de producción que reenvía las solicitudes web a los marcos Flask y FastAPI. Los comandos ENTRYPOINT y CMD indican a Gunicorn que controle las solicitudes del objeto de aplicación.

# syntax=docker/dockerfile:1

FROM python:3.11

WORKDIR /code

COPY requirements.txt .

RUN pip3 install -r requirements.txt

COPY . .

EXPOSE 50505

ENTRYPOINT ["gunicorn", "app:app"]

50505 se usa para el puerto de contenedor (interno) en este ejemplo, pero puede usar cualquier puerto libre.

Compruebe el archivo requirements.txt para asegurarse de que contiene gunicorn.

Flask==3.1.0
gunicorn

Agregue un archivo .dockerignore para excluir archivos innecesarios de la imagen.

.git*
**/*.pyc
.venv/

Configuración de gunicorn

Gunicorn se puede configurar con un archivo gunicorn.conf.py. Cuando el archivo gunicorn.conf.py se encuentra en el mismo directorio donde se ejecuta gunicorn, no es necesario especificar su ubicación en el Dockerfile. Para obtener más información sobre cómo especificar el archivo de configuración, consulte Configuración de Gunicorn.

En este tutorial, el archivo de configuración sugerido configura gunicorn para aumentar su número de trabajos en función del número de núcleos de CPU disponibles. Para obtener más información sobre la configuración de archivos gunicorn.conf.py, consulte Configuración de Gunicorn.

# Gunicorn configuration file
import multiprocessing

max_requests = 1000
max_requests_jitter = 50

log_file = "-"

bind = "0.0.0.0:50505"

workers = (multiprocessing.cpu_count() * 2) + 1
threads = workers

timeout = 120

Compilación y ejecución local de la imagen

Compile la imagen localmente.

docker build --tag flask-demo .

Nota:

Si el comando docker build devuelve un error, asegúrese de que se está ejecutando el demonio del docker. En Windows, asegúrese de que Docker Desktop se esté ejecutando.

Ejecute la imagen localmente en un contenedor de Docker.

docker run --detach --publish 5000:50505 flask-demo

Abra la URL http://localhost:5000 en el explorador para ver la aplicación web que se ejecuta localmente.

La opción --detach ejecuta el contenedor en segundo plano. La opción --publish asigna el puerto de contenedor a un puerto en el host. El puerto host (externo) es primero en el par y el puerto de contenedor (interno) es el segundo. Para más información, consulte Referencia de ejecución de Docker.

Creación de un grupo de recursos y una instancia de Azure Container Registry

  1. Ejecute el comando az login para iniciar sesión en Azure.

    az login
    
  2. Ejecute el comando az upgrade para asegurarse de que la versión de la CLI de Azure está actualizada.

    az upgrade
    
  3. Cree un grupo con el comando az group create.

    RESOURCE_GROUP_NAME=<resource-group-name>
    LOCATION=<location>
    az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
    

    Un grupo de recursos de Azure es un contenedor lógico en el que se implementan y se administran los recursos de Azure. Al crear un grupo de recursos, especifique una ubicación como eastus. Reemplace por <location> la ubicación que elija. Algunas SKU no están disponibles en determinadas ubicaciones, por lo que es posible que reciba un error que indique esto. Use otra ubicación e inténtelo de nuevo.

  4. Cree una instancia de Azure Container Registry con el comando az acr create. Reemplace <container-registry-name> por un nombre único para la instancia.

    CONTAINER_REGISTRY_NAME=<container-registry-name>
    az acr create --resource-group $RESOURCE_GROOUP_NAME \
    --name $CONTAINER_REGISTRY_NAME --sku Basic
    

    Nota:

    El nombre del registro debe ser único en Azure. Si recibe un error, pruebe con un nombre diferente. Los nombres de registro pueden tener de 5 a 50 caracteres alfanuméricos. No se permiten guiones ni caracteres de subrayado. Para obtener más información, consulte Reglas de nombres de instancias de Azure Container Registry. Si usa un nombre diferente, asegúrese de usar su nombre en lugar de webappacr123 en los comandos que hacen referencia al registro y a los artefactos del registro en las secciones siguientes.

    Azure Container Registry es un registro privado de Docker que almacena imágenes para su uso en Azure Container Instances, Azure App Service, Azure Kubernetes Service y otros servicios. Al crear un registro, especifique un nombre, una SKU y un grupo de recursos.

Compilación de la imagen en Azure Container Registry

Compile la imagen de Docker en Azure con el comando az acr build. El comando usa el Dockerfile en el directorio actual e inserta la imagen en el registro.

az acr build \
  --resource-group $RESOURCE_GROUP_NAME \
  --registry $CONTAINER_REGISTRY_NAME \
  --image webappsimple:latest .

La opción --registry especifica el nombre del registro y la opción --image especifica el nombre de la imagen. El nombre de la imagen está en el formato registry.azurecr.io/repository:tag.

Implementación de la aplicación web en Azure

  1. Cree un plan de App Service con el comando az appservice plan.

    az appservice plan create \
    --name webplan \
    --resource-group $RESOURCE_GROUP_NAME \
    --sku B1 \
    --is-linux
    
  2. Establezca una variable de entorno para el ID suscripción. Se usa en el parámetro --scope en el comando siguiente.

    SUBSCRIPTION_ID=$(az account show --query id --output tsv)
    

    El comando para crear la variable de entorno se muestra para el shell de Bash. Cambie la sintaxis según corresponda para otros entornos.

  3. Cree la aplicación web con el comando az webapp create.

    export MSYS_NO_PATHCONV=1 # This line is for Windows users to prevent path conversion issues in Git Bash.
    az webapp create \
    --resource-group $RESOURCE_GROUP_NAME \
    --plan webplan --name <container-registry-name> \
    --assign-identity [system] \
    --role AcrPull \
    --scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME \
    --acr-use-identity --acr-identity [system] \
    --container-image-name $CONTAINER_REGISTRY_NAME.azurecr.io/webappsimple:latest 
    

    Notas:

    • El nombre de la aplicación web debe ser único en Azure. Si recibe un error, pruebe con un nombre diferente. El nombre puede constar de caracteres alfanuméricos y guiones, pero no puede empezar ni terminar con un guion. Para obtener más información, consulte Reglas de nombres de Microsoft.Web.

    • Si usa un nombre diferente de webappacr123 para su instancia de Azure Container Registry, asegúrese de actualizar el parámetro --container-image-name correctamente.

    • Los parámetros --assign-identity, --role y --scope habilitan la identidad administrada asignada por el sistema en la aplicación web y le asignan el rol de AcrPull en el grupo de recursos. Esto proporciona permiso de identidad administrada para extraer imágenes de cualquier instancia de Azure Container Registry en el grupo de recursos.

    • Los parámetros --acr-use-identity y --acr-identity configuran la aplicación web para que use su identidad administrada asignada por el sistema para extraer imágenes de Azure Container Registry.

    • La creación de la aplicación web puede tardar unos minutos. Puede comprobar los registros de implementación con el comando az webapp log tail. Por ejemplo, az webapp log tail --resource-group web-app-simple-rg --name webappsimple123. Si ve entradas con "warmup", significa que el contenedor se está implementando.

    • La URL de la aplicación web es <web-app-name>.azurewebsites.net, por ejemplo, https://webappsimple123.azurewebsites.net.

Actualizaciones y nuevas implementaciones

Después de realizar cambios en el código, puede volver a implementar en App Service con los comandos az acr build y az webapp update.

Limpiar

Todos los recursos de Azure creados en este tutorial están en el mismo grupo de recursos. Al quitar el grupo de recursos se quitan todos los recursos que haya dentro; es la manera más rápida de quitar todos los recursos de Azure usados para la aplicación.

Para quitar recursos, use el comando az group delete.

az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait

También puede quitar el grupo en Azure Portal o en Visual Studio Code y la extensión de Azure Tools.

Pasos siguientes

Para obtener más información, consulte los siguientes recursos: