En un entorno Docker un grupo de dockerhosts trabajando conjuntamente, se denomina swarm. Algunas de sus características, de forma muy resumida, son:
Hasta aquí la aburrida teoría la cual, como siempre, recomiendo ampliar visitando la documentación oficial de Docker y que intentaré ampliar en las próximas entradas.
Para construir un swarm básico necesitamos varios nodos con docker instalado, crear el swarm en uno de los nodos, lo que lo convertirá en un nodo manager y añadir el resto de nodos al swarm, que se añadirán como nodos worker.
En mi caso he utilizado cuatro máquinas virtuales CentOS 7 con dos tarjetas de red, una para formar la red de cluster entre los dockerhost y una red de servicio, para el acceso a los servicios proporcionados por los contenedores.
Para la configuración de los nodos, instalación de Docker y creación del swarm, he desarrollado un par de playbooks de Ansible, los cuales están disponibles en
github para su consulta, modificación, uso y disfrute.
Así que tras instalar los nodos y ejecutar los playbooks correspondientes, tendremos un swarm de cuatro nodos. Como hemos dicho, hay un nodo manager en el swarm, que es desde el cual debemos lanzar todos nuestros comandos. Así, para comprobar el estado de nuestro swarm ejecutaremos el siguiente comando desde nuestro nodo manager:
|
Información sobre los nodos del swarm. |
El comando docker node ls nos muestra el estado de todos los nodos que forman nuestro swarm y además, nos indica cuales son nodos manager, la versión del motor de docker de cada uno y su disponibilidad.
Como primera prueba sencilla, además de la cración del swarm, hoy vamos a desplegar un servicio simple web basado en una imagen con un servidor HTTP, para esto solo tenemos que lanzar el comando siguiente:
|
Creación de un servicio web simple. |
De forma muy resumida, con el comando anterior hemos desplegado un servicio http basado en Apache que tiene tres réplicas distribuidas entre todos los nodos de nuestro swarm, usando como imagen la imagen disponible en el repositorio correspondiente de Docker Hub y publicando el puerto 443 de cada contenedor en cada uno de los hosts. Para comprobarlo solo tenemos que listar los servicios de nuestro swarm con el siguiente comando:
|
Lista de los servicios ejecutándose en el swarm. |
Si inspeccionamos los contenedores que se están ejecutando en cada uno de los nodos del swarm, ejecutando el comando docker ps -a en cada uno de ellos, veremos lo siguiente:
|
Contenedores ejecutándose en los nodos del swarm. |
Como vemos en la salida anterior, cada dos de los nodos worker del swarm está ejecutando un contenedor correspondiente a nuestro servicio, estando el tercero alojado en el nodo manager. Si ahora accedemos al servicio en nuestros nodos, podremos ver que la web se muestra correctamente y en cada caso muestra lo siguiente:
|
Web mostrada accediendo al nodo swarm-node1. |
|
Web mostrada accediendo al nodo swarm-node2. |
Para terminar, si quieremos eliminar el servicio, solo tendremos que ejecutar el siguiente comando en el manager de nuestro swarm:
|
Eliminando el servicio webserver del swarm. |
Por tanto, como podemos ver, una vez que hemos creado un swarm tenemos que tener en cuenta los siguientes puntos:
- Debemos interactuar con uno de los nodos manager del swarm para poder desplegar y controlar nuestros servicios.
- Los contenedores se ejecutarán en cualquier nodo que forme parte del swarm, salvo que establezcamos algún tipo de limitación por nodo.
- Al publicar un puerto de un servicio, dicho puerto estará disponible en la IP correspondiente del nodo físico que hayamos especificado como data-path en el momento de la creación del swarm.
- Al crear un servicio simple, como el de este ejemplo, podremos especificar el número de réplicas que formarán dicho servicio y estas se distribuirán por todos los nodos que formen el swarm.
Con este ejemplo básico hemos visto como podemos comenzar a trabajar con swarms de Docker y, en las proximas entradas, exploraremos más detenidamente los tipos de despliegues y sus características, la comunicación entre los nodos que forman el swarm y como acceder a volúmenes para conseguir la persistencia de nuestros datos.