Tutorial: Balanceo de carga con Docker Swarm

Tiempo de lectura: 2 minutos

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

Ballena docker

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ónComando clave
Crear swarmdocker swarm init
Unir workersdocker swarm join
Ver nodosdocker node ls
Crear serviciodocker service create
Escalardocker service scale
Actualizardocker service update
Ver serviciosdocker 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.

Deja un comentario