Como continuación al post publicado sobre Docker Machine y OpenNebula, en esta ocasión veremos que con dicho driver también podemos implementar la funcionalidad de Docker Swarm.

Docker Swarm tiene la capacidad de balancear según la disponibilidad del clúster. Así pues, si por ejemplo en un clúster hay un contenedor y este deja de estar disponible, Swarm encarga de asignarlo a otro nodo disponible.
Para  poder implementar esta funcionalidad, hace falta tener instalado Docker Engine y Docker Machine con el driver para a OpenNebula.

Tutorial

El primer paso será crear una máquina virtual con Docker Engine para el servicio de discovery con Consul y arrancar un contenedor con consul:

docker-machine create -d opennebula --opennebula-network-id $network_id --opennebula-image-id $b2d_image_id --opennebula-b2d-size $volatile_disk_size consul
docker $(docker-machine config consul) run -d -p "8500:8500" -h "consul" progrium/consul -server -bootstrap
CONSUL_IP=$(docker-machine ip consul)

Podemos verificar que funciona correctamente, accediendo a la IP de la máquina por el puerto 8500:

 
 
 
 
 
 
 
 
 
 
 
Creamos una nueva máquina virtual, para el nodo máster del clúster:

docker-machine create -d opennebula --opennebula-network-id $network_id --opennebula-image-id $b2d_image_id --opennebula-b2d-size $volatile_disk_size --swarm --swarm-master --swarm-discovery="consul://$CONSUL_IP:8500" --engine-opt cluster-store=consul://$CONSUL_IP:8500 --engine-opt cluster-advertise="eth0:2376" swarm-master

Y tantas máquinas virtuales como nodos queramos que tenga nuestro clúster:

docker-machine create -d opennebula --opennebula-network-id $network_id --opennebula-image-id $b2d_image_id --opennebula-b2d-size $volatile_disk_size --swarm --swarm-discovery="consul://$CONSUL_IP:8500" --engine-opt cluster-store=consul://$CONSUL_IP:8500 --engine-opt cluster-advertise="eth0:2376" swarm-node-XX

docker-machine ls


 
 
Una vez tengamos creados los nodos que compondrán el clúster, podemos acceder al nodo máster con la siguiente comanda:

eval $(docker-machine env --swarm swarm-master)

Podemos ver la información y estado del clúster con el comando:

docker info


 
 
 
 
 
 
 
 
 
 
 
 
 
 
También existe la opción de poder crear redes privadas dentro del clúster usuando el driver overlay:

docker network create --driver overlay --subnet=10.0.1.0/24 overlay_net
docker network ls

Una vez, tenemos el clúster en marcha, ya podemos utilizar Docker de la forma habitual:

docker pull nginx
docker run --name mynginx -d -p 80:80 nginx


 
 

 
 
Siguiente paso… automatizar la elasticidad del clúster con OneFlow.