lección 7
Docker para datos: PostgreSQL, Redis, Jupyter en un comando
docker-compose con servicios de datos reales: levantar bases de datos, caches y notebooks. Conectar desde Python.
⏱ 55 min
Esta es la lección donde todo encaja. Has aprendido a correr contenedores, a crear imágenes, a orquestar servicios con docker-compose, y a persistir datos con volúmenes. Ahora vamos a aplicar TODO eso a lo que realmente importa en tu carrera de data engineering: levantar servicios de datos profesionales con un solo comando.
¿Quieres PostgreSQL? docker compose up. ¿Quieres Redis para cache? docker compose up. ¿Quieres Jupyter Notebook con pandas preinstalado? docker compose up. ¿Quieres los tres juntos conectados? docker compose up. Este es el poder de Docker para datos: ya nunca más tendrás que buscar "cómo instalar PostgreSQL en Windows" o "cómo configurar Redis en Mac". Un archivo YAML y un comando. Siempre.
### Receta 1: PostgreSQL listo para SQL
PostgreSQL es la base de datos que usarás en la skill de SQL. Aquí tienes el docker-compose.yml definitivo que usarás durante todo el track:
1# docker-compose.yml — PostgreSQL para aprender SQL2services:3 postgres:4 image: postgres:165 environment:6 POSTGRES_USER: alumno7 POSTGRES_PASSWORD: bigdatastack8 POSTGRES_DB: aprendiendo_sql9 ports:10 - "5432:5432"11 volumes:12 - postgres_data:/var/lib/postgresql/data13 - ./init.sql:/docker-entrypoint-initdb.d/init.sql # Script inicial1415volumes:16 postgres_data:
PostgreSQL con datos persistentes y script de inicialización
El truco del /docker-entrypoint-initdb.d/ es brillante: cualquier archivo .sql que pongas en esa carpeta se ejecuta AUTOMÁTICAMENTE la primera vez que PostgreSQL arranca. Perfecto para crear tablas y cargar datos de ejemplo sin esfuerzo manual.
CUIDADO: PostgreSQL SOLO ejecuta los scripts de initdb.d cuando el volumen de datos está vacío (primera vez). Si ya tenías el contenedor corriendo de lecciones anteriores, el pgdata ya existe y el init.sql se ignora silenciosamente. Solución: ejecuta "docker compose down -v" para borrar el volumen y empezar limpio. La -v es clave — sin ella solo para el contenedor pero mantiene los datos.
1-- Archivo: init.sql (se ejecuta automáticamente al crear la DB)2CREATE TABLE IF NOT EXISTS clientes (3 id SERIAL PRIMARY KEY,4 nombre VARCHAR(100) NOT NULL,5 email VARCHAR(200) UNIQUE NOT NULL,6 ciudad VARCHAR(50),7 fecha_registro DATE DEFAULT CURRENT_DATE8);910INSERT INTO clientes (nombre, email, ciudad) VALUES11('Ana García', 'ana@ejemplo.com', 'Madrid'),12('Carlos López', 'carlos@ejemplo.com', 'Barcelona'),13('María Fernández', 'maria@ejemplo.com', 'Valencia');
init.sql — datos de ejemplo que se cargan al primer arranque
### Receta 2: Redis para cache de datos
Redis es un almacén de datos en memoria ultrarrápido. En data engineering se usa para cachear resultados de queries lentas, almacenar estados temporales de pipelines, y como broker de mensajes ligero. Levantarlo con Docker es trivial:
1# Añadir Redis al docker-compose.yml2services:3 redis:4 image: redis:7-alpine5 ports:6 - "6379:6379"7 volumes:8 - redis_data:/data9 command: redis-server --appendonly yes # Persistir datos a disco1011volumes:12 redis_data:
Redis con persistencia — los datos sobreviven a reinicios
### Receta 3: Jupyter Notebook con ciencia de datos
1# Jupyter con pandas, numpy, matplotlib preinstalados2services:3 jupyter:4 image: jupyter/scipy-notebook:latest5 ports:6 - "8888:8888"7 volumes:8 - ./notebooks:/home/jovyan/work # Tus notebooks persistentes9 environment:10 JUPYTER_TOKEN: "bigdatastack" # Token para acceder
Jupyter Notebook listo para análisis — accede en http://localhost:8888
Consejo de senior: las imágenes jupyter/scipy-notebook y jupyter/datascience-notebook incluyen pandas, numpy, scipy, matplotlib, seaborn y más — todo preconfigurado y listo para usar. No necesitas instalar NADA localmente. ¿Quieres probar una librería nueva? La añades al Dockerfile. ¿Rompiste algo? docker compose down y empiezas de cero.
### Todo junto: el stack de datos completo
Ahora combinemos PostgreSQL + Redis + Jupyter en un solo docker-compose.yml. Este es el tipo de setup que usarás en tu día a día como data engineer:
1# docker-compose.yml — Stack de datos completo2services:3 postgres:4 image: postgres:165 environment:6 POSTGRES_USER: datos7 POSTGRES_PASSWORD: secreto1238 POSTGRES_DB: analytics9 ports:10 - "5432:5432"11 volumes:12 - pgdata:/var/lib/postgresql/data1314 redis:15 image: redis:7-alpine16 ports:17 - "6379:6379"18 volumes:19 - redis_data:/data2021 jupyter:22 image: jupyter/scipy-notebook:latest23 ports:24 - "8888:8888"25 volumes:26 - ./notebooks:/home/jovyan/work27 environment:28 JUPYTER_TOKEN: "datos2024"29 depends_on:30 - postgres31 - redis3233volumes:34 pgdata:35 redis_data:
PostgreSQL + Redis + Jupyter: un docker compose up y a trabajar
### Conectar desde Python a tus servicios Docker
Una vez que tus servicios están corriendo, puedes conectarte a ellos desde Python en tu ordenador local como si fueran servicios normales. Recuerda: los puertos que mapeaste (5432, 6379, 8888) están accesibles en localhost.
1# Conectar a PostgreSQL desde Python (necesitas: pip install psycopg2-binary)2import psycopg234conn = psycopg2.connect(5 host="localhost",6 port=5432,7 user="datos",8 password="secreto123",9 database="analytics"10)1112cursor = conn.cursor()13cursor.execute("SELECT version();")14print(f"PostgreSQL: {cursor.fetchone()[0]}")15conn.close()
Conexión a PostgreSQL dockerizado desde tu Python local
1# Conectar a Redis desde Python (necesitas: pip install redis)2import redis34r = redis.Redis(host='localhost', port=6379, decode_responses=True)5r.set('pipeline_status', 'ejecutando')6print(f"Estado del pipeline: {r.get('pipeline_status')}")
Conexión a Redis dockerizado desde tu Python local
Recuerda: desde TU ordenador, usas localhost:5432 para conectarte a PostgreSQL. Pero desde OTRO contenedor dentro del mismo docker-compose, usarías postgres:5432 (el nombre del servicio). Este es el error más común de principiantes — confundir cuándo usar localhost y cuándo el nombre del servicio.
### pgAdmin: gestión visual de PostgreSQL
pgAdmin es una interfaz web para gestionar PostgreSQL visualmente. También lo puedes levantar con Docker — un servicio más en tu compose:
1# Añadir pgAdmin al docker-compose.yml2 pgadmin:3 image: dpage/pgadmin4:latest4 environment:5 PGADMIN_DEFAULT_EMAIL: admin@bigdatastack.com6 PGADMIN_DEFAULT_PASSWORD: admin1237 ports:8 - "8080:80"9 depends_on:10 - postgres
pgAdmin en http://localhost:8080 — gestión visual de tu DB
Consejo de senior: al conectar pgAdmin a PostgreSQL dentro de Docker, el hostname NO es localhost — es "postgres" (el nombre del servicio en docker-compose). El puerto es 5432. Este detalle te ahorrará 30 minutos de frustración la primera vez.
## ejercicios
Stack completo para el equipo de BI
PostgreSQL + pgAdmin + Jupyter con volúmenes. El bloque de postgres va entero de modelo; rellena pgAdmin y Jupyter.
Script Python que conecta al PostgreSQL dockerizado
Conéctate desde tu máquina (localhost, puerto mapeado) y lista las tablas del esquema public.
Troubleshooting: ¿por qué no conecta?
El junior usa host="postgres" desde su portátil. Explica por qué falla y corrígelo. El código del junior está comentado porque si lo ejecutas, el script muere ahí.
Regístrate para guardar tu progreso.
## comentarios
Reporta erratas, ayuda a otros o comparte tu opinión. Sé constructivo.
Inicia sesión para comentar y responder.
cargando comentarios...