Hoy vamos a aprender cómo balancear contenedores Docker usando Docker Swarm.

Docker Swarm es una herramienta integrada en Docker que permite orquestar contenedores en un clúster de máquinas.
Te permite distribuir la carga automáticamente entre varias instancias de un servicio.
Ejemplo de arquitectura:
┌───────────────┐ │ CLIENTE │ └──────┬────────┘ │ ┌────────▼────────┐ │ SWARM MANAGER │ ← gestiona el clúster └──────┬──────────┘ ┌─────────┴─────────┐ │ │ ┌─────▼──────┐ ┌─────▼──────┐ │ WORKER 1 │ │ WORKER 2 │ ← ejecutan los contenedores └────────────┘ └────────────┘
Configuración inicial
Puedes hacerlo con Docker Machine o directamente con servidores reales o VMs.
Ejemplo con Docker Machine (para pruebas locales):
docker-machine create --driver virtualbox manager docker-machine create --driver virtualbox worker1 docker-machine create --driver virtualbox worker2
Conecta al manager:
eval $(docker-machine env manager)
Inicializar el Swarm
docker swarm init --advertise-addr $(docker-machine ip manager)
Esto devolverá algo como:
docker swarm join --token SWMTKN-1-abc123 ... 192.168.99.100:2377
Unir los workers al clúster
En cada worker (worker1 y worker2), ejecuta el comando que te dio el manager:
docker swarm join --token SWMTKN-1-abc123 ... 192.168.99.100:2377
Verifica los nodos desde el manager:
docker node ls
Deberías ver algo así:
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS abc123 manager Ready Active Leader def456 worker1 Ready Active ghi789 worker2 Ready Active
Desplegar un servicio balanceado
Vamos a desplegar un servicio web sencillo (Nginx):
docker service create \ --name web \ --replicas 3 \ -p 80:80 \ nginx
Esto crea 3 contenedores del mismo servicio distribuidos entre los nodos.
Docker Swarm se encargará del balanceo automático.
Comprueba el estado:
docker service ls docker service ps web
Probar el balanceo
Abre en tu navegador la IP del manager (o de cualquier nodo, Swarm redirige el tráfico internamente):
http://<IP_DEL_MANAGER>
Verás la página por defecto de Nginx.
Cada nueva recarga se servirá por un contenedor distinto del servicio web
.
Puedes ver qué contenedor responde si accedes desde dentro del clúster, por ejemplo:
docker exec -it $(docker ps -q --filter name=web) hostname
Escalar el servicio
Para escalar fácilmente el número de instancias:
docker service scale web=5
Comprueba el resultado:
docker service ps web
Swarm creará nuevas réplicas distribuyéndolas automáticamente entre los nodos.
Actualizar el servicio sin downtime
docker service update --image nginx:latest web
Swarm actualizará los contenedores uno por uno, manteniendo el servicio disponible.
(Opcional) Añadir un balanceador visual
Puedes desplegar un Traefik o HAProxy para gestionar rutas más complejas:
Ejemplo básico con Traefik:
docker service create \ --name traefik \ --constraint=node.role==manager \ --publish 80:80 \ --publish 8080:8080 \ traefik:v2.9 \ --api.insecure=true \ --providers.docker
Comandos:
Acción | Comando clave |
---|---|
Crear swarm | docker swarm init |
Unir workers | docker swarm join |
Ver nodos | docker node ls |
Crear servicio | docker service create |
Escalar | docker service scale |
Actualizar | docker service update |
Ver servicios | docker service ls |
Test rápido local (solo con un nodo)
Si no tienes varias máquinas, puedes probar todo en tu propio equipo:
docker swarm init docker service create --name web --replicas 3 -p 8080:80 nginx
Y luego:
curl http://localhost:8080
Verás cómo Swarm reparte el tráfico entre las réplicas aunque estén en el mismo host.

Ingeniero en Informática, Investigador, me encanta crear cosas o arreglarlas y darles una nueva vida. Escritor y poeta. Más de 20 APPs publicadas y un libro en Amazon.