How to Install and Configure Docker Swarm Mode on CentOS 7.x / RHEL 7.x

Docker Swarm mode is a container’s orchestration and clustering tool for managing Docker host. Docker Swarm mode is the native part of Docker engine. It means you don’t have to install anything except Docker engine because Docker swarm mode is part of Docker engine.

Docker swarm mode is introduced in the Docker 1.12.  Some of the key benefits of Docker swarm mode are container self-healing, load balancing, container scale up and scale down, service discovery and rolling updates. In last couple of articles we have discussed the followings topics

In this article we will walk through how to install and Configure Docker Swarm Mode on CentOS 7.x / RHEL 7.x  For the demonstration i will be using 3 CentOS 7.x or RHEL 7.x Servers on which I will install docker engine. Out of which two servers will act as Docker Engine or Worker node and one will act as a manager. In my case I am using followings:

  • dkmanager.example.com (172.168.10.70 ) – It will act as manager who will manage Docker engine or hosts or worker node and it will work as Docker engine as well.
  •  workernode1.example.com ( 172.168.10.80 ) – it will acts Docker engine or Worker Node
  • workernode2.example.com ( 172.168.10.90 ) – it will acts Docker engine or Worker Node

Update the following lines in /etc/hosts file on all the servers

172.168.10.70    dkmanager.example.com   dkmanager
172.168.10.80    workernode1.example.com         workernode1
172.168.10.90    workernode2.example.com         workernode2

Step:1 Install Docker Engine on all the hosts

First set the docker repository and then run beneath command on all the hosts.

[root@dkmanager ~]# yum install yum-utils –y
[root@dkmanager ~]# yum-config-manager --add-repo https://docs.docker.com/engine/installation/linux/repo_files/centos/docker.repo
[root@dkmanager ~]# yum install docker-engine –y
[root@dkmanager ~]# systemctl start docker
[root@dkmanager ~]# systemctl enable docker

Repeat above steps for workernode1 and workernode2

Note: At the time of writing this article Docker Version 1.13 was available.

Step:2 Open Firewall Ports on Manager and Worker Nodes

Open the following ports in the OS firewall on Docker manager using below  commands

[root@dkmanager ~]# firewall-cmd --permanent --add-port=2376/tcp
success
[root@dkmanager ~]# firewall-cmd --permanent --add-port=2377/tcp
success
[root@dkmanager ~]# firewall-cmd --permanent --add-port=7946/tcp
success
[root@dkmanager ~]# firewall-cmd --permanent --add-port=7946/udp
success
[root@dkmanager ~]# firewall-cmd --permanent --add-port=4789/udp
success
[root@workernode2 ~]# firewall-cmd --permanent --add-port=80/tcp
success
[root@dkmanager ~]# firewall-cmd --reload
success
[root@dkmanager ~]#

Restart the docker service on docker manager

[root@dkmanager ~]# systemctl restart docker

Open the following ports on each worker node and restart the docker service

~]# firewall-cmd --permanent --add-port=2376/tcp
~]# firewall-cmd --permanent  --add-port=7946/tcp
~]# firewall-cmd --permanent --add-port=7946/udp
~]#  firewall-cmd --permanent --add-port=4789/udp
~]# firewall-cmd --permanent --add-port=80/tcp
~]#  firewall-cmd --reload
~]#  systemctl restart docker

Step:3 Initialize the swarm or cluster using ‘docker swarm init’ command

Run the below command from the manager node(dkmanager) to initialize the cluster.

[root@dkmanager ~]# docker swarm init --advertise-addr 172.168.10.70

This command will make our node as a manager node and we are also advertising ip address of manager in above command so that slave or worker node can join the cluster.

docker-swarm-init-command

Run the below command to verify the manager status and to view list of nodes in your cluster

[root@dkmanager ~]# docker node ls
ID                           HOSTNAME               STATUS  AVAILABILITY  MANAGER STATUS

