Cómo ejecutar una aplicación Flask dentro de un contenedor Docker

DockerBeginner
Practicar Ahora

Introducción

En este tutorial, exploraremos el proceso de ejecutar una aplicación Flask dentro de un contenedor Docker. Cubriremos los fundamentos de Docker, construiremos una aplicación Flask y, a continuación, encapsularemos la aplicación Flask para aprovechar los beneficios que proporciona Docker.

Entendiendo Docker

Docker es una plataforma de código abierto popular que permite a los desarrolladores construir, desplegar y ejecutar aplicaciones en un entorno contenedorizado. Los contenedores son paquetes de software ligeros, autónomos y ejecutables que incluyen todo lo necesario para ejecutar una aplicación, incluyendo el código, el tiempo de ejecución, las herramientas del sistema y las bibliotecas.

¿Qué es Docker?

Docker es una herramienta diseñada para facilitar la creación, el despliegue y la ejecución de aplicaciones mediante el uso de contenedores. Los contenedores permiten a un desarrollador empaquetar una aplicación con todas las partes que necesita, como bibliotecas y otras dependencias, y enviarla como un solo paquete.

Arquitectura de Docker

La arquitectura de Docker consta de los siguientes componentes:

graph TD A[Cliente Docker] --> B[Demonio Docker] B --> C[Imágenes Docker] B --> D[Contenedores Docker] B --> E[Registros Docker]
  • Cliente Docker: La interfaz de usuario para interactuar con el sistema Docker.
  • Demonio Docker: El proceso de fondo que gestiona los objetos Docker, como imágenes, contenedores, redes y volúmenes.
  • Imágenes Docker: Plantillas para crear contenedores Docker.
  • Contenedores Docker: Instancias ejecutables de imágenes Docker.
  • Registros Docker: Repositorios para almacenar y distribuir imágenes Docker.

Beneficios del uso de Docker

  1. Entornos consistentes: Docker garantiza que las aplicaciones se ejecuten de la misma manera, independientemente de la infraestructura subyacente.
  2. Escalabilidad: Los contenedores Docker se pueden escalar fácilmente hacia arriba o hacia abajo para satisfacer la demanda cambiante.
  3. Portabilidad: Los contenedores Docker se pueden ejecutar en cualquier sistema que tenga Docker instalado, lo que facilita el traslado de aplicaciones entre diferentes entornos.
  4. Eficiencia: Los contenedores Docker son ligeros y utilizan menos recursos que las máquinas virtuales tradicionales.
  5. Aislamiento: Los contenedores Docker proporcionan un alto grado de aislamiento, asegurando que las aplicaciones se ejecuten en un entorno seguro y consistente.

Comenzando con Docker

