README · by ansango
← Volver al libro

Containers at scale

Orquestación a escala: Docker Swarm mode (built-in), servicios, scaling, rolling updates, rollbacks, drain de nodes, y la decisión de cuándo usar Swarm vs Kubernetes

~4 min de lectura
Resumen

Esta nota cubre cómo correr containers a escala. Empieza con Docker Swarm mode (el orquestador built-in en Docker engine), incluyendo setup del cluster, services, scaling, rolling updates, rollbacks, y drain de nodes. Termina con la decisión de Swarm vs Kubernetes y por qué Kubernetes ganó la batalla de los orquestadores. La siguiente nota entra en detalle en Kubernetes con Minikube.

El problema de escalar containers

Los containers son portables por diseño, pero un solo host tiene límites. Cuando tu app crece, necesitas:

Docker engine no hace esto por sí solo. Necesitas un orquestador.

Docker Swarm mode

Swarm classic vs Swarm mode

Hay dos cosas llamadas “Swarm”. La original standalone, ahora llamada Swarm classic, está deprecated. La que importa es Swarm mode, que viene built-in en el Docker client. No necesitas instalar nada extra.

Swarm mode te da un cluster manager con interfaz única: usas el mismo docker que ya conoces, pero apunta a un manager en vez de un host individual. Swarm agrega scheduling, service discovery, rolling updates y load balancing sobre lo que Docker ya provee.

Conceptos clave

Setup del cluster

# En el manager (1º nodo)
$ sudo docker swarm init --advertise-addr 172.17.4.1
# Swarm initialized: current node (hyp...) is now a manager.
# To add a worker, run:
#   docker swarm join --token SWMTKN-1-14... 172.17.4.1:2377

# Guarda el token en un password manager
$ sudo docker swarm join-token --quiet worker
# (regenera el token si lo pierdes)

# En cada worker
$ ssh 172.17.4.2 "sudo docker swarm join --token SWMTKN-1-14... 172.17.4.1:2377"
# This node joined a swarm as a worker.

$ ssh 172.17.4.3 "sudo docker swarm join --token SWMTKN-1-14... 172.17.4.1:2377"
# This node joined a swarm as a worker.
Verifica el estado

El asterisco marca el nodo al que estás conectado.

Crear networks overlay

$ docker -H 172.17.4.1 network create --driver=overlay default-net
$ docker -H 172.17.4.1 network ls
NETWORK ID     NAME              DRIVER    SCOPE
xqgshg0nurzu   default-net       overlay   swarm
n8kjd6oa44fr   ingress           overlay   swarm

Lanzar un service

$ docker -H 172.17.4.1 service create --detach=true --name quantum \
    --replicas 2 --publish published=80,target=8080 --network default-net \
    spkane/quantum-game:latest

Flags importantes:

$ docker -H 172.17.4.1 service ps quantum
# ID    NAME       IMAGE       NODE          DESIRED  CURRENT
# rk…13 quantum.1 spkane/…  ip-172-17-4-1 Running  Running
# lz…t3 quantum.2 spkane/…  ip-172-17-4-2 Running  Running
Nunca uses

latest en producción En este ejemplo usamos latest por simplicidad del libro. En producción, usa siempre tags con versión o commit hash. El tag latest es flotante y puede causar deploys no reproducibles.

Ver detalles de un service

$ docker -H 172.17.4.1 service inspect --pretty quantum
ID:        iuoh6oxrec9fk67ybwuikutqa
Name:      quantum
Service Mode: Replicated
 Replicas:  2
Resources:
Networks: default-net
Endpoint Mode: vip
Ports:
  PublishedPort = 80
  TargetPort = 8080
  PublishMode = ingress

El --update-order por default es stop-first (tira el viejo, levanta el nuevo). En producción cambia a start-first (levanta el nuevo, después tira el viejo) para evitar downtime durante deploys.

Escalar

