In this guide we will go through the steps on setting up a 3 node Docker Swarm. For more detailed information, and setting up a scalable application have a look at this post
Bootstrap Docker Swarm Setup with Docker Compose on Ubuntu 16.04:
Run the following on all 3 Nodes as the root user:
$ apt-get update && apt-get upgrade -y $ apt-get remove docker docker-engine -y $ apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common python-setuptools -y $ 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 $(lsb_release -cs) stable" $ apt-get update $ apt-get install docker-ce -y $ systemctl enable docker $ systemctl restart docker $ easy_install pip $ pip install docker-compose $ usermod -aG docker <your-user>
Test Docker by running a Test Container
$ docker --version $ docker-compose --version $ docker run hello-world
In this example I do not rely on DNS, and for simplicity, I just added the host entry data into the
/etc/hosts files on each node:
$ cat /etc/hosts 172.31.18.90 manager 172.31.20.94 worker-1 172.31.21.50 worker-2
Initialize the Swarm:
Now we will initialize the swarm on the manager node and as we have more than one network interface, we will specify the
[manager] $ docker swarm init --advertise-addr 172.31.18.90 Swarm initialized: current node (siqyf3yricsvjkzvej00a9b8h) is now a manager. To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-0eith07xkcg93lzftuhjmxaxwfa6mbkjsmjzb3d3sx9cobc2zp-97s6xzdt27y2gk3kpm0cgo6y2 \ 172.31.18.90:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
If this is a scenario where we would like to add more than one manager, we would need to run the above command to add more managers.
Join the Worker nodes to the Manager:
Now, to join the worker nodes to the swarm, we will run the
docker swarm join command that we received in the swarm initialisation step, like below:
[worker-1] $ docker swarm join --token SWMTKN-1-0eith07xkcg93lzftuhjmxaxwfa6mbkjsmjzb3d3sx9cobc2zp-97s6xzdt27y2gk3kpm0cgo6y2 172.31.18.90:2377 This node joined a swarm as a worker.
And to join the second worker to the swarm:
[worker-2] $ docker swarm join --token SWMTKN-1-0eith07xkcg93lzftuhjmxaxwfa6mbkjsmjzb3d3sx9cobc2zp-97s6xzdt27y2gk3kpm0cgo6y2 172.31.18.90:2377 This node joined a swarm as a worker.
To see the node status, so that we can determine if the nodes are active/available etc, from the manager node, list all the nodes in the swarm:
[manager] $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS j14mte3v1jhtbm3pb2qrpgwp6 worker-1 Ready Active siqyf3yricsvjkzvej00a9b8h * master Ready Active Leader srl5yzme5hxnzxal2t1efmwje worker-2 Ready Active
If at any time, you lost your join token, it can be retrieved by running the following for the
$ docker swarm join-token manager -q SWMTKN-1-67chzvi4epx28ii18gizcia8idfar5hokojz660igeavnrltf0-09ijujbnnh4v960b8xel58pmj
And the following to retrieve the
$ docker swarm join-token worker -q SWMTKN-1-67chzvi4epx28ii18gizcia8idfar5hokojz660igeavnrltf0-acs21nn28v17uwhw0oqg5ibwx
At this moment, we will see that we have no services running in our swarm:
[manager] $ docker service ls ID NAME MODE REPLICAS IMAGE
Deploying our First Service:
Let's create a nginx service with 2 replicas, which means that there will be 2 containers of nginx running in our swarm.
If any of these containers fail, they will be spawned again to have the desired number that we set on the replica option:
[manager] $ docker service create --name my-web --publish 8080:80 --replicas 2 nginx
Let's have a look at our nginx service:
[manager] $ docker service ls ID NAME MODE REPLICAS IMAGE 1okycpshfusq my-web replicated 2/2 nginx:latest
After we see that the replica count is
2/2 our service is ready.
For deploying a scalable application on docker swarm have a look at this post