- HX Club
- January 14, 2022
Step By Step Guide to Create Docker Swarm Cluster on Ubuntu 20.04 LTS
Hello, In this blog we are discussing about Docker Swarm. It is a tool used to create a docker hosts cluster. It provides a high availability and high performance cluster where applications are distributed among the hosts. Using docker swarm, we can easily increasing the number of container instance for the same application.
There are some points to create docker swam cluster & manage manager-node & worker-node on Ubuntu:
Prerequisites:
- 2 virtual machine or AWS EC2.[Manager-Node & Worker-Node]
- Ubuntu Host machine with Sudo privileges.
Install Docker on Both machine/Server.
- Update the System.
apt-get update
- Install dependency packages.
apt install apt-transport-https ca-certificates curl software-properties-common
- Add docker key and docker repository to your both servers.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
&&
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
- Update the packages.
apt-get update
- Install docker-ce.
apt install docker-ce
- Start & Enable the Docker.
systemctl start docker
systemctl enable docker
Create Docker Swarm Cluster on Manager Node
- Run the following command on manager node.
Syntax:
docker swarm init --advertise-addr ip-address (ip-addr of manager-node)
For example:
docker swarm init --advertise-addr 15.228.222.25
- Here is the command output.
root@ip-172-31-16-93:/home/ubuntu# docker swarm init --advertise-addr 15.228.222.25
Swarm initialized: current node (ws7wf67jnaquz8rgpwcr96a05) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-5p9pl4jvt2qi2t0h8q48ialtukji5u1uelctzetimqjff0gx76-3ua8kuzk5o9dmtwu815u3cco6 15.228.222.25:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
- Check the status of the Manager Node.
docker node ls
- Here is the command output.
root@ip-172-31-16-93:/home/ubuntu# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ws7cr96a05* ip-172-31-16-93 Ready Active Leader 20.10.12
- Check the status of the Docker Swarm Cluster.
docker info
- Here is the command output.
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Docker Buildx (Docker Inc., v0.7.1-docker)
scan: Docker Scan (Docker Inc., v0.12.0)
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 20.10.12
Storage Driver: overlay2
Backing Filesystem: extfs
...
Cgroup Version: 1
Plugins:
Volume: local
...
Swarm: active
NodeID: ws7cr96a05
Is Manager: true
ClusterID: kod4rin3n750zyrm5wvw6zk3d
Managers: 1
Nodes: 1
Default Address Pool: 10.0.0.0/8
SubnetSize: 24
Data Path Port: 4789
Orchestration:
Task History Retention Limit: 5
....
Autolock Managers: false
Root Rotation In Progress: false
Node Address: 15.228.222.25
Manager Addresses:
15.228.222.25:2377
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
runc version: v1.0.2-0-g52b36a2
....
Add Worker Node to swarm cluster
- Copy the output of the “swarm init” command from manager node, then paste that output on the Worker Node to join the Swarm Cluster.
Syntax:
docker swarm join --token SWMTKN-1-token-number manager-ip-address:2377
For example:
docker swarm join --token SWMTKN-1-5p9pl4jvt2qi2t0h8q48ialtukji5u1uelctzetimqjff0gx76-3ua8kuzk5o9dmtwu815u3cco6 15.228.222.25:2377
- Here is the command output.
root@ip-172-31-42-187:/home/ubuntu# docker swarm join --token SWMTKN-1-5p9pl4jvt2qi2t0h8q48ialtukji5u1uelctzetimqjff0gx76-3ua8kuzk5o9dmtwu815u3cco6 15.228.222.25:2377
This node joined a swarm as a worker.
Go to Manager Node
- Check the Status of Manager node.
docker node ls
- Here is the command output.
root@ip-172-31-16-93:/home/ubuntu# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ws7cr96a05* ip-172-31-16-93 Ready Active Leader 20.10.12
fvwn6upa ip-172-31-42-187 Ready Active 20.10.12
- Now Docker Swarm Cluster is up and running mode.
To Launch web service in Docker Swarm
- On Manager Node,run the following command to deploy a web server (nginx) service.
Syntax:
docker service create --name service-name -p 80:80 image-name
For example:
docker service create --name web-server -p 80:80 nginx:1.13-alpine
- Here is the command output.
root@ip-172-31-16-93:/home/ubuntu# docker service create --name web-server -p 80:80 nginx:1.13-alpine
sgpi9i85s3zyfen2wv8g3h2mu
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
- Check the docker service.
docker service ls
- Here is the command output.
root@ip-172-31-16-93:/home/ubuntu# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
sgpi9i85s3zy web-server replicated 1/1 nginx:1.13-alpine *:80->80/tcp
Replicas and Scaling the service.
- Run the following command to make 2 replicas of the web-server service so that it is accessible on the manager and worker node.
docker service scale web-server=2
- Here is the command output.
root@ip-172-31-16-93:/home/ubuntu# docker service scale web-server=2
web-server scaled to 2
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
- Check the status of web server service.
docker service ps web-server
- Here is the command output.
root@ip-172-31-16-93:/home/ubuntu# docker service ps web-server
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
gwy9o9a web-server.1 nginx:1.13-alpine ip-172-31-16-93 Running Running 5 minutes ago
o884w7m web-server.2 nginx:1.13-alpine ip-172-31-42-187 Running Running 59 seconds ago
- Check the status of running docker services.
docker service ls
- Here is the command output.
root@ip-172-31-16-93:/home/ubuntu# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
sgpi9i85s3zy web-server replicated 2/2 nginx:1.13-alpine *:80->80/tcp
Test the Docker Swarm
- Open Nginx web page using manager & Worker Node Ip-address on Browser.
In Manager-Node.
In Worker-Node.
- Nginx web server service is now distributed across both nodes (Manager & Worker). Docker Swarm also provides high availability for service.
- If the web server goes down on the Worker Node, then the new container will be launched on the Manager Node.
Test High Availability
- To Stop docker on Worker-node.
systemctl stop docker
- Check the status of web server services.
docker service ps web-server
- Here is the command output.
root@ip-172-31-16-93:/home/ubuntu# docker service ps web-server
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
gwy9o9a web-server.1 nginx:1.13-alpine ip-172-31-16-93 Running Running 17 minutes ago
paegey web-server.2 nginx:1.13-alpine ip-172-31-16-93 Running Running 15 seconds ago
o884w7m \_ web-server.2 nginx:1.13-alpine ip-172-31-42-187 Shutdown Running 13 minutes ago