$ docker -H 172.17.4.1 service scale --detach=false quantum=4
# quantum scaled to 4
# 1/4: running [=====================================>]
# ...
# verify: Service converged
Swarm prioriza número de réplicas sobre distribución

Si pides más réplicas que nodos, Swarm pone varias réplicas en el mismo nodo. Si pierdes ese nodo, pierdes varias réplicas a la vez. Piensa en tu placement cuidadosamente.

Rolling updates

$ docker -H 172.17.4.1 service update --update-delay 10s \
    --update-failure-action rollback --update-monitor 5s \
    --update-order start-first --update-parallelism 1 \
    --image spkane/quantum-game:latest-plus quantum

Flags importantes:

Rollback

$ docker -H 172.17.4.1 service rollback quantum
# quantum
# rollback: manually requested rollback
# overall progress: rolling back update: 4 out of 4 tasks

Docker guarda la versión anterior y puede hacer rollback a ella con un solo comando. Funciona porque los health checks confirman que la nueva versión está bien antes de tirar la vieja.

Limitación del rollback

Solo vuelve a la versión inmediatamente anterior. Si haces rollback dos veces seguidas, alterna entre las mismas dos versiones. Para control fino, usa versionado explícito con tags.

Docker stack: Compose en Swarm

docker stack deploy permite deployar un docker-compose.yml (con ajustes) a Swarm:

$ docker -H 172.17.4.1 stack deploy --compose-file docker-compose-stack.yaml rocketchat
# Creating network rocketchat_default
# Creating service rocketchat_hubot
# Creating service rocketchat_mongo
# ...
$ docker -H 172.17.4.1 stack ls
# NAME         SERVICES   ORCHESTRATOR
# rocketchat   4          Swarm

$ docker -H 172.17.4.1 stack rm rocketchat
# Tearing down the stack...

Drain de nodes

Para hacer mantenimiento en un nodo, drena sus tasks primero:

$ docker -H 172.17.4.1 node update --availability drain ip-172-17-4-3
# Swarm mueve los tasks a otros nodos

$ docker -H 172.17.4.1 node inspect --pretty ip-172-17-4-3
# Availability: Drain

# Después del mantenimiento
$ docker -H 172.17.4.1 node update --availability active ip-172-17-4-3
No balancea automáticamente

Cuando vuelves a activar un nodo, no balancea las tasks existentes a través del cluster. Tienes que hacer un nuevo deploy o update para redistribuir.

Swarm vs Kubernetes

AspectoDocker SwarmKubernetes
SetupBuilt-in en Docker, fácilRequiere kubectl + cluster (local o managed)
ComplejidadBajaAlta
EcosistemaSmaller, más cohesivoEnorme, vendor-neutral
Curva de aprendizajeSuaveEmpinada
Managed offeringsDocker Swarm en cloud vendorsEKS, GKE, AKS, DigitalOcean, etc.
Adopción mercadoDecreciendoMasiva
Documentación / comunidadBuenaExcelente
Caso idealClusters pequeños, transición de Compose a multi-hostProducción seria, multi-cloud, escala
Kelsey Hightower

“Kubernetes is a platform for building platforms.”

La realidad del mercado: Kubernetes ganó. La mayoría de las nuevas orquestaciones de producción se hacen con Kubernetes. Swarm sigue siendo útil para clusters pequeños o para gente que ya tiene un ecosistema basado en Docker puro. Docker, Inc. integra Kubernetes en Docker Desktop, lo que sugiere que el propio Docker reconoce esta tendencia.

Empieza con Swarm si vienes de Compose

Si ya usas Compose y necesitas multi-host, Swarm es el paso más natural. Cuando el cluster crece más allá de lo que Swarm maneja cómodamente, migra a Kubernetes. La transición es más fácil desde Swarm que desde Compose directo.

Cuándo NO usar Swarm ni Kubernetes

Para casos simples, no necesitas un orquestador:

Los orquestadores añaden complejidad operacional que solo se justifica cuando la escala lo demanda.

Próximos pasos