Docker Swarm: Escalando con Multi-Nodo
Docker Swarm: Escalando con Multi-Nodo
Hasta ahora hemos trabajado con un solo servidor. Docker Swarm permite distribuir tus aplicaciones en multiples servidores, ganando alta disponibilidad y capacidad de escalar horizontalmente.
Que es Docker Swarm
Docker Swarm es el orquestador de contenedores integrado en Docker. Convierte un grupo de servidores en un cluster donde los contenedores se distribuyen automaticamente.
Conceptos clave:
- Manager: nodo que controla el cluster y toma decisiones de scheduling
- Worker: nodo que ejecuta contenedores
- Service: definicion de una tarea que corre en el cluster
- Task: instancia individual de un contenedor dentro de un servicio
- Overlay network: red virtual que conecta contenedores entre nodos
Por que usarlo con Dokploy
Dokploy usa Docker Swarm internamente desde su instalacion. Incluso con un solo servidor, tus aplicaciones corren como servicios de Swarm. Agregar nodos es cuestion de un comando.
Ventajas concretas:
- Si un nodo cae, los contenedores migran automaticamente
- Puedes escalar una aplicacion a N replicas con un clic
- Los deployments son rolling por defecto (zero-downtime)
- El balanceo de carga es automatico via routing mesh
Inicializar un Cluster Swarm en Dokploy
Al instalar Dokploy, tu servidor ya es un nodo manager. Puedes verificarlo:
docker node ls
Salida esperada:
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
abc123def456 * dokploy-01 Ready Active Leader
El asterisco indica que es el nodo actual. Leader significa que es el manager principal.
Agregar Nodos Worker
Preparar el nuevo servidor
En el servidor que sera worker, instala Docker:
curl -fsSL https://get.docker.com | sh
Asegurate de que los siguientes puertos estan abiertos entre los nodos:
| Puerto | Protocolo | Proposito |
|---|---|---|
| 2377 | TCP | Comunicacion del cluster |
| 7946 | TCP/UDP | Descubrimiento de nodos |
| 4789 | UDP | Overlay network (VXLAN) |
Obtener el token de join
En el nodo manager (tu servidor Dokploy):
docker swarm join-token worker
Esto genera un comando como:
docker swarm join --token SWMTKN-1-xxxxx 192.168.1.100:2377
Unir el worker al cluster
En el nuevo servidor, ejecuta el comando generado:
docker swarm join --token SWMTKN-1-xxxxx 192.168.1.100:2377
Verifica desde el manager:
docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
abc123def456 * dokploy-01 Ready Active Leader
ghi789jkl012 dokploy-02 Ready Active
Registrar el nodo en Dokploy
Desde el panel de Dokploy:
- Ve a Settings > Server
- Selecciona Add Server
- Ingresa la IP del worker y las credenciales SSH
- Dokploy detectara automaticamente que ya es parte del Swarm
Configurar Replicas de una Aplicacion
Desde el panel de Dokploy
En la configuracion de tu aplicacion:
- Ve a la pestana Advanced
- Busca Replicas
- Define el numero de replicas deseado
- Haz clic en Deploy
Desde la linea de comandos
Tambien puedes escalar directamente con Docker:
# Ver servicios actuales
docker service ls
# Escalar a 3 replicas
docker service scale app-nombre_app=3
# Verificar distribucion
docker service ps app-nombre_app
Salida del ultimo comando:
ID NAME NODE DESIRED STATE CURRENT STATE
a1b2c3 app_nombre.1 dokploy-01 Running Running 2 min
d4e5f6 app_nombre.2 dokploy-02 Running Running 1 min
g7h8i9 app_nombre.3 dokploy-01 Running Running 1 min
Consideraciones para replicas
No todas las aplicaciones pueden tener multiples replicas sin ajustes:
- Sesiones: usa almacenamiento externo (Redis, base de datos) en lugar de sesiones en memoria
- Archivos subidos: usa almacenamiento compartido (NFS, S3)
- Cron jobs: asegurate de que solo una replica ejecuta tareas programadas
- Websockets: configura sticky sessions si es necesario
Distribucion de Carga entre Nodos
Docker Swarm incluye un balanceador de carga integrado llamado routing mesh. Cualquier nodo del cluster puede recibir peticiones para cualquier servicio, aunque el contenedor no corra en ese nodo.
Cliente -> Nodo 1 (puerto 80) -> routing mesh -> Contenedor en Nodo 2
Configurar constraints
Puedes controlar donde corren los contenedores con labels y constraints:
# Agregar label a un nodo
docker node update --label-add tipo=gpu dokploy-02
# En docker-compose.yml de tu app
services:
app:
deploy:
placement:
constraints:
- node.labels.tipo == gpu
Limitar recursos por nodo
services:
app:
deploy:
resources:
limits:
cpus: '2'
memory: 512M
reservations:
cpus: '0.5'
memory: 256M
Zero-Downtime Deployments con Swarm
Swarm realiza rolling updates por defecto. Puedes configurar la estrategia:
services:
app:
deploy:
update_config:
parallelism: 1 # actualizar de a 1 replica
delay: 10s # esperar 10s entre cada una
failure_action: rollback # revertir si falla
order: start-first # iniciar nueva antes de parar vieja
rollback_config:
parallelism: 1
delay: 5s
La opcion order: start-first es clave: levanta la nueva version antes de bajar la anterior, eliminando el downtime.
Verificar un rollout
# Ver estado del update
docker service inspect --pretty app-nombre
# Forzar rollback manual
docker service rollback app-nombre
Cuando Escalar Verticalmente vs Horizontalmente
Escalar verticalmente (mas recursos al servidor)
Conviene cuando:
- La aplicacion no soporta multiples instancias
- El cuello de botella es CPU/RAM de un solo proceso
- Usas bases de datos que no se distribuyen facilmente
- El costo de un servidor mas potente es menor que administrar un cluster
Escalar horizontalmente (mas nodos)
Conviene cuando:
- La aplicacion es stateless o usa almacenamiento externo
- Necesitas alta disponibilidad (si un nodo cae, los demas responden)
- El trafico es variable y quieres agregar/quitar nodos bajo demanda
- Ya alcanzaste el limite practico de un solo servidor
Recomendacion practica
Para la mayoria de proyectos:
- Empieza con un solo servidor bien dimensionado
- Optimiza la aplicacion antes de agregar nodos
- Agrega un segundo nodo cuando necesites alta disponibilidad
- Escala horizontalmente cuando el trafico lo justifique
Un VPS con 4 CPU y 8 GB de RAM puede manejar multiples aplicaciones con Dokploy antes de necesitar un cluster.
Siguiente: CI/CD con Webhooks y CLI