Para comenzar con Docker, necesitarás instalar el motor Docker en tu sistema. Puedes descargar Docker desde el sitio web oficial (https://www.docker.com/get-started) y seguir las instrucciones de instalación para tu sistema operativo.

Una vez que tengas Docker instalado, puedes comenzar a construir y ejecutar contenedores Docker. Aquí hay un ejemplo simple de cómo ejecutar un contenedor Docker con la imagen Ubuntu:

docker run -it ubuntu

Este comando extraerá la imagen Ubuntu del registro Docker, creará un nuevo contenedor e iniciará una sesión de shell interactiva dentro del contenedor.

Creación de una Aplicación Flask

Flask es un popular framework web de Python ligero, flexible y fácil de usar. En esta sección, recorreremos el proceso de creación de una sencilla aplicación Flask.

Configurando el Entorno de Desarrollo

Primero, configuremos el entorno de desarrollo. Usaremos Python 3.9 y Flask 2.0.2 para este ejemplo.

## Instalar Python 3.9
sudo apt-get update
sudo apt-get install -y python3.9

## Instalar Flask
pip3 install flask==2.0.2

Creando una Aplicación Flask

Ahora, creemos una sencilla aplicación Flask. Crea un nuevo archivo llamado app.py y añade el siguiente código:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return '¡Hola, LabEx!'

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

En este ejemplo, importamos la clase Flask del módulo flask, creamos una nueva instancia de Flask y definimos una ruta para la URL raíz (/) que devuelve la cadena "¡Hola, LabEx!". Finalmente, ejecutamos la aplicación usando el método app.run().

Ejecutando la Aplicación Flask

Para ejecutar la aplicación Flask, ejecuta el siguiente comando en tu terminal:

python3 app.py

Esto iniciará el servidor de desarrollo de Flask y hará que tu aplicación esté disponible en http://localhost:5000/.

Añadiendo Funcionalidad

Puedes añadir fácilmente más funcionalidad a tu aplicación Flask definiendo rutas adicionales y añadiendo lógica de negocio. Por ejemplo, puedes crear una ruta que acepte la entrada del usuario, realice algún procesamiento y devuelva una respuesta.

from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def index():
    return '¡Hola, LabEx!'

@app.route('/greet', methods=['POST'])
def greet():
    name = request.form['name']
    return f'¡Hola, {name}!'

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

En este ejemplo, hemos añadido una nueva ruta /greet que acepta una solicitud POST con un parámetro name. La aplicación luego devuelve un mensaje de saludo con el nombre proporcionado.

Contenizando la Aplicación Flask

Ahora que tenemos una aplicación Flask básica, contenizámosla usando Docker. Contenizar una aplicación nos permite empaquetarla, junto con sus dependencias, en una unidad autocontenida que se puede desplegar y escalar fácilmente.

Creando un Dockerfile

Para contenizar nuestra aplicación Flask, necesitamos crear un Dockerfile. Un Dockerfile es un documento de texto que contiene todos los comandos que un usuario podría ejecutar en la línea de comandos para ensamblar una imagen.

Crea un nuevo archivo llamado Dockerfile y añade el siguiente contenido:

## Usa la imagen oficial de Python como imagen base
FROM python:3.9-slim

## Establece el directorio de trabajo en /app
WORKDIR /app

## Copia el archivo requirements.txt en el contenedor
COPY requirements.txt .

## Instala las dependencias de Python
RUN pip install --no-cache-dir -r requirements.txt

## Copia el código de la aplicación Flask en el contenedor
COPY app.py .

## Exponer el puerto en el que se ejecutará la aplicación Flask
EXPOSE 5000

## Establece el comando para ejecutar la aplicación Flask
CMD ["python", "app.py"]

En este Dockerfile, hacemos lo siguiente:

  1. Usamos la imagen oficial de Python 3.9 slim como imagen base.
  2. Establecemos el directorio de trabajo en /app.
  3. Copiamos el archivo requirements.txt en el contenedor.
  4. Instalamos las dependencias de Python.
  5. Copiamos el archivo app.py en el contenedor.
  6. Exponemos el puerto 5000 para la aplicación Flask.
  7. Establecemos el comando para ejecutar la aplicación Flask.

Construyendo la Imagen Docker

Ahora, construyamos la imagen Docker para nuestra aplicación Flask. En tu terminal, ejecuta el siguiente comando:

docker build -t labex-flask-app .

Este comando construirá una imagen Docker con la etiqueta labex-flask-app usando el Dockerfile en el directorio actual.

Ejecutando el Contenedor Docker

Después de construir la imagen, podemos ejecutar la aplicación Flask en un contenedor Docker:

docker run -p 5000:5000 labex-flask-app

Este comando iniciará un nuevo contenedor basado en la imagen labex-flask-app y mapeará el puerto 5000 del host al puerto 5000 en el contenedor.

Ahora puedes acceder a la aplicación Flask en http://localhost:5000/.

Desplegando la Imagen Docker

Una vez que tengas tu aplicación Flask contenizada, puedes desplegar la imagen Docker en un registro de contenedores, como Docker Hub o un registro privado, y luego desplegar la aplicación en un entorno de producción.

Resumen

Al finalizar este tutorial, tendrás una comprensión sólida de cómo contenizar una aplicación Flask utilizando Docker. Podrás construir una imagen Docker para tu aplicación Flask, ejecutarla en un contenedor Docker y aprovechar las ventajas de Docker para el desarrollo y despliegue de Flask.