Software Crafters ® | Creado con 🖤 para elevar el nivel de la conversación sobre programación en español| Legal
Docker Swarm es una herramienta integrada en el ecosistema de Docker que permite la gestión de un cluster de servidores. Pone a nuestra disposición una API con la que podemos administrar las tareas y asignación de recursos de cada contenedor dentro de cada una de las máquinas. Dicha API nos permite gestionar el cluster como si se tratase de una sola máquina Docker.
En este artículo veremos cómo construir un cluster de servidores con Docker Swarm, se utilizará Docker Machine con el driver de Digital Ocean para aprovisionar cada una de las máquinas.
La mejor manera de orquestar docker es con el propio docker
Para seguir este tutorial necesitamos los siguiente:
El sistema de descubrimiento de nodos de Swarm, Discovery Service, se sirve de un token para reconocer todos nodos que forman parte de un clúster. Veamos como generar dicho token para poder hacer uso de Discovery Service.
En primer lugar guardaremos en una variable de sesión el token de Digital Ocean:
export DO_TOKEN="abcdefghijklmnopqrstuvwxyz1234567890"
A continuación, creamos una maquina con docker machine llamada swarm-1, dicha máquina servirá simplemente para generar el token de cluster:
docker-machine create \ --driver digitalocean \ --digitalocean-access-token ${DO_TOKEN} \ --digitalocean-image "ubuntu-16-04-x64" \ --digitalocean-region "lon1" \ --digitalocean-size "512mb" \ swarm-1
Seleccionamos esta maquina:
eval $(docker-machine env swarm-1)
Generamos el token de cluster:
docker run swarm create
Almacenamos en una variable de entorno dicho token y lo exportamos:
export SWARM_TOKEN=61ef79938e5559d480c2841991c49f5d
Ya podemos eliminar esta instancia de digital ocean, como hemos dicho sólo la necesitabamos para crear el ID.
docker-machine rm swarm-1
Es el encargado de gestionar los recursos del clúster. Para crearlo ejecutaremos el siguiente código:
docker-machine create \ --driver digitalocean \ --digitalocean-access-token ${DO_TOKEN} \ --digitalocean-image "ubuntu-16-04-x64" \ --digitalocean-region "lon1" \ --digitalocean-size "512mb" \ --swarm --swarm-master \ --swarm-discovery token://${SWARM_TOKEN} \ swarm-master
Una vez creado el nodo principal ya podemos añadir los nodos secundarios que necesitemos, en este caso vamos a añadir dos nodos al cluster:
Nodo 1:
docker-machine create \ --driver digitalocean \ --digitalocean-access-token ${DO_TOKEN} \ --digitalocean-image "ubuntu-16-04-x64" \ --digitalocean-region "lon1" \ --digitalocean-size "512mb" \ --swarm \ --swarm-discovery token://${SWARM_TOKEN} \ swarm-node-1
Nodo 2:
docker-machine create \ --driver digitalocean \ --digitalocean-access-token ${DO_TOKEN} \ --digitalocean-image "ubuntu-16-04-x64" \ --digitalocean-region "lon1" \ --digitalocean-size "512mb" \ --swarm \ --swarm-discovery token://${SWARM_TOKEN} \ swarm-node-2
Comprobamos que todos los nodos están funcionan correctamente
docker-machine ls
Si seleccionamos unos de los nodos:
eval $(docker-machine env --swarm swarm-master)
y, ejecutamos docker info,
podremos ver la información de los dos nodos secundarios y del nodo principal, containers, CPUs, Memoria kernel.
Vamos a ejecutar dos contenedores con la imagen nginx y aplicando una limitación de 400M de memoria a cada uno de los contenedores
docker run --name web-1 -d -P -m 400M nginx
Podemos comprobar si el contenedor está ejecutandose correctamente con
docker ps
. Observamos que el planificador de docker swarm ha escogido para correr el contenedor web-1 el nodo principal.
Veamos que ocurre si inicializamos otro contenedor denominado “web-2” con las mismas restricciones que el anterior:
docker run --name web-2 -d -P -m 400M nginx
En esta ocasión, el planificador ha asignado el contenedor al nodo 1, porque no había suficiente memoria en el nodo principal.
Si lo consideramos necesario podemos ampliar el tamaño del cluster, ejecutando simplemente:
docker run --name web-2 -d -P -m 400M nginx docker-machine create \ --driver digitalocean \ --digitalocean-access-token ${DO_TOKEN} \ --digitalocean-image "ubuntu-16-04-x64" \ --digitalocean-region "lon1" \ --digitalocean-size "512mb" \ --swarm \ --swarm-discovery token://${SWARM_TOKEN} \ swarm-node-3
Hemos podido ver que orquestar hosts de Docker con Docker Swarm es un proceso relativamente sencillo. Poco a poco el ecosistema de docker se está volviendo más robusto y completo. En el caso concreto de Swarm, personalmente aun no lo utilizaría en entornos de producción, pero como hemos podido ver es una herramienta que promete mucho.
Happy clustering!!
Si te ha gustado la entrada valora y comparte en tus redes sociales. No dudes en comentar dudas, aportes o sugerencias, estaré encantado de responder.
Este artículo se distribuye bajo una Licencia Creative Commons Reconocimiento-CompartirIgual 4.0 Internacional (CC BY-SA 4.0)