Introducción
Docker es una herramienta de código abierto que se puede utilizar para crear, implementar y ejecutar aplicaciones utilizando un contenedor. El contenedor le permite empaquetar una aplicación con todas las dependencias requeridas y enviarla como un solo paquete.
Docker Swarm es una herramienta de agrupación en clúster que se utiliza para la administración de host de Docker. Le permite convertir un grupo de hosts Docker en un único servidor virtual lógico. De esta manera, puede cambiar el tamaño de su aplicación horizontalmente y aumentar el número de instancia del contenedor. Docker swarm ofrece funciones muy útiles, que incluyen reparación automática de contenedores, equilibrio de carga, crecimiento y reducción de contenedores, descubrimiento de servicios y actualizaciones continuas.
En este artículo, le mostraremos cómo configurar un clúster Docker Swarm en CentOS 8.
Prerrequisitos
- Dos servidores que ejecutan CentOS 8.
- Acceso al usuario root en cada servidor.
Instalar Docker en ambos nodos
Primero, deberá instalar Docker en ambos nodos. De forma predeterminada, la última versión de Docker no está incluida en el repositorio predeterminado de CentOS 8. Por lo tanto, deberá agregar un repositorio de Docker en su sistema.
Puedes agregarlo con el siguiente comando:
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
Una vez que se crea el repositorio de Docker, instale Docker con el siguiente comando:
dnf install docker-ce --nobest
Después de instalar Docker, inicie el servicio Docker y habilítelo para que se inicie cuando el sistema se reinicie con el siguiente comando:
systemctl start docker
systemctl enable docker
También puede verificar el estado de Docker con el siguiente comando:
systemctl status docker
Debería obtener el siguiente resultado:
? docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since 2021-03-11 02:55:24 EST; 4s ago
Docs: https://docs.docker.com
Main PID: 2271 (dockerd)
Tasks: 8
Memory: 43.7M
CGroup: /system.slice/docker.service
??2173 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
...
Mar 11 02:55:24 workernode systemd[1]: Started Docker Application Container Engine.
Mar 12 02:55:24 workernode dockerd[2173]: time="2021-03-11T02:55:24.119523516-05:00" level=info msg="API listen on /var/run/docker.sock"
Ahora, verifique la versión instalada de Docker usando el siguiente comando:
docker --version
Debería ver el siguiente resultado:
Docker version 20.10.5, build 55c4c88
Configurar el cortafuegos
A continuación, tendrá que permitir que los puertos 2376
, 2377
, 7946
y 80
a través del firewall en ambos nodos. Puede permitirlos con el siguiente comando:
firewall-cmd --permanent --add-port=2376/tcp
firewall-cmd --permanent --add-port=2377/tcp
firewall-cmd --permanent --add-port=7946/tcp
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=7946/udp
firewall-cmd --permanent --add-port=4789/udp
Luego, vuelva a cargar el firewalld para aplicar los cambios:
firewall-cmd --reload
Inicializar el clúster de enjambre de Docker
A continuación, deberá inicializar el clúster Docker Swarm en el nodo administrador. Puede hacer esto con el siguiente comando:
docker swarm init --advertise-addr 45.58.11.112
Debería obtener el siguiente resultado:
Swarm initialized: current node (h19f38h12jd2398) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-aisjdoj1o2812hfui31h4ifuh13iu4fh13i4ufh1o34ij1po4u9013gj0dsjv09u32er0901923if0 45.58.11.112:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Puede usar el comando que se muestra en el resultado anterior en el nodo de trabajo de Docker para unir el nodo al clúster.
Puede verificar la información del clúster Docker Swarm con el siguiente comando:
docker info
Debería obtener el siguiente resultado:
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 20.10.5
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: active
NodeID: h19f38h12jd2398
Is Manager: true
ClusterID: 1f13nfv8jhf098jgz
Managers: 1
Nodes: 1
Default Address Pool: 10.0.0.0/8
SubnetSize: 24
Data Path Port: 4789
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Number of Old Snapshots to Retain: 0
Heartbeat Tick: 1
Election Tick: 10
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Expiry Duration: 3 months
Force Rotate: 0
Autolock Managers: false
Root Rotation In Progress: false
Node Address: 45.58.11.112
Manager Addresses:
45.58.11.112:2377
Ahora puede probar el nodo Docker Swarm con el siguiente comando:
docker node ls
Debería obtener el siguiente resultado:
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
h19f38h12jd2398 * masternode Ready Active Leader 20.10.5
Agregar un nodo trabajador a Docker Swarm Cluster
A continuación, deberá agregar el nodo trabajador al nodo del administrador de Docker Swarm. Puede hacer esto con el siguiente comando en el nodo trabajador:
docker swarm join --token SWMTKN-1-aisjdoj1o2812hfui31h4ifuh13iu4fh13i4ufh1o34ij1po4u9013gj0dsjv09u32er0901923if0 45.58.32.185:2377
Debería obtener el siguiente resultado:
This node joined a swarm as a worker.
En el nodo de Docker Manager, verifique el nodo trabajador con el siguiente comando:
docker node ls
Debería ver que el nodo trabajador se agrega a Docker Swarm:
h19f38h12jd2398 * masternode Ready Active Leader 20.10.5
220fj2094fgj094 workernode Ready Active 20.10.5
Iniciar un servicio en Docker Swarm
Aquí crearemos un nuevo servicio web Nginx y lo escalaremos con dos contenedores. Puede crearlo ejecutando el siguiente comando en el nodo Administrador:
docker service create -p 80:80 --name webservice --replicas 2 nginx
Debería obtener el siguiente resultado:
aosjdoi12j3oidjaoijdossidj
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
Ahora puede verificar el servicio web con el siguiente comando:
docker service ls
Debería ver el siguiente resultado:
ID NAME MODE REPLICAS IMAGE PORTS
djkoijoidj webservice replicated 2/2 nginx:latest *:80->80/tcp
También puede verificar el contenedor en ejecución con el siguiente comando:
docker ps
Debería ver el siguiente resultado:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
i2efuhidusdfu nginx:latest "/docker-entrypoint.…" 22 seconds ago Up 30 seconds 80/tcp webservice.2.jelyj9gmeb7ikl2scg7mz8yg8
Para obtener información detallada sobre el servicio web, ejecute el siguiente comando:
docker service ps webservice
Debería ver el siguiente resultado:
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
9d23ud89298d webservice.1 nginx:latest workernode Running Running 3 minutes ago
sdajfoiasdjf webservice.2 nginx:latest masternode Running Running 3 minutes ago
Comprobar enjambre de Docker
En este punto, hemos implementado un contenedor Nginx en los nodos del clúster, incluido el nodo de administración. Ahora puede acceder al servidor web Nginx utilizando cualquiera de las direcciones IP del nodo trabajador o del nodo administrador:
Conclusión
En este tutorial aprendimos cómo instalar y configurar el clúster Docker Swarm en CentOS 8. Ahora puede agregar cualquier número de nodos trabajadores al clúster Docker Swarm y cambiar el tamaño de su aplicación.