Docker: Swarm Demo 
In this demo I:

a) create 3 CentOS 7 vagrant VMs
b) install docker in each VM
c) create a Docker Swarm (Swarm mode) with one manager and 2 workers
d) create a service with nginx image, update the service to use httpd image and update replicas memory limit

[acool@localhost docker-swarm-demo]$ date
Sat 22 Feb 2020 04:35:36 PM PST
[acool@localhost docker-swarm-demo]$ cat /etc/redhat-release
Fedora release 31 (Thirty One)
[acool@localhost docker-swarm-demo]$ vagrant --version
Vagrant 2.2.6
[acool@localhost docker-swarm-demo]$ tree
.
├── vagrant-box-1
│   └── Vagrantfile
├── vagrant-box-2
│   └── Vagrantfile
└── vagrant-box-3
└── Vagrantfile

3 directories, 3 files
[acool@localhost docker-swarm-demo]$
[acool@localhost docker-swarm-demo]$ cd vagrant-box-1
[acool@localhost vagrant-box-1]$ vagrant up
...
[acool@localhost vagrant-box-1]$ vagrant ssh
[vagrant@box1 ~]$
[vagrant@box1 ~]$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[vagrant@box1 ~]$
[vagrant@box1 ~]$ ip address show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:de:6e:43 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.102/24 brd 192.168.122.255 scope global noprefixroute dynamic eth0
valid_lft 3307sec preferred_lft 3307sec
inet6 fe80::5054:ff:fede:6e43/64 scope link
valid_lft forever preferred_lft forever
[vagrant@box1 ~]$
[vagrant@box1 ~]$
[vagrant@box1 ~]$ sudo yum install docker
...
[vagrant@box1 ~]$ sudo systemctl start docker
[vagrant@box1 ~]$ sudo docker version
Client:
Version: 1.13.1
API version: 1.26
Package version: docker-1.13.1-108.git4ef4b30.el7.centos.x86_64
Go version: go1.10.3
Git commit: 4ef4b30/1.13.1
Built: Tue Jan 21 17:16:25 2020
OS/Arch: linux/amd64

Server:
Version: 1.13.1
API version: 1.26 (minimum version 1.12)
Package version: docker-1.13.1-108.git4ef4b30.el7.centos.x86_64
Go version: go1.10.3
Git commit: 4ef4b30/1.13.1
Built: Tue Jan 21 17:16:25 2020
OS/Arch: linux/amd64
Experimental: false
[vagrant@box1 ~]$
[vagrant@box1 ~]$
[vagrant@box1 ~]$ # disable firewall for the sake of keeping this demo simple
[vagrant@box1 ~]$ sudo systemctl disable firewalld.service
[vagrant@box1 ~]$

[acool@localhost docker-swarm-demo]$ # create box2 and box3 via vagrant

[vagrant@box2 ~]$
[vagrant@box2 ~]$ # install and start docker as previously shown in box1
[vagrant@box2 ~]$ # disable firewall as previously shown in box1
[vagrant@box2 ~]$
[vagrant@box2 ~]$ ip address show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:e1:c4:f9 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.27/24 brd 192.168.122.255 scope global noprefixroute dynamic eth0
valid_lft 3436sec preferred_lft 3436sec
inet6 fe80::5054:ff:fee1:c4f9/64 scope link
valid_lft forever preferred_lft forever
[vagrant@box2 ~]$

[vagrant@box3 ~]$
[vagrant@box3 ~]$ # install and start docker as previously shown in box1
[vagrant@box3 ~]$ # disable firewall as previously shown in box1
[vagrant@box3 ~]$
[vagrant@box3 ~]$ ip address show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:18:5a:8c brd ff:ff:ff:ff:ff:ff
inet 192.168.122.88/24 brd 192.168.122.255 scope global noprefixroute dynamic eth0
valid_lft 3323sec preferred_lft 3323sec
inet6 fe80::5054:ff:fe18:5a8c/64 scope link
valid_lft forever preferred_lft forever
[vagrant@box3 ~]$
[vagrant@box3 ~]$
[vagrant@box3 ~]$ # make sure all boxes can ping each other
[vagrant@box3 ~]$ ping -c2 192.168.122.102
PING 192.168.122.102 (192.168.122.102) 56(84) bytes of data.
64 bytes from 192.168.122.102: icmp_seq=1 ttl=64 time=0.562 ms
64 bytes from 192.168.122.102: icmp_seq=2 ttl=64 time=0.619 ms

