Docker Swarm es una herramienta software que permite ejecutar los contenedores en una granja de nodos, esto implica uno o varios balanceadores de carga implementados en uno o varios nodos maestros y los nodos que prestan el servicio, implementados en nodos trabajadores. Los contenedores que se ejecutan en modo Swarm se les denomina en ocasiones como modo enjambre.
La referencia a que pueda existir uno varios nodos maestros es debido a que debe haber al menos un nodo maestro, pero podría haber más de uno sin que esto sea un conflicto.
Ejecutar Docker en modo Swarm permite gestionar varios clusters de manera descentralizada. Esto es una orquestación de contenedores los cuales no tienen por qué estar situados en la misma máquina física ni virtual. Crea así una independencia del sistema que aloja los contenedores, aumentando la seguridad ante pérdida del servicio si se distribuye los nodos en distintas máquinas.
Docker Swarm se basa en una arquitectura maestro-esclavo (manager-worker). Cada enjambre está formado al menos por un nodo maestro (también llamado administrador o manager) y tantos nodos esclavos (llamados trabajadores o workers) como se desee. El maestro de Swarm es responsable de la gestión del clúster y la delegación de tareas, el esclavo se encarga de ejecutar dichas tareas.
Existen tres conceptos que se deben diferenciar: servicio, aplicación y tarea. Los servicios definidos para Docker Swarm pueden contener varias tareas o una única. Las tareas hacen referencia a las réplicas de un mismo servicio y puede existir varias tareas de un mismo servicio. El encargado de esta distribución de tareas entre los nodos como ya se ha mencionado es el manager del enjambre.
Las aplicaciones hacen referencia a los distintos softwares que puede contener un mismo contenedor que ejecuta una imagen específica de Docker.
Aquí os dejamos una imagen que puede ilustrar las diferencias entre estos conceptos es la siguiente:
Se distinguen dos maneras de trabajar con Docker Swarm en cuanto a cómo es la disponibilidad de las réplicas de los servicios definidos:
- Servicios globales: Swarm ejecutará una tarea en todos y cada uno de los nodos del clúster que cumpla con las restricciones establecidas como la ubicación del servicio o recursos.
- Servicios replicados: se especifica el número de tareas idénticas que se desea ejecutar. Swarm creará tantas réplicas de la tarea especificada como se ha determinado. Por ejemplo, si creamos un servicio con dos réplicas, Swarm creará dos tareas que alojará en los nodos del enjambre.
La imagen anterior muestra cómo existe un servicio replicado con dos réplicas, alojado en dos nodos distintos. Existe también un servicio global, de este segundo se encuentra una réplica en cada nodo disponible.
La manera de trabajar con un servicio global o un servicio replicado se establece mediante el número de réplicas a ejecutar de un servicio o indicando que se desea ejecutar el servicio en el modo global. Se puede indicar mediante las sentencias del Docker CLI o mediante el docker-compose.yml
Para el ejemplo de servicios replicados ambos ejemplos serían los siguientes:
- A través de la ejecución iniciada con un comando similar al siguiente:
- Mediante docker-compose.yml:
Se observa que en ambos ejemplos las réplicas establecidas a generar son tres del servicio my_website.
Por otro lado, siguiendo este mismo ejemplo, pero en el caso de servicios globales sería de la siguiente manera:
- Inicio del servicio mediante un comando parecido al siguiente:
- Mediante docker-compose.yaml
En este ejemplo el servicio my_website se está ejecutando en modo global, es decir una réplica por cada nodo disponible.
Los servicios pueden ser accesibles por cualquier nodo del swarm, que como se verá más adelante, usa una red ovelay interna (Ingress network) que conecta todos sus nodos y la petición llega al nodo donde se esté ejecutando el servicio.
Cada servicio se registra automáticamente en un DNS interno del Swarm. Si un servicio está replicado en varios nodos el nodo gestor balancea las peticiones usando el DNS. Por ejemplo, si hay tres réplicas de my_website, el DNS podría tener registrado lo siguiente:
my_website 172.17.0.5
my_website 172.17.0.6
my_website 172.17.0.7
Y cada vez que se pide el servicio el DNS responde usando las tres direcciones de forma circular.
Si hay varios nodos gestores funcionan en modo Activo-Pasivo, uno es el “leader” y los demás están de respaldo.
Características de Docker Swarm
Docker Swarm se caracteriza por las siguientes ventajas principalmente:
- Se encuentra integrado con la API Docker Engine.
- Se organiza de manera jerárquica muy simple, existen únicamente dos roles. El rol de worker y el rol de manager. Los managers pueden actuar también como workers.
- Redistribución de las cargas de trabajo si algún nodo falla asegurando una alta disponibilidad.
- Administración de los grupos de contenedores, ofreciendo la posibilidad de agregar, eliminar, balancear la carga entre ellos, etc.
- Funcionalidades de escalado manual, permitiendo aumentar y disminuir recursos según necesidad, y rolling updates (gestión de actualizaciones sobre los servicios) integrado.
- No es necesaria ninguna instalación extra para tenerlo disponible con Docker.
¿Deberías plantearte implementar Docker en tus proyectos?
Desde Making Science pensamos que es una muy buena elección si se trata de un entorno de pruebas en el cual se compone de varios microservicios. La opción es atractiva debido a que se pueden configurar las redes de cada microservicio y las características de cada uno de ellos de manera sencilla, pero, debido a sus similitudes con Kubernetes, hace que en entorno de producción la adopción de Kubernetes sea muy superior.