DEV Community

nithinalias
nithinalias

Posted on • Edited on

Docker Swarm services

Docker Swarm Commands

docker swarm init --advertise-addr <ip-addr>
docker service ls
docker service ps <name>
docker service create <name> <image-name>
docker service rm <name>
docker service scale <name>=5
docker swarm leave --force
docker node ls
docker node ps
docker node rm <id>
Enter fullscreen mode Exit fullscreen mode

Create three virtual machines using vagrant(managenode,node1,node2).

# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# This defines the version of vagrant
Vagrant.configure("2") do |config|

MACHINE = ["managenode","node1","node2"]
N = 2

(0..N).each do |i|

  config.vm.define "#{MACHINE[i]}" do |node|
  node.vm.hostname = MACHINE[i]
  node.vm.box = "ubuntu/focal64"
  node.vm.network :private_network, ip: "192.168.33.#{10+i}"

  node.vm.provider "virtualbox" do |vb|
  vb.memory = "1500"
  end

  node.vm.provision "shell", inline: <<-SHELL
     apt update -y
     apt install apt-transport-https ca-certificates -y
     curl software-properties-common
     curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
     add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
     apt-cache policy docker-ce
     apt install docker-ce -y
     SHELL


end
end
end

Enter fullscreen mode Exit fullscreen mode

Login managenode and initialize docker swarm

sudo docker swarm init --advertise-addr <ip-addr of server>
Enter fullscreen mode Exit fullscreen mode

Now you will receive docker swarm join token address.Copy and paste it node1 and node2

docker swarm join --token <join-token> <ipaddr:port number>
Enter fullscreen mode Exit fullscreen mode

Now you can see the created nodes from managenode using the command below.

docker node ls
Enter fullscreen mode Exit fullscreen mode

create an image

Create a dockerfile for Apache webserver and Copy the Index.html

Make a directory
mkdir /test
cd /test
Create a sample web page with name index.html
vim /test/index.html

<!DOCTYPE html>
<html>
<body>

<h1>Hello World</h1>

<p>My Personal website</p>

</body>
</html>
Enter fullscreen mode Exit fullscreen mode

Now create a file dockerfile
vim /test/dockerfile

FROM ubuntu
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update
RUN apt-get install apache2 -y
RUN apt-get install apache2-utils -y
RUN apt-get clean
COPY index.html /var/www/html/
EXPOSE 80
CMD ["apache2ctl","-D","FOREGROUND"]
Enter fullscreen mode Exit fullscreen mode

Next step is to build the docker file by using the docker build command.

sudo docker build -t myapachewebserver .
Enter fullscreen mode Exit fullscreen mode

Create Service

docker service create --name "Apachewebserver" -p 8080:80 myapachewebserver
Enter fullscreen mode Exit fullscreen mode

To list services

docker service ls
Enter fullscreen mode Exit fullscreen mode

To list task of services

docker service ps Apachewebserver
Enter fullscreen mode Exit fullscreen mode

Now you can browse the webserver

http://ipaddress-of-managenode:8080
http://ipaddress-of-node1:8080
http://ipaddress-of-node2:8080

Here if any of the node terminated, the service would disturb in that node.If node1 is down then we wouldnot get the webserver through http://ipaddress-of-node1:8080.

To remove service

docker service rm Apachewebserver
Enter fullscreen mode Exit fullscreen mode

If any of the node terminated, the service wouldnot disturbed if you use "--mode global"

docker service create --name "Apachewebserver" -p 8080:80 --mode global myapachewebserver
Enter fullscreen mode Exit fullscreen mode

If you want to make replica you can use command shown below

docker service rm Apachewebserver

docker service create --name "Apachewebserver" -p 8080:80 --replica 2 myapachewebserver
Enter fullscreen mode Exit fullscreen mode

Here managenode will select the best performing node from the node1 and node2 along with managenode.

Now you can browse the webserver

http://ipaddress-of-managenode:8080
http://ipaddress-of-node1:8080
http://ipaddress-of-node2:8080

you can check the services by using the command shown below

docker node ps
docker service ps Apachewebserver
docker service ls
Enter fullscreen mode Exit fullscreen mode