--- 192.168.122.102 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.562/0.590/0.619/0.037 ms
[vagrant@box3 ~]$
[vagrant@box3 ~]$
[vagrant@box3 ~]$ ping -c2 192.168.122.27
PING 192.168.122.27 (192.168.122.27) 56(84) bytes of data.
64 bytes from 192.168.122.27: icmp_seq=1 ttl=64 time=0.457 ms
64 bytes from 192.168.122.27: icmp_seq=2 ttl=64 time=0.312 ms

--- 192.168.122.27 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.312/0.384/0.457/0.075 ms
[vagrant@box3 ~]$



The gist of this demo:

[vagrant@box1 ~]$
[vagrant@box1 ~]$
[vagrant@box1 ~]$ sudo docker swarm init --advertise-addr 192.168.122.102
Swarm initialized: current node (325hn4zrumoinjslhiw3p9c1j) is now a manager.

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

docker swarm join \
--token SWMTKN-1-1qm592qpo4j2ka5nxqx98vizi6z9dtag4rou49zxvrr7rww72g-agsgzbalcyw0c7saupqvk90sl \
192.168.122.102:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

[vagrant@box1 ~]$
[vagrant@box1 ~]$
[vagrant@box1 ~]$


[vagrant@box2 ~]$
[vagrant@box2 ~]$
[vagrant@box2 ~]$ sudo docker swarm join \
> --token SWMTKN-1-1qm592qpo4j2ka5nxqx98vizi6z9dtag4rou49zxvrr7rww72g-agsgzbalcyw0c7saupqvk90sl \
> 192.168.122.102:2377
This node joined a swarm as a worker.
[vagrant@box2 ~]$
[vagrant@box2 ~]$


[vagrant@box3 ~]
[vagrant@box3 ~]
[vagrant@box3 ~]$ sudo docker swarm join \
> --token SWMTKN-1-1qm592qpo4j2ka5nxqx98vizi6z9dtag4rou49zxvrr7rww72g-agsgzbalcyw0c7saupqvk90sl \
> 192.168.122.102:2377
This node joined a swarm as a worker.
[vagrant@box3 ~]
[vagrant@box3 ~]


[vagrant@box1 ~]$
[vagrant@box1 ~]$ sudo docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
325hn4zrumoinjslhiw3p9c1j * box1 Ready Active Leader
78uis92n6z7lg2glmsbkzuag0 box3 Ready Active
ehjej7f2ol2svf4nci0k9x4if box2 Ready Active
[vagrant@box1 ~]$
[vagrant@box1 ~]$
[vagrant@box1 ~]$
[vagrant@box1 ~]$ # lets create a service
[vagrant@box1 ~]$ sudo docker service create --replicas 5 -p 80:80 --name web nginx
ytr9c94iieku7akjlp1gsq8mt
[vagrant@box1 ~]$
[vagrant@box1 ~]$ sudo docker service ls
ID NAME MODE REPLICAS IMAGE
ytr9c94iieku web replicated 0/5 nginx:latest
[vagrant@box1 ~]$
[vagrant@box1 ~]$ sudo docker service ps web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
n4n6xun4dlmn web.1 nginx:latest box2 Running Preparing 20 seconds ago
ks1cnh8oko1r web.2 nginx:latest box3 Running Running less than a second ago
lhqha4nd2sj2 web.3 nginx:latest box1 Running Preparing 20 seconds ago
dy48ok6b1clb web.4 nginx:latest box2 Running Preparing 20 seconds ago
81dkfenyjrbz web.5 nginx:latest box3 Running Running less than a second ago
[vagrant@box1 ~]$
[vagrant@box1 ~]$
[vagrant@box1 ~]$ # nginx should be available via any box ip in your browser: http://192.168.122.88/, http://192.168.122.27/ or http://192.168.122.102/
[vagrant@box1 ~]$
[vagrant@box1 ~]$ # we can try curl too
[vagrant@box1 ~]$
[vagrant@box1 ~]$ curl 192.168.122.102
...
[vagrant@box1 ~]$ curl 192.168.122.88
...
[vagrant@box1 ~]$ curl 192.168.122.27
...

