
¡Bienvenidos a esta guía donde aprenderemos a configurar un clúster Docker Swarm con alta disponibilidad (HA) para desplegar un servicio de CMS (WordPress) con tres réplicas! Esta práctica está diseñada para ayudarte a entender cómo implementar y gestionar servicios en un entorno de clúster.
sudo apt update
sudo apt upgrade -y
Ejecuta en cada nodo:
sudo apt install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
sudo docker version
En el nodo1, inicializa el swarm:
sudo docker swarm init --advertise-addr <IP_DEL_NODO1>
Anota el comando docker swarm join
que se muestra; lo necesitarás para agregar los otros nodos.
En nodo2 y nodo3, ejecuta:
sudo docker swarm join --token <TOKEN_DEL_SWARM> <IP_DEL_NODO1>:2377
En el nodo1, ejecuta:
sudo docker node ls
Deberías ver algo como esto:
sudo docker network create -d overlay --attachable my-overlay
sudo docker service create \
--name mysql \
--network my-overlay \
--env MYSQL_ROOT_PASSWORD=<TU_CONTRASEÑA> \
--env MYSQL_DATABASE=wordpress \
--env MYSQL_USER=wordpress_user \
--env MYSQL_PASSWORD=<TU_CONTRASEÑA> \
--replicas 1 \
mysql:5.7
sudo docker service create \
--name wordpress \
--network my-overlay \
--publish 80:80 \
--replicas 3 \
--env WORDPRESS_DB_HOST=mysql \
--env WORDPRESS_DB_USER=wordpress_user \
--env WORDPRESS_DB_PASSWORD=<TU_CONTRASEÑA> \
--env WORDPRESS_DB_NAME=wordpress \
wordpress:latest
Comprueba que los servicios están en ejecución:
sudo docker service ls
Para ver detalles de un servicio específico:
sudo docker service ps wordpress
Docker Swarm ofrece HA de forma nativa al gestionar las réplicas y distribuirlas entre los nodos.
Para asegurar la persistencia de datos, es recomendable utilizar volúmenes.
Elimina el servicio MySQL existente:
sudo docker service rm mysql
Crea el servicio MySQL con volumen:
sudo docker service create \
--name mysql \
--network my-overlay \
--env MYSQL_ROOT_PASSWORD=<TU_CONTRASEÑA> \
--env MYSQL_DATABASE=wordpress \
--env MYSQL_USER=wordpress_user \
--env MYSQL_PASSWORD=<TU_CONTRASEÑA> \
--mount type=volume,source=mysql-data,target=/var/lib/mysql \
--replicas 1 \
mysql:5.7
Elimina el servicio WordPress existente:
sudo docker service rm wordpress
Crea el servicio WordPress con volumen:
sudo docker service create \
--name wordpress \
--network my-overlay \
--publish 80:80 \
--replicas 3 \
--env WORDPRESS_DB_HOST=mysql \
--env WORDPRESS_DB_USER=wordpress_user \
--env WORDPRESS_DB_PASSWORD=<TU_CONTRASEÑA> \
--env WORDPRESS_DB_NAME=wordpress \
--mount type=volume,source=wp-data,target=/var/www/html \
wordpress:latest
A continuación, se presenta un diagrama simplificado de la arquitectura del clúster:
my-overlay
que conecta todos los servicios.Desde un navegador web, visita:
http://<IP_DE_CUALQUIER_NODO>
Deberías ver algo como esto:
En el nodo manager:
sudo docker service ps wordpress
Para probar la HA, detén Docker en uno de los nodos:
sudo systemctl stop docker
Verifica que las réplicas se redistribuyen:
Los otros nodos siguen operativos:
Para MySQL:
sudo docker run --rm \
-v mysql-data:/data \
-v $(pwd):/backup \
ubuntu tar cvf /backup/mysql-data-backup.tar /data
Para WordPress:
sudo docker run --rm \
-v wp-data:/data \
-v $(pwd):/backup \
ubuntu tar cvf /backup/wp-data-backup.tar /data
Para MySQL:
sudo docker run --rm \
-v mysql-data:/data \
-v $(pwd):/backup \
ubuntu tar xvf /backup/mysql-data-backup.tar -C /
Para WordPress:
sudo docker run --rm \
-v wp-data:/data \
-v $(pwd):/backup \
ubuntu tar x
vf /backup/wp-data-backup.tar -C /
MarianoGarciaGz