Lo que vas a construir
Un lab práctico donde crearás redes Docker y verás cómo los contenedores se comunican entre sí.
Crearás una arquitectura con:
- Red
frontendpara Nginx - Red
backendpara API y PostgreSQL - API conectada a ambas redes
Paso 1: Limpia contenedores existentes
docker stop $(docker ps -aq) 2>/dev/null
docker rm $(docker ps -aq) 2>/dev/null
Paso 2: Crea las redes
# Red para el frontend (acceso público)
docker network create frontend
# Red para el backend (interna, sin internet)
docker network create --internal backend
# Verificar
docker network ls
Paso 3: Crea PostgreSQL (solo backend)
docker run -d \
--name db \
--network backend \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_DB=app \
postgres:16-alpine
Paso 4: Crea la API (ambas redes)
# Primero en backend
docker run -d \
--name api \
--network backend \
-e DATABASE_URL=postgres://postgres:secret@db:5432/app \
-p 3000:3000 \
node:20-alpine sleep infinity
# Conectar también a frontend
docker network connect frontend api
Paso 5: Prueba la comunicación
# La API puede ver a db
docker exec api ping -c 2 db
# ✓ Funciona
# Instala psql en api para probar conexión
docker exec api apk add postgresql-client
docker exec api psql postgres://postgres:secret@db:5432/app -c "SELECT 1"
# ✓ Funciona
Paso 6: Crea Nginx (solo frontend)
docker run -d \
--name nginx \
--network frontend \
-p 80:80 \
nginx:alpine
Paso 7: Verifica aislamiento
# Nginx NO puede ver a db (redes diferentes)
docker exec nginx ping -c 2 db
# ✗ ping: bad address 'db'
# Nginx SÍ puede ver a api (misma red frontend)
docker exec nginx ping -c 2 api
# ✓ Funciona
# db NO tiene acceso a internet (red --internal)
docker exec db ping -c 2 google.com
# ✗ No funciona (esto es bueno!)
Diagrama de la arquitectura
┌─────────────────────────────────────────────────────┐
│ INTERNET │
└───────────────────────┬─────────────────────────────┘
│ :80
┌───────────────────────▼─────────────────────────────┐
│ Red: frontend │
│ ┌─────────┐ ┌─────────┐ │
│ │ nginx │ ──────▶ │ api │ │
│ │ :80 │ │ :3000 │ │
│ └─────────┘ └────┬────┘ │
└───────────────────────────┼─────────────────────────┘
│
┌───────────────────────────▼─────────────────────────┐
│ Red: backend (internal) │
│ ┌─────────┐ │
│ ┌─────────┐ ──────▶ │ db │ │
│ │ api │ │ :5432 │ │
│ └─────────┘ └─────────┘ │
│ │
│ ⛔ Sin acceso a internet │
└─────────────────────────────────────────────────────┘
Paso 8: Inspecciona las redes
# Ver contenedores en frontend
docker network inspect frontend --format '{{range .Containers}}{{.Name}} {{end}}'
# nginx api
# Ver contenedores en backend
docker network inspect backend --format '{{range .Containers}}{{.Name}} {{end}}'
# db api
# Ver IPs
docker inspect api --format '{{range .NetworkSettings.Networks}}{{.NetworkID}}: {{.IPAddress}}{{println}}{{end}}'
Limpieza
docker stop nginx api db
docker rm nginx api db
docker network rm frontend backend