Instalación y configuración de Docker en tu entorno

Lectura
20 min~11 min lectura

Lección: Instalación y configuración de Docker en tu entorno

Bienvenido, científico de datos. Esta lección es tu puerta de entrada práctica al mundo de la containerización. Mientras que los conceptos teóricos de Docker son fascinantes, su verdadero poder se libera cuando está correctamente instalado y configurado en tu máquina. Esta guía detallada no solo te mostrará cómo instalar Docker, sino que te explicará por qué cada paso es crucial, cómo configurarlo para optimizar tus flujos de trabajo de Machine Learning y cómo diagnosticar y solucionar problemas comunes. Asumiremos que tienes conocimientos intermedios de línea de comandos y administración básica de sistemas.

Preparando el Terreno: Requisitos del Sistema y Elección de Distribución

Antes de descargar un solo paquete, es fundamental entender que Docker no es una aplicación aislada, sino una plataforma que interactúa profundamente con el kernel de tu sistema operativo. En Linux, Docker utiliza directamente las capacidades de contenedores del kernel (cgroups y namespaces). En macOS y Windows, se ejecuta dentro de una máquina virtual Linux ligera (hipervisor). Para un científico de datos, esta distinción es vital: el rendimiento de la virtualización en sistemas no-Linux puede afectar ligeramente el entrenamiento de modelos muy largos, aunque para la mayoría de los casos de uso es imperceptible.

Los requisitos varían, pero un punto común es la necesidad de habilitar la virtualización en la BIOS/UEFI (especialmente en Windows). Para entornos de desarrollo en ML, se recomienda un mínimo de 4 GB de RAM para el propio Docker, además de los recursos que necesiten tus modelos. Si planeas trabajar con modelos de Deep Learning grandes (como LLMs o Vision Transformers), 16 GB de RAM o más y una GPU compatible son altamente recomendables. Docker tiene soporte para GPU a través de NVIDIA Container Toolkit, un componente que instalaremos más adelante.

Tip del Instructor: Si trabajas en una empresa, verifica las políticas de seguridad antes de instalar Docker. Algunas organizaciones restringen la instalación de software que requiera privilegios de administrador o que cree puentes de red, como lo hace Docker. La comunicación temprana con el departamento de IT puede ahorrarte horas de frustración.

Proceso de Instalación Paso a Paso en Linux (Ubuntu/Debian)

Linux es el entorno nativo para Docker y el más común en servidores de producción. Aquí cubriremos la instalación en Ubuntu 22.04 LTS, pero los pasos son análogos para otras distribuciones. El método recomendado es usar los repositorios oficiales de Docker, no los paquetes de la distribución, para obtener las versiones más recientes y estables.

Primero, actualizamos el índice de paquetes y eliminamos instalaciones conflictivas previas (como `docker.io`, `docker-engine` o `docker-ce` antiguos). Luego, instalamos los paquetes necesarios para permitir que `apt` use repositorios a través de HTTPS. El paso clave es agregar la clave GPG oficial de Docker y el repositorio estable a nuestras fuentes de software. Una vez configurado el repositorio, podemos instalar el motor Docker, la CLI, containerd, y Docker Compose.

#!/bin/bash
# 1. Actualizar el índice de paquetes e instalar dependencias previas.
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release

# 2. Agregar la clave GPG oficial de Docker.
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 3. Configurar el repositorio estable.
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 4. Actualizar de nuevo e instalar Docker Engine, CLI, Containerd y Docker Compose.
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 5. Verificar la instalación ejecutando la imagen de prueba 'hello-world'.
sudo docker run hello-world

Si el último comando descarga una imagen y muestra un mensaje de "Hello from Docker!", la instalación del motor es exitosa. Sin embargo, ejecutar Docker con `sudo` para cada comando es tedioso. El siguiente paso crítico es configurar los permisos de usuario.

Configuración Post-Instalación Esencial para Científicos de Datos

La configuración va más allá de simplemente hacer que `docker` funcione sin `sudo`. Para un flujo de trabajo eficiente en ML, debemos optimizar la ubicación del almacenamiento, configurar el uso de GPU (si está disponible) y ajustar los recursos del demonio Docker. La primera acción es agregar tu usuario al grupo `docker`. Esto otorga privilegios de administración de contenedores a tu usuario, un paso de seguridad que debe entenderse: cualquier usuario en el grupo `docker` tiene efectivamente acceso root en el sistema host.

