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>