Concepto clave
Docker es una plataforma de containerización que permite empaquetar aplicaciones y sus dependencias en unidades estandarizadas llamadas contenedores. Imagina que eres un científico de datos que necesita enviar un modelo de machine learning a un colega. En lugar de enviar un documento largo con instrucciones sobre cómo configurar Python, instalar bibliotecas específicas y configurar variables de entorno, simplemente le envías un paquete que contiene todo lo necesario para ejecutar el modelo, listo para usar en cualquier computadora. Eso es lo que hace Docker: crea un entorno aislado y reproducible que garantiza que tu código funcione de la misma manera en cualquier lugar, desde tu laptop hasta un servidor en la nube.
Los contenedores son ligeros porque comparten el kernel del sistema operativo del host, a diferencia de las máquinas virtuales que requieren un sistema operativo completo. Esto los hace ideales para desplegar modelos de ML, donde la eficiencia y la portabilidad son cruciales. Por ejemplo, si desarrollas un modelo en TensorFlow con Python 3.8 en tu máquina local, Docker asegura que ese mismo entorno se replique exactamente en producción, evitando problemas como "funciona en mi máquina".
Cómo funciona en la práctica
Para containerizar un modelo de ML con Docker, sigues un flujo paso a paso que comienza con la creación de un Dockerfile, un archivo de texto que define cómo construir la imagen del contenedor. Primero, especificas una imagen base, como una versión oficial de Python. Luego, instalas las dependencias necesarias, como scikit-learn o pandas, copias tu código y configuras el punto de entrada para ejecutar el modelo. Una vez que tienes el Dockerfile, usas el comando docker build para crear una imagen, que es una plantilla inmutable del contenedor. Finalmente, ejecutas la imagen con docker run para iniciar un contenedor en vivo.
Veamos un ejemplo básico: supongamos que tienes un script de Python llamado modelo.py que entrena un clasificador simple. El proceso implica escribir un Dockerfile, construir la imagen y ejecutarla. Esto te permite probar el modelo en un entorno aislado antes de desplegarlo en Kubernetes. La clave es que cada paso es reproducible; si alguien más clona tu repositorio, puede reconstruir la imagen exacta y obtener los mismos resultados.
Código en acción
Aquí tienes un ejemplo funcional de un Dockerfile para un modelo de ML básico. Primero, el antes: un script de Python sin containerizar que podría fallar en otra máquina debido a dependencias faltantes.
# modelo.py
import pandas as pd
from sklearn.linear_model import LogisticRegression
import pickle
# Cargar datos y entrenar modelo
data = pd.read_csv('datos.csv')
X = data.drop('target', axis=1)
y = data['target']
model = LogisticRegression()
model.fit(X, y)
# Guardar modelo
with open('modelo.pkl', 'wb') as f:
pickle.dump(model, f)
print("Modelo entrenado y guardado")Ahora, el después: un Dockerfile que containeriza este script, asegurando que funcione en cualquier entorno.
# Dockerfile
# Usar una imagen base oficial de Python
FROM python:3.8-slim
# Establecer el directorio de trabajo en el contenedor
WORKDIR /app
# Copiar el archivo de requisitos e instalar dependencias
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copiar el script de Python
COPY modelo.py .
COPY datos.csv .
# Comando para ejecutar el script
CMD ["python", "modelo.py"]Para construir y ejecutar: docker build -t modelo-ml . y luego docker run modelo-ml. Esto crea un contenedor que ejecuta el modelo de forma aislada.
Errores comunes
- No optimizar el tamaño de la imagen: Usar imágenes base grandes como
python:latestpuede resultar en imágenes de varios GB. Solución: usa versiones slim (e.g.,python:3.8-slim) y limpia cachés después de instalar paquetes. - Olvidar exponer puertos: Si tu modelo sirve predicciones via API (e.g., con Flask), no configurar
EXPOSEen el Dockerfile puede evitar que el contenedor sea accesible. Solución: añadeEXPOSE 5000si usas el puerto 5000. - Copiar archivos innecesarios: Incluir datos grandes o archivos temporales en la imagen aumenta su tamaño. Solución: usa un
.dockerignorepara excluir archivos como__pycache__o datasets crudos. - No usar variables de entorno para configuraciones: Hardcodear rutas o parámetros en el código limita la flexibilidad. Solución: usa
ENVen el Dockerfile o pasa variables al ejecutar con-e. - Ignorar el contexto de build: Ejecutar
docker builddesde un directorio incorrecto puede causar errores al copiar archivos. Solución: siempre verifica que el Dockerfile y los archivos necesarios estén en el mismo directorio o ajusta las rutas en el COPY.
Checklist de dominio
- ¿Puedes explicar la diferencia entre una imagen Docker y un contenedor en una analogía simple?
- ¿Sabes escribir un Dockerfile básico que instale Python, dependencias y ejecute un script de ML?
- ¿Entiendes cómo usar
docker buildydocker runpara crear y ejecutar contenedores? - ¿Puedes listar al menos tres mejores prácticas para optimizar imágenes Docker en proyectos de ML?
- ¿Eres capaz de depurar un error común como "puerto no expuesto" o "dependencia faltante" en un contenedor?
- ¿Conoces la utilidad de un archivo
.dockerignorey cómo crearlo? - ¿Puedes containerizar un modelo simple y verificar que funcione en un entorno aislado?
Containeriza un modelo de clasificación con Docker
En este ejercicio práctico, containerizarás un modelo de machine learning básico usando Docker, simulando un escenario real donde necesitas empaquetar tu trabajo para compartirlo con un equipo. Sigue estos pasos:
- Prepara tu entorno: Asegúrate de tener Docker instalado en tu máquina. Crea un nuevo directorio para el proyecto y navega a él en tu terminal.
- Crea los archivos necesarios: Dentro del directorio, crea un script de Python llamado
train_model.pyque cargue un dataset simple (puedes usarsklearn.datasets.load_iris), entrene un modelo de clasificación (e.g.,RandomForestClassifier), y guarde el modelo entrenado en un archivomodel.pklusando pickle. - Escribe un Dockerfile: Crea un archivo llamado
Dockerfile(sin extensión) que:- Use la imagen base
python:3.8-slim. - Establezca un directorio de trabajo, por ejemplo,
/app. - Copie un archivo
requirements.txt(que debes crear con al menosscikit-learnypandas) e instale las dependencias. - Copie el script
train_model.py. - Defina el comando para ejecutar el script al iniciar el contenedor.
- Use la imagen base
- Construye y ejecuta la imagen: En la terminal, ejecuta
docker build -t ml-classifier .para construir la imagen. Luego, ejecutadocker run ml-classifierpara iniciar el contenedor y ver la salida del entrenamiento. - Verifica el resultado: Confirma que el contenedor se ejecutó correctamente y que el archivo
model.pklse generó dentro del contenedor (puedes inspeccionar condocker run -it ml-classifier shpara entrar al contenedor y listar archivos).
Este ejercicio te prepara para containerizar flujos más complejos de ML y desplegarlos en Kubernetes.
Pistas- Recuerda que el archivo requirements.txt debe listar scikit-learn y pandas con versiones específicas si es necesario, por ejemplo: scikit-learn==1.0.2.
- Si encuentras un error al construir la imagen, verifica que todos los archivos (Dockerfile, requirements.txt, train_model.py) estén en el mismo directorio desde donde ejecutas docker build.
- Para ver los logs del contenedor si falla, usa docker logs después de ejecutarlo, o añade prints en tu script para depurar.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.