🌐

Lab de Redes Docker

👨‍🍳 Chef⏱️ 30 minutos

📋 Prerequisitos sugeridos

  • Docker instalado

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 frontend para Nginx
  • Red backend para 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

Próximo paso

Backup de Volúmenes Docker