Cómo instalar y configurar un clúster Docker Swarm en CentOS 8
Docker es una herramienta de código abierto que puede utilizarse para crear, desplegar y ejecutar aplicaciones utilizando un contenedor. El contenedor te permite empaquetar una aplicación con todas las dependencias necesarias y enviarla como un único paquete.
Docker Swarm es una herramienta de agrupación utilizada para gestionar el host Docker. Te permite convertir un grupo de hosts Docker en un único servidor virtual lógico. De esta forma puedes escalar tu aplicación horizontalmente y aumentar el número de la instancia del contenedor. Docker swarm ofrece funciones muy útiles, como la autorreparación de contenedores, el equilibrio de carga, la ampliación y reducción de contenedores, el descubrimiento de servicios y las actualizaciones continuas.
En este post, te mostraremos cómo configurar un clúster Docker Swarm en CentOS 8.
Requisitos previos
- Dos servidores con CentOS 8.
- Se ha configurado una contraseña de root en cada servidor.
Instalar Docker en ambos nodos
En primer lugar, tendrás que instalar Docker en ambos nodos. Por defecto, la última versión de Docker no está incluida en el repositorio por defecto de CentOS 8. Así que tendrás que añadir un repositorio de Docker en tu sistema.
Puedes añadirlo con el siguiente comando:
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
Una vez creado el repo de Docker, instala Docker con el siguiente comando:
dnf install docker-ce --nobest
Después de instalar Docker, inicia el servicio Docker y permite que se inicie al reiniciar el sistema con el siguiente comando:
systemctl start docker
systemctl enable docker
También puedes verificar el estado de Docker con el siguiente comando:
systemctl status docker
Deberías obtener la siguiente salida:
? docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled) Active: active (running) since Fri 2021-03-12 03:55:24 EST; 6s ago Docs: https://docs.docker.com Main PID: 2173 (dockerd) Tasks: 8 Memory: 44.7M CGroup: /system.slice/docker.service ??2173 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock Mar 12 03:55:23 workernode dockerd[2173]: time="2021-03-12T03:55:23.570387991-05:00" level=error msg="Failed to built-in GetDriver graph btrfs> Mar 12 03:55:23 workernode dockerd[2173]: time="2021-03-12T03:55:23.617049696-05:00" level=warning msg="Your kernel does not support cgroup bl> Mar 12 03:55:23 workernode dockerd[2173]: time="2021-03-12T03:55:23.617096273-05:00" level=warning msg="Your kernel does not support cgroup bl> Mar 12 03:55:23 workernode dockerd[2173]: time="2021-03-12T03:55:23.617278059-05:00" level=info msg="Loading containers: start." Mar 12 03:55:23 workernode dockerd[2173]: time="2021-03-12T03:55:23.884953789-05:00" level=info msg="Default bridge (docker0) is assigned with> Mar 12 03:55:24 workernode dockerd[2173]: time="2021-03-12T03:55:24.039811428-05:00" level=info msg="Loading containers: done." Mar 12 03:55:24 workernode dockerd[2173]: time="2021-03-12T03:55:24.066358016-05:00" level=info msg="Docker daemon" commit=363e9a8 graphdriver> Mar 12 03:55:24 workernode dockerd[2173]: time="2021-03-12T03:55:24.066498611-05:00" level=info msg="Daemon has completed initialization" Mar 12 03:55:24 workernode systemd[1]: Started Docker Application Container Engine. Mar 12 03:55:24 workernode dockerd[2173]: time="2021-03-12T03:55:24.119523516-05:00" level=info msg="API listen on /var/run/docker.sock"
Ahora, verifica la versión instalada de Docker con el siguiente comando:
docker --version
Deberías ver la siguiente salida:
Docker version 20.10.5, build 55c4c88
Configurar el cortafuegos
A continuación, tendrás que permitir los puertos 2376, 2377, 7946 y 80 a través del cortafuegos en ambos nodos. Puedes 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
A continuación, recarga el firewalld para aplicar los cambios:
firewall-cmd --reload
Inicializa el clúster Docker Swarm
A continuación, tendrás que inicializar el clúster Docker Swarm en el nodo gestor. Puedes hacerlo con el siguiente comando:
docker swarm init --advertise-addr 45.58.32.185
Deberías obtener la siguiente salida:
Swarm initialized: current node (cq8xpscsls2ctqhdha8lhdrph) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-24ciicg1knfh8htmvymnfw1igx64tcq6ah91n6amk18m2ek9qo-8sf9oysu08t5mf4ggd4ut7o3e 45.58.32.185:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Puedes utilizar el comando mostrado en la salida anterior en el nodo trabajador de Docker para unir el nodo al clúster.
Puedes comprobar la información del clúster Docker Swarm con el siguiente comando:
docker info
Deberías obtener la siguiente salida:
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: cq8xpscsls2ctqhdha8lhdrph Is Manager: true ClusterID: m7jrgvuw1k7pvfd1qyc3mffpl 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.32.185 Manager Addresses: 45.58.32.185:2377
Ahora puedes verificar el nodo Docker Swarm con el siguiente comando:
docker node ls
Deberías obtener la siguiente salida:
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION cq8xpscsls2ctqhdha8lhdrph * masternode Ready Active Leader 20.10.5
Añadir nodo trabajador al clúster Docker Swarm
A continuación, tendrás que añadir el nodo trabajador al nodo gestor de Docker Swarm. Puedes hacerlo con el siguiente comando en el nodo trabajador:
docker swarm join --token SWMTKN-1-24ciicg1knfh8htmvymnfw1igx64tcq6ah91n6amk18m2ek9qo-8sf9oysu08t5mf4ggd4ut7o3e 45.58.32.185:2377
Deberías obtener la siguiente salida:
This node joined a swarm as a worker.
En el nodo gestor de Docker, verifica el nodo trabajador con el siguiente comando:
docker node ls
Deberías ver que el nodo trabajador se ha añadido al Docker Swarm:
cq8xpscsls2ctqhdha8lhdrph * masternode Ready Active Leader 20.10.5 bipfv8sfm94a9po0uame5rd1n workernode Ready Active 20.10.5
Lanzar un servicio en Docker Swarm
Aquí crearemos un nuevo servicio web Nginx y lo escalaremos con dos contenedores. Puedes crearlo ejecutando el siguiente comando en el nodo Manager:
docker service create -p 80:80 --name webservice --replicas 2 nginx
Deberías obtener la siguiente salida:
agyxlaswxakrbboakkyydsh0k overall progress: 2 out of 2 tasks 1/2: running [==================================================>] 2/2: running [==================================================>] verify: Service converged
Ahora puedes comprobar el webservice con el siguiente comando:
docker service ls
Deberías ver la siguiente salida:
ID NAME MODE REPLICAS IMAGE PORTS agyxlaswxakr webservice replicated 2/2 nginx:latest *:80->80/tcp
También puedes comprobar el contenedor en ejecución con el siguiente comando:
docker ps
Deberías ver la siguiente salida:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c887cad1df2e nginx:latest "/docker-entrypoint.…" 32 seconds ago Up 30 seconds 80/tcp webservice.2.jelyj9gmeb7ikl2scg7mz8yg8
Para obtener la información detallada del webservice, ejecuta el siguiente comando:
docker service ps webservice
Deberías ver la siguiente salida:
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS eye9zukwwrkq webservice.1 nginx:latest workernode Running Running 3 minutes ago jelyj9gmeb7i webservice.2 nginx:latest masternode Running Running 3 minutes ago
Verificar Docker Swarm
Llegados a este punto, hemos desplegado un contenedor Nginx en los nodos del clúster, incluido el nodo de gestión. Ahora puedes acceder a tu servidor web Nginx utilizando cualquiera de las direcciones IP del nodo trabajador o del nodo gestor:
Conclusión
En la guía anterior, has aprendido a configurar el clúster Docker Swarm en CentOS 8. Ahora puedes añadir cualquier número de nodos trabajadores al clúster Docker Swarm y escalar tu aplicación.