En cualquier proyecto de software, manejar eficazmente el back-end es esencial para lograr aplicaciones sólidas y confiables. Una excelente forma de abordar esto es mediante el despliegue de APIs construidas con Python en contenedores de Docker, facilitando consistencia y eficiencia entre diferentes entornos.
¿Qué es el back-end y cómo funciona con Python?
El back-end es aquella parte del proyecto que gestiona la lógica y el procesamiento de datos en el servidor. Utilizando Python con frameworks como Flask, puedes crear APIs ligeras y efectivas con métodos específicos que devuelven información precisa. Por ejemplo, una API Flask puede contener el método GetMyInfo encargado de ofrecer información estructurada en formato JSON.
Para visualizar el resultado podrás ejecutar un comando simple desde la terminal:
python -m flask run
Con este comando, la aplicación Flask comienza a ejecutarse localmente. Copiando la IP proporcionada con su respectivo puerto, luego puedes acceder desde un navegador agregando el método específico al final del URL (por ejemplo, /GetMyInfo). De esta forma, obtendrás confirmación visual del correcto funcionamiento de tu API.
¿Cómo desplegar una API Python dentro de Docker?
Cuando deseas asegurar que la aplicación tenga el mismo comportamiento en cualquier ambiente, Docker es una herramienta extremadamente útil. Esto implica crear un Dockerfile para preparar tu aplicación y entorno.
¿Qué es un Dockerfile y cómo crearlo para una API Python?
Un archivo Dockerfile incluye instrucciones específicas usando palabras reservadas que Docker reconoce:
FROM: Define la imagen base que utilizarás (por ejemplo, python:3.12-alpine3.17).
WORKDIR: Establece el directorio de trabajo dentro del contenedor (generalmente /app para Python).
COPY: Transfiere archivos o directorios hacia tu contenedor.
RUN: Ejecuta comandos dentro del contenedor como instalación de dependencias.
CMD: Dicta el comando a ejecutar cuando el contenedor inicie.
Aquí un ejemplo basado en la API Python mencionada:
FROM python:3.12-alpine3.17
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "-m", "flask", "run"]
Cada instrucción sigue una secuencia determinada, esencial para que Docker entienda la estructura y dónde alojar los elementos necesarios para correr tu aplicación.
¿Por qué Docker es útil para diferentes proyectos tecnológicos?
Docker utiliza términos estándar como FROM, WORKDIR, COPY, RUN y CMD, independientemente de la tecnología o plataforma que elijas trabajar. Esto significa que puedes usar estos mismos conceptos aplicados a:
Herramientas de infraestructura.
Bases de datos.
Múltiples lenguajes de programación.
Interactuar con Docker no requiere conocer tecnologías específicas, sino entender estas palabras reservadas universales.
Si deseas compartir tus experiencias o tienes alguna inquietud sobre cómo usar Docker en tus futuros desarrollos, no dudes en dejar un comentario.
Despues de 30 min, entendí que debía instalar flask primero, para poder correr la primera parte del ejemplo, debes tener instalado:
python
flask
Debes crear un entorno virtual con este comando: python -m venv venv
Luego entrar en el entorno virtual: /venv/bin/activate (si utilizas Mac o Linux) o venv\Scripts\activate (si utilizas Windows).
Luego instalas flask con: pip install Flask
y recien ahí es que puedes correr el "python -m flask run"
Todo esto asumiendo que diera un error como este "python.exe: No module named flask". ahora seguiré viendo la clase . (tenia como 3 semanas de abandono del curso porque me había quedado pegado ahí XD)
¡Hola! Me ha encantado el curso. De verdad que explicas muy bien y aprecio muchísimo que hayas explicado los fundamentos tanto con la CLI como con Docker Desktop
JAJAJAJ actualmente uso Fedora 39 con KDE. Antes usé Zorin OS, pero me pasé hace poco porque esa distro tenía packages muy viejos. ¿Y tú? En el curso veo que usaste Ubuntu, pero no sé si esa sea la que uses diariamente
Ah! Porque de esta manera primero instalas todo lo que necesitas y luego copias todos los archivos, quizá podríamos ponernos más detallistas y pasar uno por uno los archivos, eso haría las cosas más eficaces pero igual más elaboradas ¿no crees?
Es la primera vez que utilizo flask pero ya tenía instalado Python, tengo WSL (Windows Subsystem for Linux) y VSC. Para poder correr la API (1'35'' del video), utilicé los siguientes comandos en la terminal de WSL:
## dirigirte al directorio correspondiente para instalar flask
cd clase_11
## para instalar python
apt install python3.10-venv
## para crear el entorno
python3 -m venv .venv
## para instalar flask
pip install Flask
## para correr flask
python3 -m flask run
¿Qué es Flask?
Flask es un framework de Python para crear aplicaciones web y APIs. Es minimalista y popular para proyectos pequeños/medianos.
Anatomía de una app Flask mínima
python
from flask importFlaskapp =Flask(__name__)@app.route('/')def home():return"Hola Mundo"@app.route('/users')def users():return{"users":["Ana","Luis","Carlos"]}if __name__ =='__main__': app.run(host='0.0.0.0', port=5000)```**Lo que debes entender:**
| Elemento | Significado |
|----------|-------------|
| `from flask importFlask` | Importa la librería |
| `app =Flask(__name__)` | Crea la aplicación |
| `@app.route('/')` | Define una ruta/endpoint (URL) |
| `def home():` | Función que responde a esa ruta |
| `return"..."` | Lo que devuelve al navegador |
| `app.run(host='0.0.0.0', port=5000)` | Inicia el servidor en puerto 5000 |
---
### ¿Por qué `host='0.0.0.0'`?
Esto es **crítico para Docker**:
- `127.0.0.1` → Solo accesible desde dentro del contenedor
- `0.0.0.0` → Accesible desde fuera del contenedor (tu navegador)
---
### Archivo `requirements.txt`Probablemente verás este archivo. Lista las dependencias de Python:
```flask==2.0.1
Docker lo usa para instalar las librerías necesarias dentro del contenedor.
Lo que cambiará en el Dockerfile
En lugar de Nginx (servidor web estático), verás algo como:
Se copia primero solo requirements.txt para instalar dependencias.
Esto se hace porque Docker construye la imagen por capas y usa cache.
Si tus archivos de código cambian (por ejemplo, app.py), pero requirements.txt no, entonces la capa de instalación de dependencias no se vuelve a ejecutar → la build es mucho más rápida.
Déjame contarte un tip que ha cambiado por completo mi percepción del aprendizaje en general. No espero que me den toda la información. Si estás con el curso de Docker pero no conoces Flask te recomendaría muchísimo que hagas una pausa, aprendas al menos de que va esa tecnología y vuelvas acá para continuar.
Esto me ha pasado en el desarrollo de software, al aprender de historia en novelas históricas, al leer comics y mucho más, prácticalo y verás un cambio gigante en tu percepción de las cosas.
no entiendo por que primero copia el requirements.txt y luego todo el codigo (donde ya esta el requirements,txt)
Jonatan, piensa en Docker como un sistema de capas superpuestas. Cada instrucción en tu Dockerfile crea una nueva capa que se guarda en caché.
Si copias todo el código primero, cualquier cambio en un archivo de texto o una línea de tu API invalida esa capa y todas las siguientes. Al copiar solo el requirements.txt primero, esa capa de instalación de dependencias se mantiene intacta mientras tus librerías no cambien.
¿Ves cómo esto evita que Docker tenga que descargar e instalar todo de nuevo cada vez que solo modificas una línea de tu código?
Si no le pones una versión específica a Alpine en tu Dockerfile, Docker utilizará la última versión disponible por defecto. Esto puede causar problemas de compatibilidad en tu aplicación, ya que los cambios en las versiones posteriores podrían afectar el comportamiento de tu entorno. Es recomendable siempre especificar la versión para asegurar que tu aplicación funcione como se espera. Esto se aplica a cualquier imagen base, no solo a Alpine.
Para crear la imagen y después hacer el build utilicé los siguientes comandos
docker build -t api_python:latest ./docker run -it --rm -d -p 8085:5000--name api api_python
Tuve un problema con el puerto que comunica el contenedor a la aplicación (el segundo puerto), a diferencia de la página web, que nginx utiliza el puerto 80, flask utiliza por defecto el puerto 5000, por lo que si se quiere utilizar los puertos 8085:80 flask arrojara un error, ya que con el puerto 8085 el local se comunica al contenedor (Funciona siempre y cuando no estes ocupando ya ese puerto) y despues el contenedor intenta comunicarse al puerto 80 lo cual no tendrá nada ya que Flask está en el 5000.
Para que puedas hacer el primer paso de correr el servidor no en docker debes de:
Instala Python y asegúrate que esté instalado en tu terminal
Instala las dependencias del proyecto con: pip install -r requirements.txt
Corre el servidor con: python -m flask run.
Con los pasos anteriores es suficiente para correr tu servidor, pero te recomiendo que crees un entorno virtual de python en tu máquina para instalar las dependencias y correr el proyecto.
Es correcto, para actualizar a la última versiones
Flask==3.1.2
waitress==3.0.2
Por mejorar para una próxima versión de este curso: Hacer todo un poco más paso a paso incluyendo la instalación de python y flask, porque para los que apenas estamos empezando nos queda muy difícil adivinar, además de mostrar el paso a paso para desplegar el Flask en el contenedor, porque la repetición de los comandos de docker ya aprendidos aplicados acá nos va a hacer que el conocimiento se vaya arraigando. De nuevo tuve que recurrir a Deepseek para ver el servidor backend de Flask funcionando desde el contenedor docker.
Después de hacer lo de la clase lo que sigue es:
¡Perfecto! Analicemos cada archivo y hagamos las correcciones necesarias. He identificado varios problemas:
## Problemas Identificados:
1. **Falta especificar la aplicación Flask** (variable FLASK\_APP)
2. **Flask no está configurado para escuchar en 0.0.0.0**
3. **Falta el host y puerto en la ejecución**
4. **El archivo app.py no tiene la ejecución principal**
## Correcciones Paso a Paso:
### 1. Primero, detén y elimina el contenedor actual:
docker stop bakendflask
dockerrm bakendflask
### 2. Modifica el archivo app.py:
import json
from flask import Flask
app = Flask(\_\_name\_\_)@app.route('/getMyInfo')defgetMyInfo():  value = {  "name": "Amin",  "lastname": "Espinoza",  "socialMedia": \[  {"facebookUser": "aminespinoza10"},  {"instagramUser": "aminespinoza10"},  {"xUser": "aminespinoza"},  {"linkedin": "amin-espinoza"},  {"githubUser": "aminespinoza10"}  ],  "blog": "https://aminespinoza.com",  "author": "Miranda Espinoza"  }  return json.dumps(value)@app.route('/')defhome():  return json.dumps({"message": "Bienvenido a la API Flask", "status": "active"})@app.route('/health')defhealth():  return json.dumps({"status": "healthy"})
\# Añadir esta parte para ejecución directa
if \_\_name\_\_ =='\_\_main\_\_':  app.run(host='0.0.0.0', port=5000, debug=False)
### 3. Opción A: Modificar el Dockerfile (Recomendado):
FROM python:3.12-alpine3.17WORKDIR /appCOPY requirements.txt requirements.txtRUN pip install -r requirements.txtCOPY . .
\# Configurar variables de entorno
ENV FLASK\_APP=app.pyENV FLASK\_RUN\_HOST=0.0.0.0EXPOSE 5000
\# Usar este comando para producción con Waitress
CMD \["python", "-m", "waitress", "--listen=0.0.0.0:5000", "app:app"]
### 3. Opción B: Si prefieres seguir usando Flask run:
\# Verificar que el contenedor esté corriendo
dockerps\# Ver logs específicos
docker logs bakendflask
\# Ver variables de entorno del contenedor
dockerexec bakendflask env|grep FLASK
\# Probar dentro del contenedor
dockerexec bakendflask curl -s http://localhost:5000/health
## Resultado Esperado:
Después de las correcciones, cuando ejecutes:
docker logs bakendflask
Deberías ver:
 \*Running on
 \*Debug mode: off
O si usas Waitress:
Serving on
**¿Qué opción prefieres probar primero?** Te recomiendo la Opción A con Waitress para producción, o la Opción B si quieres mantener Flask run para desarrollo.