Saltar al contenido

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 SQL
2services:
3 postgres:
4 image: postgres:16
5 environment:
6 POSTGRES_USER: alumno
7 POSTGRES_PASSWORD: bigdatastack
8 POSTGRES_DB: aprendiendo_sql
9 ports:
10 - "5432:5432"
11 volumes:
12 - postgres_data:/var/lib/postgresql/data
13 - ./init.sql:/docker-entrypoint-initdb.d/init.sql # Script inicial
14
15volumes:
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_DATE
8);
9
10INSERT INTO clientes (nombre, email, ciudad) VALUES
11('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.yml
2services:
3 redis:
4 image: redis:7-alpine
5 ports:
6 - "6379:6379"
7 volumes:
8 - redis_data:/data
9 command: redis-server --appendonly yes # Persistir datos a disco
10
11volumes:
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 preinstalados
2services:
3 jupyter:
4 image: jupyter/scipy-notebook:latest
5 ports:
6 - "8888:8888"
7 volumes:
8 - ./notebooks:/home/jovyan/work # Tus notebooks persistentes
9 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 completo
2services:
3 postgres:
4 image: postgres:16
5 environment:
6 POSTGRES_USER: datos
7 POSTGRES_PASSWORD: secreto123
8 POSTGRES_DB: analytics
9 ports:
10 - "5432:5432"
11 volumes:
12 - pgdata:/var/lib/postgresql/data
13
14 redis:
15 image: redis:7-alpine
16 ports:
17 - "6379:6379"
18 volumes:
19 - redis_data:/data
20
21 jupyter:
22 image: jupyter/scipy-notebook:latest
23 ports:
24 - "8888:8888"
25 volumes:
26 - ./notebooks:/home/jovyan/work
27 environment:
28 JUPYTER_TOKEN: "datos2024"
29 depends_on:
30 - postgres
31 - redis
32
33volumes:
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 psycopg2
3
4conn = psycopg2.connect(
5 host="localhost",
6 port=5432,
7 user="datos",
8 password="secreto123",
9 database="analytics"
10)
11
12cursor = 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 redis
3
4r = 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.yml
2 pgadmin:
3 image: dpage/pgadmin4:latest
4 environment:
5 PGADMIN_DEFAULT_EMAIL: admin@bigdatastack.com
6 PGADMIN_DEFAULT_PASSWORD: admin123
7 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

[01]

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.

Cargando editor...
[02]

Script Python que conecta al PostgreSQL dockerizado

Conéctate desde tu máquina (localhost, puerto mapeado) y lista las tablas del esquema public.

Cargando editor...
[03]

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í.

Cargando editor...

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...