Para la ciencia de datos, la configuración del daemon de Docker (`/etc/docker/daemon.json`) es crucial. Aquí podemos cambiar el directorio por defecto de imágenes y contenedores (útil si tu SSD principal es pequeño pero tienes un HDD grande para datos), limitar el uso de CPU y memoria (para no colgar tu máquina entrenando un modelo), y configurar registros de imágenes alternativos (como el registro de GitLab de tu empresa). Si tienes una GPU NVIDIA, la instalación del NVIDIA Container Toolkit es obligatoria para acelerar el entrenamiento e inferencia de modelos.

#!/bin/bash
# 1. Agregar tu usuario al grupo 'docker' para evitar usar sudo.
sudo usermod -aG docker $USER
# NOTA: Debes cerrar sesión y volver a iniciar para que el cambio surta efecto.

# 2. Crear o modificar la configuración del daemon Docker.
sudo tee /etc/docker/daemon.json <

Concepto Clave: El Demonio Docker y el Cliente CLI

Imagina que Docker es como un restaurante de cocina de autor. Tú, el científico de datos, eres el comensal. La CLI de Docker (el comando `docker` que escribes en la terminal) es el camarero que toma tu pedido. El Demonio Docker (`dockerd`) es el chef y toda la brigada de cocina que trabaja detrás de la puerta batiente. Tú no interactúas directamente con el chef, solo le das instrucciones al camarero.

Cuando escribes `docker run python:3.9`, la CLI (camarero) envía esa solicitud al Demonio (chef). El Demonio es el responsable de las operaciones pesadas: buscar la imagen en un registro si no está localmente, crear un sistema de archivos aislado (el contenedor), asignar recursos de red, y finalmente ejecutar el proceso. Este modelo cliente-servidor es poderoso porque el cliente puede estar en una máquina y el demonio en otra (por ejemplo, en un servidor remoto más potente), lo que es la base para orquestadores como Kubernetes. En una instalación local, ambos corren en la misma máquina, pero la separación arquitectónica permanece.

Cómo Funciona en la Práctica: Tu Primer Pipeline de ML en un Contenedor

Vamos a simular un escenario real. Tienes un script de Python que entrena un modelo de regresión lineal simple con scikit-learn y guarda el modelo serializado. Quieres asegurarte de que este script funcione en cualquier máquina, independientemente de las versiones de librerías instaladas. En lugar de contaminar tu entorno global, usarás un contenedor Docker.

Primero, crea un directorio de proyecto. Dentro, tendrás tu script `train_model.py` y un archivo `requirements.txt`. El poder de Docker se materializa en el `Dockerfile`, una receta que define el entorno. Construirás una imagen que contiene exactamente Python 3.9, las dependencias listadas, y tu script. Luego, ejecutarás un contenedor basado en esa imagen. El contenedor ejecutará el script en un entorno aislado y reproducible, y el modelo entrenado se guardará en un volumen, un directorio compartido entre el contenedor y tu máquina host, para que no se pierda cuando el contenedor se detenga.

Código en Acción: Script de Entrenamiento y Dockerfile

Aquí está el ejemplo completo. Crea estos archivos en un directorio llamado `ml-docker-demo`.

# train_model.py
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
import joblib
import sys

print("=== Iniciando entrenamiento del modelo en contenedor Docker ===")
# Datos sintéticos
np.random.seed(42)
X = np.random.rand(100, 1) * 10
y = 2.5 * X.squeeze() + np.random.randn(100) * 2

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = LinearRegression()
model.fit(X_train, y_train)

score = model.score(X_test, y_test)
print(f"Modelo entrenado. Coeficiente: {model.coef_[0]:.2f}, Intercepto: {model.intercept_:.2f}")
print(f"R² en conjunto de prueba: {score:.4f}")

# Guardar el modelo. La ruta '/output' será un volumen montado desde el host.
joblib.dump(model, '/output/modelo_entrenado.pkl')
print("Modelo guardado en /output/modelo_entrenado.pkl")
# Dockerfile
# Usar una imagen base oficial de Python con versión específica.
FROM python:3.9-slim

# Establecer el directorio de trabajo dentro del contenedor.
WORKDIR /app

# Copiar el archivo de dependencias primero (mejora el caching de capas de Docker).
COPY requirements.txt .

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

# Copiar el resto del código de la aplicación.
COPY train_model.py .

# Crear un directorio para la salida. El host montará un volumen aquí.
RUN mkdir /output

