AboutOpinionesBlogLa Blockletter

Software Crafters® 2025 | Creado con 🖤 para elevar el nivel de la conversación sobre programación en español | Legal

Home » devops » Crea un cluster de Docker Swarm con Digital Ocean
Crea un cluster de Docker Swarm con Digital Ocean

Crea un cluster de Docker Swarm con Digital Ocean

Docker Swarm es una herramienta integrada en el ecosistema de Docker que permite la gestión de un cluster de servidores. En este artículo veremos cómo construir uno utilizando Digital Ocean.

Miguel Ángel Gómez · Seguir4 min read ·

Al suscribirte a la newsletter comparto contigo los 10 libros más importantes de programación. Los que sin duda todo dev debería leer al menos una vez...

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.

docker-compose

La mejor manera de orquestar docker es con el propio docker

Requisitos

Para seguir este tutorial necesitamos los siguiente:

  • Tener instalado docker en tu máquina (puedes instalarlo desde aquí)
  • Disponer de un token de API de Digital Ocean. Si no lo tienes puedes generar uno siguiendo esta guía.

Generar el token de Swarm

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

Nodo principal (Swarm Master)

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

Nodos secundarios

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.

Contenedores en el clúster

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

Conclusión

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)

licencia-cc

Quizás te interese

Tutorial de Python: introducción en 10 minutos

Tutorial de Python: introducción en 10 minutos

Configurar HTTPS con NGINX

Configurar HTTPS con NGINX

Al suscribirte a la newsletter comparto contigo los 10 libros más importantes de programación. Los que sin duda todo dev debería leer al menos una vez...