Debian 10 Buster
Sponsored Link

Docker : Configure Swarm Cluster2019/07/24

 
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]
[2] Configure Swarm Cluster on Manager Node.
root@node01:~#
docker swarm init

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

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

    docker swarm join --token SWMTKN-1-19qm6ypn0d25pwisgcsjak9m31mwesutrl9448q7l92oe2izwb-8z3dk7xs19tuc1rxf9a2ix4tu 10.0.0.51:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
[3] 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-19qm6ypn0d25pwisgcsjak9m31mwesutrl9448q7l92oe2izwb-8z3dk7xs19tuc1rxf9a2ix4tu 10.0.0.51:2377

This node joined a swarm as a worker.
[4] 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
al73w42dwnui659iyomjcekds *   node01.srv.world    Ready               Active              Leader              18.09.1
3nvb18sjv4ric46kawvfosx9h     node02.srv.world    Ready               Active                                  18.09.1
zr23tmq3dj938va6lchm88y0f     node03.srv.world    Ready               Active                                  18.09.1
[5] After creating Swarm Cluster, next, configure services that the Swarm Cluster provides.
Create the same container image on all Nodes for the service first.
On this exmaple, create a Container image which provides http service like follows on all Nodes.
root@node01:~#
vi Dockerfile
FROM debian
MAINTAINER ServerWorld <admin@srv.world>

RUN apt-get update
RUN apt-get -y install apache2
RUN echo "node01" > /var/www/html/index.html

EXPOSE 80
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]

root@node01:~#
docker build -t apache2_server:latest ./

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

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
apache2_server      latest              41d978b3ce45        10 seconds ago      243MB
debian              latest              00bf7fdd8baf        2 weeks ago         114MB

# create a service with 2 repricas

root@node01:~#
docker service create --name swarm_cluster --replicas=2 -p 80:80 apache2_server:latest

image apache2_server:latest could not be accessed on a registry to record
its digest. Each node will access apache2_server:latest independently,
possibly leading to different nodes running different
versions of the image.
.....
.....
1/2: running
2/2: running
verify: Service converged

# show service list

root@node01:~#
docker service ls

ID                  NAME                MODE                REPLICAS            IMAGE                   PORTS
tbnpvw5b871p        swarm_cluster       replicated          2/2                 apache2_server:latest   *:80->80/tcp

# inspect the service

root@node01:~#
docker service inspect swarm_cluster --pretty

ID:             tbnpvw5b871puheptpakzcxby
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:         apache2_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
bdjrhe896xye        swarm_cluster.1     apache2_server:latest   node02.srv.world    Running             Running 47 seconds ago
fcq9es71z8zf        swarm_cluster.2     apache2_server:latest   node01.srv.world    Running             Running 47 seconds ago

# verify it works normally

root@node01:~#
curl http://node01.srv.world

node02
root@node01:~#
curl http://node01.srv.world

node01
root@node01:~#
curl http://node01.srv.world

node02
root@node01:~#
curl http://node01.srv.world

node01
[7] If you'd like to change the number of repricas, configure like follows.
# change repricas 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 converged
root@node01:~#
docker service ps swarm_cluster

ID                  NAME                IMAGE                   NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS
bdjrhe896xye        swarm_cluster.1     apache2_server:latest   node02.srv.world    Running             Running about a minute ago
fcq9es71z8zf        swarm_cluster.2     apache2_server:latest   node01.srv.world    Running             Running about a minute ago
xghvm62h2o4x        swarm_cluster.3     apache2_server:latest   node03.srv.world    Running             Running 7 seconds ago

# verify working

root@node01:~#
curl http://node01.srv.world

node03
root@node01:~#
curl http://node01.srv.world

node02
root@node01:~#
curl http://node01.srv.world

node01
Matched Content