[vagrant@box2 ~]$ # lets see how much memory each replica is assigned
[vagrant@box2 ~]$
[vagrant@box2 ~]$ sudo docker stats --no-stream
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
19467a26755f 0.00% 1.402 MiB / 487.1 MiB 0.29% 8.65 kB / 9.52 kB 0 B / 0 B 2
427cf3658a03 0.00% 1.383 MiB / 487.1 MiB 0.28% 4.65 kB / 2.86 kB 1.83 MB / 0 B 2
[vagrant@box2 ~]$
[vagrant@box2 ~]$

[vagrant@box1 ~]$ # lets update each replica memory limit to 250M
[vagrant@box1 ~]$
[vagrant@box1 ~]$ sudo docker service update --limit-memory 250M web
web
[vagrant@box1 ~]$
[vagrant@box1 ~]$


[vagrant@box3 ~]$ # verify memory adjustment
[vagrant@box3 ~]$
[vagrant@box3 ~]$ sudo docker stats --no-stream
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
8990a7fa2489 0.00% 1.375 MiB / 250 MiB 0.55% 2.19 kB / 1.31 kB 0 B / 0 B 2
e6d71ec0caf8 0.00% 1.375 MiB / 250 MiB 0.55% 2.62 kB / 1.31 kB 0 B / 0 B 2
[vagrant@box3 ~]$

[vagrant@box1 ~]$
[vagrant@box1 ~]$ # lets update our service with a different image, we'll try httpd instead of nginx :)
[vagrant@box1 ~]$
[vagrant@box1 ~]$ sudo docker service update --image httpd web
web
[vagrant@box1 ~]$
[vagrant@box1 ~]$
[vagrant@box1 ~]$ sudo docker service ps web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
opf7ks9q5rj4 web.1 httpd:latest box2 Running Starting less than a second ago
sbbs4g9shkzm \_ web.1 nginx:latest box2 Shutdown Shutdown 5 seconds ago
n4n6xun4dlmn \_ web.1 nginx:latest box2 Shutdown Shutdown 3 minutes ago
vvv6018iym4j web.2 nginx:latest box3 Running Running 3 minutes ago
ks1cnh8oko1r \_ web.2 nginx:latest box3 Shutdown Shutdown 3 minutes ago
nl0oddf682d3 web.3 nginx:latest box1 Running Running 3 minutes ago
lhqha4nd2sj2 \_ web.3 nginx:latest box1 Shutdown Shutdown 3 minutes ago
xgcgisnlz5kd web.4 nginx:latest box1 Running Running 3 minutes ago
dy48ok6b1clb \_ web.4 nginx:latest box2 Shutdown Shutdown 3 minutes ago
jw9btp4h734o web.5 nginx:latest box3 Running Running 3 minutes ago
81dkfenyjrbz \_ web.5 nginx:latest box3 Shutdown Shutdown 3 minutes ago
[vagrant@box1 ~]$
[vagrant@box1 ~]$ sudo docker service ls
ID NAME MODE REPLICAS IMAGE
ytr9c94iieku web replicated 5/5 httpd:latest
[vagrant@box1 ~]$
[vagrant@box1 ~]$ # all nodes should render apache httpd welcome message now!
[vagrant@box1 ~]$
[vagrant@box1 ~]$ # lets increase the number of replicas
[vagrant@box1 ~]$ sudo docker service scale web=8
web scaled to 8
[vagrant@box1 ~]$
[vagrant@box1 ~]$ sudo docker service ls
ID NAME MODE REPLICAS IMAGE
ytr9c94iieku web replicated 8/8 httpd:latest
[vagrant@box1 ~]$
[vagrant@box1 ~]$ exit
logout
Connection to 192.168.122.102 closed.
[acool@localhost vagrant-box-1]$
[acool@localhost vagrant-box-1]$
[acool@localhost vagrant-box-1]$


Enjoy!

[ view entry ] ( 751 views )   |  print article

<<First <Back | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | Next> Last>>



2024 By Angel Cool