Docker Swarm Cluster

En el auge de la utilización de contenedores de Linux, Docker se ha caracterizado por ser una herramienta muy poderosa que permite realizar distintas tareas por medio de sus distintas herramientas. En esta ocasión analizare la creación de clusters por medio de Docker Swarm.

Comenzare por describir lo que es un cluster. Un cluster consiste en un conjunto de computadoras que se encuentran poco o fuertemente conectadas para trabajar en conjunto, las cuales pueden ser vistas como un solo sistema. Para el caso de Docker, Swarm es la herramienta que permite crear un conjunto de servidores de contenedores, en un servidor virtual.

Para este ejemplo vamos a crear un cluster con solo dos nodos, pero siempre es posible agregar mas nodos a un cluster existente. Como ya es costumbre utilizare Vagrant para realizar las pruebas.

Vagrantfile

Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"

  config.vm.define :node01 do |node01|
    node01.vm.hostname = "node01"
    node01.vm.network :private_network, ip: '192.168.50.10'
    node01.vm.provision "shell", path: "postinstall-node.sh"
  end

  config.vm.define :node02 do |node02|
    node02.vm.hostname = "node02"
    node02.vm.network :private_network, ip: '192.168.50.11'
    node02.vm.provision "shell", path: "postinstall-node.sh"
  end

  config.vm.define :manager do |manager|
    manager.vm.hostname = "manager"
    manager.vm.network :private_network, ip: '192.168.50.15'
    manager.vm.provision "shell" do |s|
      s.path = "postinstall-manager.sh"
      s.args = ["192.168.50.10", "192.168.50.11"]
    end
  end
end

Como primer paso instalaremos y configuraremos en cada uno de los nodos con docker. En el caso de Ubuntu, es necesario modificar el servicio de upstart para incluir el protocolo de comunicación entre los nodos.

postinstall-node.sh

curl -sSL https://get.docker.com/ubuntu/ | sudo sh
service docker stop
sed -i "s/DOCKER_OPTS=/DOCKER_OPTS='-H tcp:\/\/0.0.0.0:2375'/g" /etc/init/docker.conf
service docker start

Por ultimo, es necesario configurar el servidor que administrara todos los nodos, para ello instalaremos docker, descargaremos el contenedor de swarm y registraremos cada uno de los nodos.

postinstall-manager.sh

curl -sSL https://get.docker.com/ubuntu/ | sudo sh
service docker stop
sed -i "s/DOCKER_OPTS=/DOCKER_OPTS='-H tcp:\/\/0.0.0.0:2375'/g" /etc/init/docker.conf
service docker start

export DOCKER_HOST=tcp://0.0.0.0:2375
echo "export DOCKER_HOST=tcp://0.0.0.0:2375" >> /root/.bashrc

docker pull swarm
cluster_id=`docker run --rm swarm create`
nodes="$@"
for node in $nodes
do
  echo "Adding node $node to cluster $cluster_id"
  docker run -d swarm join --addr="$node:2375" token://$cluster_id
done

docker run -d -p 5000:5000 swarm manage token://$cluster_id

Por ultimo, cabe mencionar que Docker Swarm tiene algunas limitantes. Mencionare tres limitaciones que son descritas por Nikhil en su articulo.

  • La version actual de Swarm no soporta descargar imagenes de repositorios privados.
  • Swarm no soporta multiples swarm masters resultando en un solo punto de falla para programar la creación de contenedores.
  • Swarm no soporta ligar contenedores en distintos servidores.

Nota: El código utilizado para este ejemplo en el repositorio de vagrant-docker-swarm.