CentOS Stream 10

Docker : Swarm Cluster2025/08/08

 

Configure Docker Swarm to create Docker Cluster with multiple Docker nodes.

On this example, Configure Swarm Cluster with 3 Docker nodes like follows.
There are 2 roles on Swarm Cluster, those are [Manager nodes] and [Worker nodes].
This example shows to set those roles like follows.

 -----------+---------------------------+--------------------------+------------
            |                           |                          |
        eth0|10.0.0.51              eth0|10.0.0.52             eth0|10.0.0.53
 +----------+-----------+   +-----------+----------+   +-----------+----------+
 | [ node01.srv.world ] |   | [ node02.srv.world ] |   | [ node03.srv.world ] |
 |       Manager        |   |        Worker        |   |        Worker        |
 +----------------------+   +----------------------+   +----------------------+

[1]

Install and run Docker service on all nodes, refer to here.

[2] Change settings for Swarm mode on all nodes.
[root@node01 ~]#
vi /etc/docker/daemon.json
# create new
# disable live-restore feature (impossible to use it on Swarm mode)

{
    "live-restore": false
}

[root@node01 ~]#
systemctl restart docker
# if Firewalld is running, allow ports

[root@node01 ~]#
firewall-cmd --add-port={2377/tcp,7946/tcp,7946/udp,4789/udp}

success
[root@node01 ~]#
firewall-cmd --runtime-to-permanent

success
[3] Configure Swarm Cluster on Manager Node.
[root@node01 ~]#
docker swarm init

Swarm initialized: current node (8cnl76g1jmpevxor4v1knup2a) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-22smozwct0vv522319ol4o6bnmxg69s0rnhytu6fv8opdfxx4e-023bu3kolmt0cyvuj65mstk8s 10.0.0.51:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
[4] Join in Swarm Cluster on all Worker Nodes.
It's OK to run the command which was shown when running swarm init on Manager Node.
[root@node02 ~]#
docker swarm join \
--token SWMTKN-1-22smozwct0vv522319ol4o6bnmxg69s0rnhytu6fv8opdfxx4e-023bu3kolmt0cyvuj65mstk8s 10.0.0.51:2377

This node joined a swarm as a worker.
[5] Verify with a command [node ls] that worker nodes could join in Cluster normally.
[root@node01 ~]#
docker node ls

ID                            HOSTNAME           STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
8cnl76g1jmpevxor4v1knup2a *   node01.srv.world   Ready     Active         Leader           28.3.3
qsjc4kbxsu91nnzg7cxn0rswd     node02.srv.world   Ready     Active                          28.3.3
lrxfgh1xkisf98tylqah3sr8r     node03.srv.world   Ready     Active                          28.3.3
[6] Verify Cluster works normally to create a test service.
For example, create a web service containers and configure Swarm service.
Generally, it is used a container image on a rgistry on all Nodes, but on this example, create container images on each Node to verify settings and accesses for Swarm Cluster.
[root@node01 ~]#
vi Dockerfile
FROM quay.io/centos/centos:stream10
LABEL maintainer="ServerWorld <admin@srv.world>"

RUN dnf -y install nginx
RUN echo "Nginx on node01" > /usr/share/nginx/html/index.html

EXPOSE 80
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]

[root@node01 ~]#
docker build -t nginx-server:latest .

[7] Configure service on Manager Node.
After succeeding to configure service, access to the Manager node's Hostname or IP address to verify it works normally. Access requests to worker nodes are load-balanced with round-robin like follows.
[root@node01 ~]#
docker images

REPOSITORY     TAG       IMAGE ID       CREATED              SIZE
nginx-server   latest    d1257cdce634   About a minute ago   346MB

# create a service with 2 replicas

[root@node01 ~]#
docker service create --name swarm_cluster --replicas=2 -p 80:80 nginx-server:latest


.....
.....

overall progress: 2 out of 2 tasks
1/2: running   [==================================================>]
2/2: running   [==================================================>]
verify: Service 0qj89n9gm4mefdzh3he3vinfb converged

# show service list

[root@node01 ~]#
docker service ls

ID             NAME            MODE         REPLICAS   IMAGE                 PORTS
0qj89n9gm4me   swarm_cluster   replicated   2/2        nginx-server:latest   *:80->80/tcp

# inspect the service

[root@node01 ~]#
docker service inspect swarm_cluster --pretty


ID:             0qj89n9gm4mefdzh3he3vinfb
Name:           swarm_cluster
Service Mode:   Replicated
 Replicas:      2
Placement:
UpdateConfig:
 Parallelism:   1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Update order:      stop-first
RollbackConfig:
 Parallelism:   1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Rollback order:    stop-first
ContainerSpec:
 Image:         nginx-server:latest
 Init:          false
Resources:
Endpoint Mode:  vip
Ports:
 PublishedPort = 80
  Protocol = tcp
  TargetPort = 80
  PublishMode = ingress

# show service state

[root@node01 ~]#
docker service ps swarm_cluster

ID             NAME              IMAGE                 NODE               DESIRED STATE   CURRENT STATE           ERROR     PORTS
nw44ht8gfwrw   swarm_cluster.1   nginx-server:latest   node02.srv.world   Running         Running 2 minutes ago
zoyymm8abab2   swarm_cluster.2   nginx-server:latest   node01.srv.world   Running         Running 2 minutes ago

# verify it works normally

[root@node01 ~]#
curl node01.srv.world

Nginx on node02
[root@node01 ~]#
curl node01.srv.world

Nginx on node01
[root@node01 ~]#
curl node01.srv.world

Nginx on node02
[root@node01 ~]#
curl node01.srv.world

Nginx on node01
[8] If you'd like to change the number of replicas, configure like follows.
# change replicas to 3

[root@node01 ~]#
docker service scale swarm_cluster=3

swarm_cluster scaled to 3
overall progress: 3 out of 3 tasks
1/3: running   [==================================================>]
2/3: running   [==================================================>]
3/3: running   [==================================================>]
verify: Service swarm_cluster converged

[root@node01 ~]#
docker service ps swarm_cluster

ID             NAME              IMAGE                 NODE               DESIRED STATE   CURRENT STATE            ERROR     PORTS
nw44ht8gfwrw   swarm_cluster.1   nginx-server:latest   node02.srv.world   Running         Running 3 minutes ago
zoyymm8abab2   swarm_cluster.2   nginx-server:latest   node01.srv.world   Running         Running 3 minutes ago
l6h8u3cndvq7   swarm_cluster.3   nginx-server:latest   node03.srv.world   Running         Running 37 seconds ago

# verify accesses

[root@node01 ~]#
curl node01.srv.world

Nginx on node01
[root@node01 ~]#
curl node01.srv.world

Nginx on node03
[root@node01 ~]#
curl node01.srv.world

Nginx on node02
Matched Content