n64oy2sml1w188ps109mai67b *  dkmanager.example.com  Ready   Active        Leader
[root@dkmanager ~]#

We can also use the “docker info” command to verify the status of swarm

docker-info-command-output

Step:3 Add Worker Nodes to swarm or cluster

To add Worker nodes to the swarm or cluster run the command that we get when we initialize the swarm. Sample command is shown in step3

[root@workernode1 ~]# docker swarm join --token SWMTKN-1-4jjyu1btmdky0ou6gl2dwgt24bolpsdn5yd77pohmcnmz0s288-11xwcvzjar29fskkhfvlzsmhr 172.168.10.70:2377
This node joined a swarm as a worker.
[root@workernode1 ~]#

[root@workernode2 ~]# docker swarm join --token SWMTKN-1-4jjyu1btmdky0ou6gl2dwgt24bolpsdn5yd77pohmcnmz0s288-11xwcvzjar29fskkhfvlzsmhr 172.168.10.70:2377
This node joined a swarm as a worker.
[root@workernode2 ~]#

Verify the node status using command “docker node ls” from docker manager

docker-node-ls-command-output

At this point of time our docker swarm mode or cluster is up and running with two worker nodes.  In the next step we will see how to define a service.

Step:4 Launching service in Docker Swarm mode

In Docker swarm mode containers are replaced with word tasks and tasks (or containers) are launched and deployed as service and Let’s assume I want to create a service with the name “webserver” with five containers and want to make sure desired state of containers inside the service is five.

Run below commands from Docker Manager only.

[root@dkmanager ~]# docker service create -p 80:80 --name webserver --replicas 5 httpd
7hqezhyak8jbt8idkkke8wizi
[root@dkmanager ~]#

Above command will create a service with name “webserver”, in which desired state of containers or task is 5 and containers will be launched from docker image “httpd“. Containers will be deployed over the cluster nodes  i.e dkmanager, workernode1 and workernode2

List the Docker service with below command

[root@dkmanager ~]# docker service ls
ID            NAME       MODE        REPLICAS  IMAGE
7hqezhyak8jb  webserver  replicated  5/5       httpd:latest
[root@dkmanager ~]#

Execute the below command to view status of your service “webserver”

[root@dkmanager ~]# docker service ps webserver

docker-service-ps-command-output

As per above output we can see containers are deployed across the cluster nodes including manager node. Now we can access web page from any of worker node and Docker Manager using the following URLs :

http:// 172.168.10.70 or  http://172.168.10.80 or http://172.168.10.90

access-webpage-container

Step:5 Now Test Container Self Healing

Container self healing is the important feature of docker swarm mode. As the name suggest if anything goes wrong with container , manager will make sure at least 5 container must be running for the service “webserver”.  Let’s remove the container from workernode2 and see whether a new container is launched or not.

[root@workernode2 ~]# docker ps
[root@workernode2 ~]# docker rm a9c3d2172670 -f

removing-container-centos7

Now verify the Service from docker manager and see whether a new container is launched or not

[root@dkmanager ~]# docker service ps webserver

Docker-selfhealing-feature

As per above output we can see a new container is launched on dkmanager node because one of the container on workernode2 is removed

Step:6 Scale up and Scale down containers associated to a Service

In Docker swarm mode we can scale up and scale down containers or tasks. Let’s scale up the containers to 7 for the service ‘webserver

[root@dkmanager ~]# docker service scale webserver=7
webserver scaled to 7
[root@dkmanager ~]#

Verify the Service status again with following commands

service-scaleup-docker-swarm

Let’s Scale down container to 4 for the service webserver

[root@dkmanager ~]# docker service scale webserver=4
webserver scaled to 4
[root@dkmanager ~]#

Verify the Service again with beneath commands

service-scaledown-docker-swarm

That’s all for this article. Hope you got an idea how to install and configure docker swarm mode on CentOS 7.x and RHEL 7.x. Please don’t hesitate to share your feedback and comments 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *