Hoy vamos a hablar de Docker Swarm, es una herramienta de orquestación de contenedores1, diseñada para gestionar, desplegar y escalar un clúster de nodos Docker como un único sistema virtual. Simplifica el manejo de un clúster de hosts Docker al convertirlos en un único host Docker virtual, lo que lo convierte en una excelente opción para desarrolladores y administradores de sistemas que buscan una forma eficiente de orquestar el despliegue de contenedores.
Características Clave de Docker Swarm
- Configuración Fácil y Rápida: Configurar un clúster de Docker Swarm es sencillo, lo que permite un rápido despliegue de aplicaciones.
- Diseño Descentralizado: Docker Swarm utiliza un diseño descentralizado que distribuye los servicios a través de múltiples nodos, mejorando la fiabilidad y la tolerancia a fallos.
- Balanceo de Carga: Distribuye las cargas de trabajo de los contenedores de manera uniforme a través del clúster, mejorando la utilización de recursos y la capacidad de respuesta.
- Escalabilidad: Escala las aplicaciones fácilmente hacia arriba o hacia abajo según la demanda, sin interrumpir las operaciones en curso.
- Descubrimiento de Servicios: El descubrimiento de servicios integrado permite que los contenedores se encuentren y comuniquen entre sí de manera eficiente.
Cómo Funciona Docker Swarm
Docker Swarm opera agrupando múltiples hosts. El clúster es gestionado por los nodos maestros de Swarm que se encargan de la orquestación y programación de contenedores en los nodos trabajadores. Los usuarios interactúan con el Swarm usando la CLI de Docker o la API. Las tareas se distribuyen en base a las configuraciones que hagamos para el reparto de tareas y los recursos disponibles en maquinas en esa prioridad.
Elementos Docker Swarm
- Imagen es un archivo inmutable que contiene el código fuente, las bibliotecas, las dependencias, las herramientas y otros archivos necesarios para que una aplicación funcione. Es la base de un contenedor y se crea a través de instrucciones en un archivo Dockerfile.
# Dockerfile para crear una imagen de nginx
FROM nginx:latest
COPY ./html /usr/share/nginx/html
docker build -t mi-nginx .
- Contenedor: es la unidad más básica del clúster en el se ejecutan un proceso o una aplicación usando una imagen previamente creada como referencia.
docker run -d --name mi-nginx -p 8080:80 nginx
- Servicio: Define la imagen que se va a usar en el contenedor, además de las políticas de ejecución, la cantidad de réplicas, configuraciones de red, y políticas de actualización.
docker service create --name mi-servicio-nginx --replicas 3 mi-nginx
- Red Overlay: Permite que los contenedores de un servicio de Docker Swarm se comuniquen entre sí, independientemente del nodo físico en el que estén ejecutando. Utiliza una red virtual que se sitúa sobre las redes de los nodos.
docker network create -d overlay mi-red-overlay
docker service create --name mi-servicio-nginx --network mi-red-overlay --replicas 3 mi-nginx
- Balanceador de Carga: Distribuye las solicitudes entre los contenedores de un servicio. Esto es crítico para manejar la carga de manera eficiente y garantizar la disponibilidad y escalabilidad del servicio.
docker service create --name mi-servicio-nginx --publish 80:80 --replicas 3 mi-nginx
Construcción del clúster
La construcción es muy sencilla hay que entrar en un nodo del cluster y escribir el siguiente comando:
Creación del cluster
$docker swarm init --advertise-addr <ip-nodo>
Swarm initialized: current node (xyz1234abcd) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-0xyz1234abcd5678efgh-ijklmnopqrstu <ip-nodo>:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Como vemos en el mensaje para añadir otro nodo a este clúster tan solo tenemos que entrar en dicho nodo y lanzar.
Asociar un worker al clúster
$docker swarm join --token SWMTKN-1-0xyz1234abcd5678efgh-ijklmnopqrstu <ip-nodo>:2377
This node joined a swarm as a worker.
Asociar un master al clúster
Hemos aprendido a añadir un nuevo worker pero si queremos añadir otro master para tener HA el paso es muy similar, desde el nodo master que ya tiene el clúster creado:
docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-xxxyyyzzz1234567890-abcdefghijklmn <ip-nodo>:2377
Configuración de clúster
Desplegar contenedores en un nodo concreto
Para desplegar unos contenedores en un nodo especifico debemos crear una etiqueta en el nodo worker.
docker node update --label-add <clave>=<valor> <nombre_del_nodo>
Cuando creemos el contenedor demos usar el parámetro constraint para indicarle la etiqueta del nodo en el que lo queremos desplegar.
docker service create --name <nombre_del_servicio> --constraint 'node.labels.<clave> == <valor>' <imagen_del_contenedor>
Recursos Reservados y Límites
A nivel de configuración del clúster, también podemos especificar límites de recursos y reservas para los servicios, lo que nos puede ayudar a gestionar cómo se utilizan los recursos del clúster y asegurar que los servicios tengan acceso a los recursos que necesitan.
docker service create \
--name mi-nginx \
--replicas 3 \
--reserve-cpu 0.5 \
--reserve-memory 256M \
nginx
Para configurar esto en un servicio de Docker Swarm, puedes usar los flags --limit-cpu, --limit-memory, --reserve-cpu, y --reserve-memory al crear o actualizar servicios.
Actualizaciones y Políticas de Reinicio
Las políticas de actualización en Docker Swarm permiten controlar cómo y cuándo se actualizan los servicios para introducir nuevas versiones de imágenes o cambios en la configuración de los servicios. Esto es especialmente útil para implementar actualizaciones sin tiempo de inactividad (rolling updates) y para asegurar que el servicio continúe disponible durante la actualización.
Configuración de una Política de Actualización: Cuando creas o actualizas un servicio en Docker Swarm, puedes especificar opciones relacionadas con la política de actualización:
--update-delay: El tiempo de espera entre la actualización de una réplica y la siguiente. Esto ayuda a asegurar que no todas las réplicas se actualicen al mismo tiempo, lo que podría llevar a tiempo de inactividad.--update-parallelism: El número de réplicas que se pueden actualizar simultáneamente.--update-failure-action: Define lo que debe suceder si una actualización falla. Las opciones incluyenpause(pausar la actualización),continue(continuar con la actualización), orollback(revertir a la versión anterior).
Orquestar contenedores significa automatizar y gestionar el ciclo de vida de los contenedores de aplicaciones. La herramienta, en este caso Docker Swarm, se encarga que los contenedores tengan las replicas que se especifican, que se haga balanceo de red entre los distintos contenedores o que los contenedores estén dando un buen servicio, entre varias gestiones que se explican en la sección Características Clave de Docker Swarm ↩︎