you can check whether the containers present or not by using the command shown below

docker ps
Enter fullscreen mode Exit fullscreen mode

So here we could see the Apachewebserver container only in managenode and any one of the nodes(node1 and node2).

Scaling

You can scale the service by using the command shown below.

docker service scale Apachewebserver=5
docker service ps Apachewebserver
Enter fullscreen mode Exit fullscreen mode

you could see 5 copies of Apachewebserver.Managenode will disrtibute the service according to the best performing nodes like managenode,2 node1 and 2 node2.

If you want to drain the service you can use the command below.

docker node update --availability drain managenode
docker service ps Apachewebserver
docker node ls
Enter fullscreen mode Exit fullscreen mode

Now your managenode availability got drained and an additional node will be created.Now managenode has no power to scale up and down the services.Use the below command to retain the power of managenode.

docker node update --availability active managenode
Enter fullscreen mode Exit fullscreen mode

Docker Swarm Service using overlay network demo

First remove the service

docker service rm Apachewebserver
Enter fullscreen mode Exit fullscreen mode

create an apache service

docker service create --name Apache2 --mode global -d -p 8003:80 httpd

docker service ls
docker service ps Apache2
Enter fullscreen mode Exit fullscreen mode

Now you can browse the webserver

http://ipaddress-of-managenode:8003
http://ipaddress-of-node1:8003
http://ipaddress-of-node2:8003

Create a overlay network

docker network create -d overlay myoverlay1
Enter fullscreen mode Exit fullscreen mode

Lets create a web application using php and mysql.we can pull a sample application from hshar/webapp and create a service out of it.

docker service create --name webapp1 -d --network myoverlay1 -p 8001:80 hshar/webapp

docker service ls
docker service ps Apache2
Enter fullscreen mode Exit fullscreen mode

create a service for mysql

docker service create --name mysql -d --network myoverlay1 -p 3306:3306 hshar/mysql:5.5

docker service ls
docker service ps mysql
Enter fullscreen mode Exit fullscreen mode

Managenode will distribute the webapp1 and myql in different nodes
as part of load balancing.

Login to the node that containing webapp1 and enter into container to modify the webapp1.

docker ps
docker exec -it <containerID> bash
nano /var/www/html/index.php

<html>
<head>
<title>Docker Sample App</title>

<?php
if($_SERVER['REQUEST_METHOD'] == "POST")
{
$servername = "mysql";
$username = "root";
$password = "edureka";
$dbname = "docker";
$name=$_POST["name"];
$phone=$_POST["phone"];

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$sql = "INSERT INTO emp (name, phone)
VALUES ('".$name."', '".$phone."')";

if ($conn->query($sql) === TRUE) {
    echo "New record created successfully";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

$conn->close();
}
?>
</head>
<body>
        <form action="index.php" method="POST">
                <input type="text" name="name">
                <input type="text" name="phone">
                <input type="submit" name="submit">
        </form>
</body>
</html>

exit
Enter fullscreen mode Exit fullscreen mode

Login to the node that containing mysql and enter into container to modify the mysql.

docker ps
docker exec -it <containerID> bash

echo $MYSQL_ROOT_PASSWORD
mysql -u root -pedureka
CREATE DATABASE docker;
USE docker;
CREATE TABLE emp(name VARCHAR(15),phone VARCHAR(12));
exit

exit
Enter fullscreen mode Exit fullscreen mode

Now you can browse the webserver

http://ipaddress-of-managenode:8001
http://ipaddress-of-node1:8001
http://ipaddress-of-node2:8001

Add the name and phone.Now you can see the name and phone in table "emp" of database "docker" in mysql.

docker exec -it <containerID> bash

mysql -u root -pedureka
USE docker;
show tables;
select * from emp;
exit

exit

Enter fullscreen mode Exit fullscreen mode

To leave node from docker swarm

docker swarm leave
Enter fullscreen mode Exit fullscreen mode

After a node leaves the swarm, you can run the docker node rm command on a manager node to remove the node from the node list.

docker node rm <nodename>
Enter fullscreen mode Exit fullscreen mode

Top comments (0)