# Especificar el comando a ejecutar cuando se inicie el contenedor.
CMD ["python", "train_model.py"]
# requirements.txt
scikit-learn==1.3.0
pandas==2.0.3
numpy==1.24.3
joblib==1.3.2

Ahora, construye la imagen y ejecuta el contenedor montando un volumen para la salida:

# Navegar al directorio del proyecto
cd ml-docker-demo

# Construir la imagen Docker. El punto (.) indica el contexto de construcción (directorio actual).
docker build -t modelo-ml:latest .

# Ejecutar un contenedor basado en la imagen.
# El flag -v monta el directorio actual del host en la carpeta /output del contenedor.
docker run --rm -v $(pwd):/output modelo-ml:latest

Después de ejecutar estos comandos, verás la salida del entrenamiento en tu terminal y encontrarás el archivo `modelo_entrenado.pkl` en tu directorio `ml-docker-demo`. Has ejecutado con éxito un pipeline de ML en un contenedor aislado y persistido el resultado en tu máquina host.

Errores Comunes y Cómo Evitarlos

Incluso con una instalación correcta, estos errores son frecuentes en el camino del científico de datos.

  1. "Cannot connect to the Docker daemon": El demonio Docker no está corriendo. Solución: Ejecuta `sudo systemctl start docker` (Linux) o inicia la aplicación Docker Desktop (macOS/Windows). Verifica también que tu usuario esté en el grupo `docker` y que hayas reiniciado la sesión.
  2. : Docker acumula imágenes, contenedores detenidos y volúmenes huérfanos. Solución: Usa `docker system prune -a --volumes` periódicamente para limpiar. Configura `data-root` en `daemon.json` a una unidad con más espacio.
  3. Problemas de permisos en volúmenes montados: Los archivos creados dentro del contenedor (como tu modelo .pkl) pueden pertenecer al usuario root. Solución: Usa flags de usuario (`-u $(id -u):$(id -g)`) al ejecutar `docker run` o gestiona permisos en el script dentro del contenedor.
  4. Conflicto de puertos: Intentas mapear un puerto del contenedor (ej: 5000 para una API Flask) que ya está en uso en el host. Solución: Usa un puerto diferente con `-p 8080:5000` o identifica y detén el proceso que ocupa el puerto con `sudo lsof -i :5000`.
  5. Falta de memoria al construir imágenes grandes: Algunos paquetes de ML (como TensorFlow o PyTorch) son grandes. El proceso de construcción puede agotar la memoria. Solución: Aumenta la memoria asignada a Docker en Docker Desktop (Preferences -> Resources) o en Linux, añade memoria swap y verifica los límites de cgroups.

Checklist de Dominio

Antes de considerar esta lección completa, verifica que puedes realizar y comprender cada uno de estos puntos:

  • He instalado Docker Engine y Docker CLI siguiendo los pasos oficiales para mi sistema operativo.
  • Puedo ejecutar `docker --version` y `docker run hello-world` sin errores y sin usar `sudo` (tras reiniciar sesión).
  • He configurado mi usuario en el grupo `docker` y comprendo las implicaciones de seguridad de esta acción.
  • He revisado y modificado (si fue necesario) el archivo de configuración `/etc/docker/daemon.json` para ajustar el directorio de datos o límites de recursos.
  • Si tengo una GPU NVIDIA, he instalado el NVIDIA Container Toolkit y puedo ejecutar `nvidia-smi` desde dentro de un contenedor usando el flag `--gpus all`.
  • Puedo construir una imagen Docker a partir de un Dockerfile que incluya dependencias de Python comunes en ML (scikit-learn, pandas).
  • Puedo ejecutar un contenedor montando un volumen del host para persistir los resultados (como un modelo serializado).
  • Sé cómo limpiar espacio en disco eliminando imágenes, contenedores y volúmenes no utilizados con `docker system prune`.
De lección a portfolio

Convertí esta lección en una habilidad visible para entrevistas.

Guardá el curso, completá los ejercicios y conectá esta habilidad con una ruta de empleo, data, IA, programación o marketing.

Newsletter Cursalo

Recibí rutas y cursos nuevos

Sumate para recibir recursos orientados a empleo y portfolio.

  • Rutas de empleo
  • Cursos prácticos
  • Portfolio y entrevistas

Sin spam. También podés entrar con tu cuenta para guardar progreso. Iniciá sesión