En este tema introduciremos la orquestación de contenedores y aprenderemos a usar Docker Swarm, el orquestador nativo de Docker. Cuando una aplicación pasa de unos pocos contenedores en una máquina a decenas de réplicas distribuidas en varios servidores, gestionar todo a mano se vuelve inviable. La orquestación automatiza el despliegue, el escalado, la recuperación ante fallos y las actualizaciones de los contenedores, y Docker Swarm ofrece una forma sencilla de empezar usando herramientas que ya conoces.
Objetivos de Aprendizaje
- Entender qué es la orquestación de contenedores y qué problemas resuelve.
- Conocer los conceptos fundamentales de Swarm: nodos, servicios y tareas.
- Inicializar un clúster con
docker swarm inity unir nodos condocker swarm join. - Desplegar aplicaciones con
docker stack deployusando ficheros Compose. - Gestionar réplicas y realizar actualizaciones progresivas (rolling updates).
¿Qué es la Orquestación de Contenedores?
La orquestación es la gestión automatizada del ciclo de vida de los contenedores en uno o varios servidores. Un orquestador se encarga de:
- Programar (scheduling): decidir en qué servidor se ejecuta cada contenedor.
- Escalar: aumentar o reducir el número de réplicas según la demanda.
- Auto-reparar: reiniciar contenedores que fallan y redistribuirlos si un servidor cae.
- Balancear carga: repartir el tráfico entre las réplicas de un servicio.
- Actualizar sin cortes: desplegar nuevas versiones de forma progresiva.
Docker Swarm convierte un grupo de máquinas con Docker en un único clúster lógico al que das órdenes como si fuera un solo Docker.
Conceptos de Docker Swarm
Antes de los comandos, es importante dominar la terminología de Swarm:
| Concepto | Descripción |
|---|---|
| Nodo (node) | Cada máquina (física o virtual) que forma parte del clúster. |
| Manager | Nodo que gestiona el clúster, mantiene su estado y programa las tareas. |
| Worker | Nodo que solo ejecuta las tareas que le asigna un manager. |
| Servicio (service) | Definición de cómo debe ejecutarse un contenedor (imagen, réplicas, puertos). |
| Tarea (task) | Una instancia concreta de un servicio; equivale a un contenedor en ejecución. |
| Stack | Conjunto de servicios definidos juntos en un fichero Compose. |
La relación jerárquica es: un servicio se descompone en varias tareas, y cada tarea se ejecuta como un contenedor en un nodo.
Managers y Workers
- Los managers mantienen el estado deseado del clúster mediante un registro distribuido (basado en el algoritmo de consenso Raft). Para alta disponibilidad se recomienda un número impar de managers (1, 3 o 5).
- Los workers se limitan a ejecutar tareas. Un nodo puede ser a la vez manager y worker (lo habitual en clústeres pequeños).
Inicializar un Clúster Swarm
Para convertir una máquina en el primer manager del clúster, usa:
Explicación:
- docker swarm init: inicializa el modo Swarm en esta máquina y la convierte en manager.
- --advertise-addr 192.168.1.10: indica la dirección IP por la que los demás nodos contactarán con este manager (usa una IP ficticia de tu red).
El comando devuelve un token y una instrucción docker swarm join para añadir más nodos. Por ejemplo:
Este comando se ejecuta en cada nodo worker que quieras unir al clúster:
- --token SWMTKN-1-...: token de seguridad (ficticio) que autoriza la unión.
- 192.168.1.10:2377: dirección y puerto del manager (2377 es el puerto estándar de gestión de Swarm).
Para ver los nodos del clúster, desde un manager ejecuta:
Este comando lista todos los nodos, su rol (manager/worker) y su estado.
Desplegar un Servicio Simple
La forma más directa de lanzar un servicio es con docker service create:
Explicación:
- docker service create: crea un nuevo servicio en el clúster.
- --name web: nombre del servicio.
- --replicas 3: pide tres instancias (tareas) del contenedor; Swarm las repartirá entre los nodos.
- -p 80:80: publica el puerto 80 en todo el clúster mediante la malla de enrutado (routing mesh).
- nginx:latest: imagen a ejecutar.
Para ver las tareas de un servicio:
Desplegar con docker stack deploy y Compose
En la práctica, las aplicaciones se definen en un fichero Compose y se despliegan como un stack. Esto reutiliza el formato Compose que ya conoces, añadiendo la sección deploy específica de Swarm.
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
restart_policy:
condition: on-failure
api:
image: miorg/miapi:1.0.0
deploy:
replicas: 2Explicación detallada:
- version: "3.8": versión del formato Compose compatible con las opciones de Swarm.
- services: define los servicios
webyapi. - image: imagen de cada servicio.
- ports: publica el puerto 80 del servicio
web. - deploy: bloque específico de Swarm que controla cómo se despliega el servicio.
- replicas: número de tareas deseadas.
- update_config: cómo se realizan las actualizaciones.
- parallelism: 1: actualiza una réplica a la vez.
- delay: 10s: espera 10 segundos entre cada réplica actualizada.
- restart_policy.condition: on-failure: reinicia la tarea solo si falla.
Para desplegar este stack:
Explicación:
- docker stack deploy: despliega un conjunto de servicios como un stack.
- -c docker-compose.yml: indica el fichero Compose a usar.
- miapp: nombre del stack; los servicios se llamarán
miapp_webymiapp_api.
Para listar los stacks y sus servicios:
Réplicas y Escalado
Puedes ajustar el número de réplicas de un servicio en cualquier momento:
Este comando lleva el servicio miapp_web a cinco réplicas. Swarm crea o elimina tareas automáticamente para alcanzar el estado deseado y las distribuye entre los nodos disponibles.
Si un nodo cae, Swarm vuelve a programar las tareas perdidas en los nodos sanos, manteniendo siempre el número de réplicas solicitado. Esta es la base de la auto-reparación.
Actualizaciones Progresivas (Rolling Updates)
Una de las grandes ventajas de Swarm es actualizar la versión de una imagen sin cortar el servicio. Para actualizar la imagen de un servicio:
Explicación:
- docker service update: modifica un servicio en ejecución.
- --image miorg/miapi:1.1.0: nueva versión de la imagen a desplegar.
- miapp_api: servicio a actualizar.
Swarm reemplaza las réplicas una a una (según update_config), de modo que siempre haya instancias atendiendo peticiones. Si algo va mal, puedes deshacer el cambio:
Este comando revierte el servicio a la configuración anterior.
Errores Comunes y Consejos
- Un solo manager en producción: si ese nodo cae, pierdes el control del clúster. Usa un número impar de managers (3 o 5) para alta disponibilidad.
- Confundir
docker-compose upcondocker stack deploy:docker-compose upejecuta contenedores en una sola máquina; en Swarm debes usardocker stack deploy. - Olvidar la sección
deploy: las opciones comoreplicasoupdate_configsolo se aplican en modo Swarm dentro del bloquedeploy. - Publicar puertos en conflicto: la routing mesh expone el puerto en todos los nodos; evita colisiones con servicios que ya usen ese puerto.
- No verificar el estado: usa
docker service psydocker node lspara confirmar que las tareas se ejecutan donde esperas. - Tokens de join expuestos: trata los tokens de unión como secretos; quien los tenga puede unir nodos a tu clúster.
Ejercicios
Ejercicio 1
Inicializa un clúster Swarm en una máquina y crea un servicio llamado web con la imagen nginx:latest y 3 réplicas, publicando el puerto 80.
Ejercicio 2
Escribe un fichero Compose para desplegar como stack un servicio api con la imagen miorg/miapi:1.0.0 y 4 réplicas, configurado para actualizar una réplica cada vez con 5 segundos de espera.
Ejercicio 3
A partir del servicio del ejercicio anterior, explica los comandos para escalarlo a 6 réplicas y para actualizar su imagen a la versión 1.1.0.
Soluciones
Solución al Ejercicio 1:
docker swarm init --advertise-addr 192.168.1.10
docker service create --name web --replicas 3 -p 80:80 nginx:latest
docker service ps webPrimero se inicializa el clúster (la máquina pasa a ser manager), luego se crea el servicio con 3 réplicas y el puerto publicado, y finalmente se verifican las tareas.
Solución al Ejercicio 2:
version: "3.8"
services:
api:
image: miorg/miapi:1.0.0
deploy:
replicas: 4
update_config:
parallelism: 1
delay: 5sSe despliega con:
El bloque deploy define 4 réplicas y una actualización progresiva de una réplica cada 5 segundos.
Solución al Ejercicio 3:
El primer comando escala el servicio a 6 réplicas; el segundo actualiza la imagen de forma progresiva respetando la configuración update_config.
Conclusión
En este tema hemos aprendido qué es la orquestación y cómo Docker Swarm convierte un grupo de máquinas en un clúster gestionable con comandos familiares. Hemos visto los conceptos de nodos, servicios y tareas, inicializado un clúster, desplegado aplicaciones con docker stack deploy y realizado escalado y actualizaciones progresivas. Swarm es una excelente puerta de entrada a la orquestación, pero el estándar de la industria para entornos a gran escala es Kubernetes. En el próximo tema, Introducción a Kubernetes, conoceremos su arquitectura y sus conceptos fundamentales.
Docker: De Principiante a Avanzado
Módulo 1: Introducción a Docker
- ¿Qué es Docker?
- Instalando Docker
- Arquitectura de Docker
- Comandos Básicos de Docker
- Entendiendo las Imágenes de Docker
- Creando tu Primer Contenedor Docker
Módulo 2: Trabajando con Imágenes Docker
- Docker Hub y Repositorios
- Construyendo Imágenes Docker
- Conceptos Básicos de Dockerfile
- Gestionando Imágenes Docker
- Etiquetado y Publicación de Imágenes
Módulo 3: Contenedores Docker
- Ejecutando Contenedores
- Ciclo de Vida del Contenedor
- Gestionando Contenedores
- Redes en Docker
- Persistencia de Datos con Volúmenes
Módulo 4: Docker Compose
- Introducción a Docker Compose
- Definiendo Servicios en Docker Compose
- Comandos de Docker Compose
- Aplicaciones Multi-Contenedor
- Variables de Entorno en Docker Compose
Módulo 5: Conceptos Avanzados de Docker
- Profundización en Redes Docker
- Opciones de Almacenamiento Docker
- Mejores Prácticas de Seguridad en Docker
- Optimizando Imágenes Docker
- Registro y Monitoreo en Docker
Módulo 6: Docker en Producción
- CI/CD con Docker
- Orquestando Contenedores con Docker Swarm
- Introducción a Kubernetes
- Desplegando Contenedores Docker en Kubernetes
- Escalado y Balanceo de Carga
