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.
-----------+---------------------------+--------------------------+------------
| | |
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] | |
| [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;"] 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 |
| Sponsored Link |
|
|