El verdadero poder de Docker se libera cuando dejas de usar solo imágenes preexistentes y empiezas a crear las tuyas. Esto te permite empaquetar tus propias aplicaciones y dependencias. La herramienta para esto es el Dockerfile.
Un Dockerfile es un script que contiene una serie de instrucciones para ensamblar una imagen. Se lee de arriba hacia abajo, y cada instrucción crea una nueva capa en la imagen.
Para este ejemplo, necesitarás una carpeta que contenga tres archivos. Si usas Windows, el proceso es el siguiente:
C:\proyectos\mi-app-flask
. Toda la operación se realizará dentro de esta carpeta.app.py
: El código de tu aplicación.requirements.txt
: Las dependencias de Python.Dockerfile
: Las instrucciones de Docker.Dockerfile
! Es muy importante que el archivo se llame exactamente Dockerfile
, sin ninguna extensión como .txt
. Si usas el Bloc de notas, al guardar, asegúrate de cambiar el "Tipo" a "Todos los archivos (*.*)" para evitar que Windows le añada una extensión automáticamente.A continuación, este es el contenido que debes poner en cada archivo.
Vamos a crear una imagen para una aplicación web simple con Python y Flask. Primero, la aplicación (app.py
):
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "¡Hola, mundo desde un contenedor Docker!"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Y sus dependencias (requirements.txt
):
Flask>=2.3
Ahora, el Dockerfile
que empaqueta esta aplicación:
# 1. Especificar la imagen base
FROM python:3.9-slim
# 2. Establecer el directorio de trabajo
WORKDIR /app
# 3. Copiar e instalar dependencias
COPY requirements.txt .
RUN pip install -r requirements.txt
# 4. Copiar el código de la aplicación
COPY . .
# 5. Exponer el puerto que usa la aplicación
EXPOSE 5000
# 6. Definir el comando para ejecutar la aplicación
CMD ["flask", "run", "--host=0.0.0.0"]
COPY <origen> <destino>
.Con los tres archivos (`app.py`, `requirements.txt`, `Dockerfile`) en el mismo directorio, ejecuta el siguiente comando:
docker build -t mi-app-flask:1.0 .
-t mi-app-flask:1.0
: Etiqueta (tag) la imagen con un nombre y una versión. Es una práctica fundamental..
: El punto final indica el contexto de la construcción (build context), es decir, el directorio que contiene el Dockerfile y los archivos de la aplicación.Verás cómo Docker ejecuta cada instrucción del Dockerfile, creando una capa para cada una.
Una vez construida, la ejecutamos como cualquier otra imagen:
docker run -d -p 5000:5000 --name mi-app mi-app-flask:1.0
Si ahora vas a http://localhost:5000
en tu navegador, verás el mensaje de la aplicación Flask. ¡Tu aplicación ahora está contenedorizada!
Cambiemos de nuevo el ejemplo para usar FastAPI, un framework web moderno y de alto rendimiento para crear APIs con Python. El objetivo será crear un endpoint /
que devuelva un objeto JSON.
Una vez más, modifica el contenido de tus archivos de proyecto.
1. Modifica app.py
:
Este es el código para una API mínima con FastAPI.
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hola mundo"}
2. Modifica requirements.txt
:
FastAPI necesita un servidor ASGI como Uvicorn para ejecutarse.
fastapi==0.85.0
uvicorn[standard]==0.18.3
3. Modifica tu Dockerfile
:
El Dockerfile debe ser adaptado para instalar las nuevas dependencias y para usar uvicorn
para lanzar la aplicación.
# 1. Imagen base
FROM python:3.9-slim
# 2. Directorio de trabajo
WORKDIR /app
# 3. Instalar dependencias
COPY requirements.txt .
RUN pip install -r requirements.txt
# 4. Copiar aplicación
COPY app.py .
# 5. Exponer el puerto por defecto de Uvicorn
EXPOSE 8000
# 6. Comando para iniciar el servidor con Uvicorn
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
Construimos la imagen con una etiqueta específica para FastAPI.
# Construir la imagen de la API
docker build -t mi-app-fastapi:1.0 .
Al ejecutar, mapeamos un puerto de nuestra máquina (p. ej. 8000) al puerto del contenedor (8000).
# Ejecutar el contenedor mapeando el puerto 8000 al 8000
docker run --rm -p 8000:8000 mi-app-fastapi:1.0
Si ahora visitas http://localhost:8000
en tu navegador, verás la respuesta JSON: {"message":"Hola mundo"}
.
RUN apt-get update && apt-get install -y curl