Cómo ejecutar una aplicación Flask en modo de producción en Docker

DockerBeginner
Practicar Ahora

Introducción

Docker se ha convertido en una opción popular para desplegar aplicaciones web, incluyendo aplicaciones basadas en Flask. En este tutorial, lo guiaremos a través del proceso de crear una imagen Docker (Dockerizar) de una aplicación Flask y ejecutarla en modo de producción utilizando Docker. Al final de este artículo, tendrá una comprensión sólida de cómo aprovechar Docker para desplegar su aplicación Flask en un entorno de producción.

Comprender Docker

Docker es una popular plataforma de código abierto que permite a los desarrolladores construir, desplegar y ejecutar aplicaciones en un entorno contenerizado. Proporciona una forma de empaquetar una aplicación y todas sus dependencias en un solo contenedor, lo que facilita mover la aplicación entre diferentes entornos de cómputo.

¿Qué es Docker?

Docker es una plataforma de software que permite a los desarrolladores construir, desplegar y ejecutar aplicaciones en contenedores. Un contenedor es un paquete ligero, independiente y ejecutable que incluye todo lo necesario para ejecutar una aplicación, incluyendo el código, el entorno de ejecución, las herramientas del sistema y las bibliotecas. Los contenedores están aislados entre sí y del sistema operativo del host, lo que garantiza una implementación de la aplicación consistente y confiable.

Beneficios de Docker

  1. Portabilidad: Los contenedores Docker pueden ejecutarse de manera consistente en diferentes entornos de cómputo, desde la laptop de un desarrollador hasta un servidor de producción, lo que garantiza que la aplicación se comportará de la misma manera independientemente de la infraestructura subyacente.
  2. Escalabilidad: Docker facilita escalar las aplicaciones hacia arriba o hacia abajo, según la demanda, agregando o eliminando contenedores según sea necesario.
  3. Eficiencia: Los contenedores Docker son ligeros y utilizan menos recursos que las máquinas virtuales tradicionales, lo que permite un uso más eficiente de los recursos de cómputo.
  4. Consistencia: Docker garantiza que la aplicación y sus dependencias se empaqueten juntos, eliminando el problema de "funciona en mi máquina" y asegurando un comportamiento consistente en diferentes entornos.

Arquitectura de Docker

La arquitectura de Docker consta de los siguientes componentes clave:

graph TD A[Docker Client] --> B[Docker Daemon] B --> C[Docker Images] B --> D[Docker Containers] B --> E[Docker Networking] B --> F[Docker Storage]
  1. Cliente de Docker (Docker Client): El cliente de Docker es la interfaz principal de usuario para interactuar con Docker. Permite a los usuarios emitir comandos al demonio de Docker, como construir, ejecutar y administrar contenedores.
  2. Demonio de Docker (Docker Daemon): El demonio de Docker es el servicio de backend que gestiona la creación, modificación y eliminación de objetos Docker, como imágenes, contenedores, redes y volúmenes.
  3. Imágenes de Docker (Docker Images): Las imágenes de Docker son los planos para crear contenedores Docker. Contienen el código de la aplicación, las bibliotecas, las dependencias y cualquier otro archivo necesario para ejecutar la aplicación.
  4. Contenedores de Docker (Docker Containers): Los contenedores de Docker son las instancias en ejecución de las imágenes de Docker. Son entornos aislados, ligeros y portátiles que ejecutan la aplicación.
  5. Redes de Docker (Docker Networking): Docker proporciona capacidades de red integradas que permiten a los contenedores comunicarse entre sí y con el mundo exterior.
  6. Almacenamiento de Docker (Docker Storage): Docker ofrece varias opciones de almacenamiento, incluyendo volúmenes y montajes de enlace, para gestionar los datos persistentes asociados a un contenedor.

Comprender la arquitectura de Docker y sus componentes clave es fundamental para utilizar y administrar Docker de manera efectiva en los procesos de desarrollo y despliegue de aplicaciones.

Dockerizar una aplicación Flask

En esta sección, aprenderemos cómo contenerizar una aplicación Flask utilizando Docker.

Crear una aplicación Flask

Comencemos creando una simple aplicación Flask. Crea un nuevo directorio y navega a él en tu terminal. Luego, crea un nuevo archivo llamado app.py con el siguiente contenido:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello, LabEx!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Esta aplicación Flask tiene una única ruta que devuelve el mensaje "Hello, LabEx!".

Dockerizar la aplicación Flask

Para contenerizar la aplicación Flask, necesitamos crear un Dockerfile. Crea un nuevo archivo llamado Dockerfile con el siguiente contenido:

FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "app.py"]

