Docker swarm mode: Creacion de un cluster

Con la versión 1.12 de docker han venido varios cambios y mejoras en su sistema de clustering swarm.
Con esta version aparece el denominado swarm mode, que simplifica mucho su despliegue.
Así se crearía un cluster docker en swarm mode.

Primero lo único que tenemos que hacer es desplegar varios servidores que queramos usar en el cluster e instalarle el docker engine.

Recomiendo que todos los nodos tengan el mismo sistema operativo y versión de docker aunque solo lo segundo se me antoja mas relevante.
Ademas de la instalación del engine, sera necesario habilitarlo para el arranque del sistema (systemd)

systemctl enable docker

Networking

Los nodos deberán verse entre si a través de diversos puertos que habrá que abrir en el caso de que estén filtrados. En este ejemplo asumiremos que no es así y que los nodos tienen todo abierto entre ellos.

Creación

Para crear el cluster en swarm mode lanzaremos desde uno de los nodos, que se convertirá automática en manager, el siguiente comando

docker swarm init --advertise-addr <IP>

...donde IP será la dirección IP del servidor donde queremos que se escuche.

Añadir nodos

Al ejecutarlo, si ha ido bien, obtendremos por pantalla un comando de esta forma

docker swarm join \
    --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
    192.168.99.100:2377

Este comando será lo que haya que lanzar en los nodos que querramos añadir al cluster como worker.

En docker swarm mode hay 2 tipos de nodos. Los nodos worker alojan containers y tareas. Los nodos manager se encargar del funcionamiento del cluster y por defecto también alojan tareas y containers.

Si algún día olvidamos el comando a tirar en los nodos que queremos convertir en workers, podemos obtenerlo con

docker swarm join-token worker

¿Y si lo que queremos añadir es un nodo manager? Para obtener el comando a lanzar bastaría con un simple

docker swarm join-token manager

Cambiar un nodo de worker a manager

Llegado el caso también podemos cambiar el rol de un nodo de manager a worker

docker node demote <nodo>

o de worker a manager

docker node promote <nodo>