Desglosemos el Dockerfile:

  1. FROM python:3.9-slim: Esto especifica la imagen base para el contenedor Docker, que en este caso es la versión ligera de la imagen de Python 3.9.
  2. WORKDIR /app: Esto establece el directorio de trabajo dentro del contenedor en /app.
  3. COPY requirements.txt .: Esto copia el archivo requirements.txt al directorio de trabajo del contenedor.
  4. RUN pip install --no-cache-dir -r requirements.txt: Esto instala las dependencias de Python especificadas en el archivo requirements.txt.
  5. COPY . .: Esto copia todo el código de la aplicación (incluyendo app.py) al directorio de trabajo del contenedor.
  6. CMD ["python", "app.py"]: Esto especifica el comando a ejecutar cuando el contenedor se inicia, que es ejecutar el script app.py utilizando el intérprete de Python.

Construir y ejecutar el contenedor Docker

Ahora, construyamos la imagen Docker y ejecutemos el contenedor:

  1. Construye la imagen Docker:
    docker build -t labex-flask-app .
  2. Ejecuta el contenedor Docker:
    docker run -p 5000:5000 labex-flask-app

La opción -p 5000:5000 mapea el puerto 5000 del host al puerto 5000 del contenedor, lo que te permite acceder a la aplicación Flask desde tu máquina local.

Después de ejecutar el contenedor, puedes acceder a la aplicación Flask abriendo un navegador web y navegando a http://localhost:5000. Deberías ver el mensaje "Hello, LabEx!" mostrado.

¡Felicidades! Has contenerizado con éxito una aplicación Flask utilizando Docker.

Ejecutar una aplicación Flask en modo de producción

Cuando se ejecuta una aplicación Flask en un entorno de producción, es importante utilizar un servidor listo para producción en lugar del servidor de desarrollo incorporado. En esta sección, aprenderemos cómo ejecutar una aplicación Flask en modo de producción utilizando Docker.

Elegir un servidor de producción

Hay varios servidores web listos para producción que se pueden utilizar para ejecutar una aplicación Flask, como Gunicorn, uWSGI y Waitress. En este ejemplo, utilizaremos Gunicorn, un popular y ampliamente utilizado servidor web para aplicaciones Python.

Modificar el Dockerfile

Para ejecutar la aplicación Flask en modo de producción utilizando Gunicorn, necesitamos actualizar el Dockerfile. Reemplaza el contenido del Dockerfile con lo siguiente:

FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt.
RUN pip install --no-cache-dir -r requirements.txt

COPY..

RUN pip install gunicorn

CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]

Los cambios principales son:

  1. Agregamos RUN pip install gunicorn para instalar el servidor web Gunicorn.
  2. Cambiamos la instrucción CMD para utilizar Gunicorn para iniciar la aplicación Flask. El comando "gunicorn", "--bind", "0.0.0.0:5000", "app:app" le dice a Gunicorn que enlace la aplicación a la dirección 0.0.0.0:5000 y que utilice el objeto app del archivo app.py como la aplicación WSGI.

Construir y ejecutar el contenedor Docker listo para producción

Ahora, construyamos la imagen Docker y ejecutemos el contenedor en modo de producción:

  1. Construye la imagen Docker:
    docker build -t labex-flask-app-prod.
  2. Ejecuta el contenedor Docker:
    docker run -p 5000:5000 labex-flask-app-prod

La aplicación ahora debería estar ejecutándose en modo de producción utilizando Gunicorn.

Verificar la configuración de producción

Para verificar que la aplicación Flask se está ejecutando en modo de producción, puedes utilizar el siguiente comando para ver los registros:

docker logs <container_id>

Deberías ver una salida similar a la siguiente:

[2023-04-11 12:34:56 +0000] [1] [INFO] Starting gunicorn 20.1.0
[2023-04-11 12:34:56 +0000] [1] [INFO] Listening at: http://0.0.0.0:5000 (1)
[2023-04-11 12:34:56 +0000] [1] [INFO] Using worker: sync
[2023-04-11 12:34:56 +0000] [8] [INFO] Booting worker with pid: 8

Esto confirma que la aplicación Flask se está ejecutando en modo de producción utilizando el servidor web Gunicorn.

Resumen

Este tutorial ha cubierto los pasos esenciales para ejecutar una aplicación Flask en modo de producción utilizando Docker. Hemos explorado el proceso de crear una imagen Docker (Dockerizar) de una aplicación Flask, incluyendo la creación de un Dockerfile y la construcción de la imagen Docker. Además, hemos discutido cómo ejecutar la aplicación Flask en modo de producción dentro del contenedor Docker, asegurando una implementación confiable y escalable. Siguiendo las prácticas descritas en esta guía, puedes aprovechar eficazmente Docker para desplegar tus aplicaciones web basadas en Flask en un entorno de producción.