Vous êtes sur la page 1sur 26

Docker Swarm

Orchestrateur natif de Docker


Rôle de « Docker Swarm »
• Avec  « Docker Swarm », il va être aisé de distribuer et déployer une
(voire des) application(s) simultanément sur plusieurs hôtes distincts
sur lesquels Docker est installé, regroupés ensemble dans un même
CLUSTER.
• Avantages:
• Load balancing (distribution et répartition de charge)
• Haute disponibilité (si une application tombe, les autres qui sont UP
continuent d’assurer et maintenir le service
Docker Swarm : architecture (1/3)
Docker Swarm : architecture (2/3)
• Pour bénéficier des avantages de « Docker Swarm », nous devons
disposer de plusieurs machines (physique ou virtuelle) sur lesquelles
Docker est installé.
• On devra désigner parmi ces machines, un (ou des) master(s) ou
« swarm manager »
• Les autres machines étant des « workers ».
Remarque : le  master aussi par défaut est un worker. Il a les 2 rôles.
• Les ordres d’exécution seront données par le master aux différents
workers auxquels il est rattaché.
Docker Swarm : architecture (3/3)
Initialisation master et rattachement des workers au cluster

• Pour désigner une machine en tant que « master » : docker swarm init
• Une commande sera fournie à la fin du process d’init du master. Il
faudrait l’exécuter sur les différentes autres machines destinées à
devenir des « workers ». Elles seront ainsi rattachées au master
désigné plus haut.
HELP : docker swarm help
root@docker-master:~# docker swarm help

Usage: docker swarm COMMAND

Manage Swarm

Commands:
ca Display and rotate the root CA
init Initialize a swarm
join Join a swarm as a node and/or manager
join-token Manage join tokens
leave Leave the swarm
unlock Unlock swarm
unlock-key Manage the unlock key
update Update the swarm

Run 'docker swarm COMMAND --help' for more information on a command.


docker service <command>
Usage: docker service COMMAND

Manage services

Commands:
create Create a new service
inspect Display detailed information on one or more services
logs Fetch the logs of a service or task
ls List services
ps List the tasks of one or more services
rm Remove one or more services
rollback Revert changes to a service's configuration
scale Scale one or multiple replicated services
update Update a service

Run 'docker service COMMAND --help' for more information on a command.


Installation d’applications sur les workers
• Exemple : Installation d’une application web avec un réplica de 3 (soit
3 instances à lancer)
docker service create --replicas=3 my-web-service
Dissocier un worker d’un cluster
• Pour détacher un worker d’un master : docker swarm leave
[root@worker-1 ~]# docker swarm leave
Node left the swarm.

• Attention : si jamais vous tentez de lancer cette commande depuis le


master, vous serez avertis (si vous ne disposez que d’un seul master le
fait de le détacher entrainera une perte du cluster)
root@docker-master:~# docker swarm leave
Error response from daemon: You are attempting to leave the swarm on a
node that is participating as a manager. Removing the last manager
erases all current state of the swarm. Use `--force` to ignore this
message.
Exemple de configuration et installation (1/5)
• Nous disposons de 3 VMs Linux :
Exemple de configuration et installation (2/5)
• Initialisation du « swarm manager »

root@docker-master:~# docker swarm init


Swarm initialized: current node (linbp03psxvu1985czw3lqnqq) is now a manager.

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

docker swarm join --token SWMTKN-1-


40yl1rnmevdzc7rzovpcen418an2v8x0cti2ogoi1uolysznmj-2jpypxj70szs70j5sdy3r3r26
192.168.1.61:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow
the instructions.
Exemple de configuration et installation (3/5)
• Rattacher des workers au « swarm manager »

[root@worker-1 ~]# docker swarm join --token SWMTKN-1-


40yl1rnmevdzc7rzovpcen418an2v8x0cti2ogoi1uolysznmj-2jpypxj70szs70j5sdy3r3r26
192.168.1.61:2377
This node joined a swarm as a worker.

[root@worker-2 ~]# docker swarm join --token SWMTKN-1-


40yl1rnmevdzc7rzovpcen418an2v8x0cti2ogoi1uolysznmj-2jpypxj70szs70j5sdy3r3r26
192.168.1.61:2377
This node joined a swarm as a worker.
Exemple de configuration et installation (4/5)
• Vérifier le cluster créé depuis le master :

root@docker-master:~# docker node ls


ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE
VERSION
linbp03psxvu1985czw3lqnqq * docker-master Ready Active Leader 19.03.8
78nk890n4ty5plj2phszic9jh worker-1 Ready Active 19.03.8
xzpuuobbug30d9gjsgi4s77vj worker-2 Ready Active 19.03.8
Exemple de configuration et installation (5/5)
• Création automatique d’un sous-réseau « ingress », de type « overlay » au niveau de
tous les workers (le master y compris):

root@docker-master:~# docker network ls


NETWORK ID NAME DRIVER SCOPE
e74873c456e7 bridge bridge local
508d3b32a6f5 docker_gwbridge bridge local
6cf918a76433 host host local
1rxkgdyxnbxi ingress overlay swarm
171ecd606f77 none null local

[root@worker-1 ~]# docker network ls


NETWORK ID NAME DRIVER SCOPE
88b58ad271c7 bridge bridge local
dd1b2b9c32ff docker_gwbridge bridge local
6833d0017ac3 host host local
1rxkgdyxnbxi ingress overlay swarm
258625eab6f4 none null local
Exemple de déploiement applicatif
• Déploiement d’un serveur « nginx », 2 replicas souhaités :
root@docker-master:~# docker service create -d -p 18080:80 --replicas=2 --name=my-nginx-service nginx
M4ckg2aavltuze6t2aorzfmxe

root@docker-master:~# docker service ls


ID NAME MODE REPLICAS IMAGE PORTS
m4ckg2aavltu my-nginx-service replicated 2/2 nginx:latest *:18080-
>80/tcp

root@docker-master:~# docker service ps my-nginx-service


ID NAME IMAGE NODE DESIRED STATE CURRENT
STATE ERROR PORTS
omxbfq0lhqei my-nginx-service.1 nginx:latest worker-1 Running Running
about a minute ago
twk7ssgckwkj my-nginx-service.2 nginx:latest docker-master Running Running
about a minute ago
Exemple de déploiement applicatif
• Dans l’exemple précédent, on constate que 2 instances du service
nginx ont été lancées. L’une sur le worker « worker-1 » et l’autre sur le
manager même.
[root@worker-1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
85893685eae2 nginx:latest "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes 80/tcp
my-nginx-service.1.omxbfq0lhqeilvjjp40tpkjlz

root@docker-master:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
5286e4c297c6 nginx:latest "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes 80/tcp
my-nginx-service.2.twk7ssgckwkjkd27pq1dpkzk0
Scalabilité (1/3)
• Si jamais votre application a besoin de ressources supplémentaire
(montée en charge), « Docker swarm » peut vous aider en instanciant
de nouveaux containers du service en question :

docker service scale <service_name>=<replicas_desired>


Scalabilité (2/3)
• Si on reprend l’exemple précédent, nous aimerions ajouter une
instance « nginx supplémentaire » :

root@docker-master:~# docker service scale my-nginx-service=3


my-nginx-service scaled to 3
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
Scalabilité (3/3)
• Nous avons bien nos 3 replicas à présent:

root@docker-master:~# docker service ps my-nginx-service


ID NAME IMAGE NODE DESIRED
STATE CURRENT STATE ERROR PORTS
omxbfq0lhqei my-nginx-service.1 nginx:latest worker-1 Running
Running 12 minutes ago
twk7ssgckwkj my-nginx-service.2 nginx:latest docker-master Running
Running 12 minutes ago
s2jr2dgyqrm4 my-nginx-service.3 nginx:latest worker-2 Running
Running about a minute ago
Haute disponibilité (1/2)
• Que se passera-t-il si nous arrêtons l’instance « nginx » sur le
« worker-2» » ?
[root@worker-2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
9e63d73efbb9 nginx:latest "nginx -g 'daemon of…" 3 minutes ago Up 3 minutes 80/tcp
my-nginx-service.3.s2jr2dgyqrm4ncc1l6lpkj2ng
[root@worker-2 ~]# docker stop 9e63d73efbb9
9e63d73efbb9
[root@worker-2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
01c42a1a59b0 nginx:latest "nginx -g 'daemon of…" 34 seconds ago Up 28 seconds 80/tcp
my-nginx-service.3.sro7x8litwyksy6c204ggd9v6
Haute disponibilité (2/4)
• Une nouvelle instance sera relancée automatiquement par le
« Swarm manager » sur le même worker (car UP) puisque nous lui
avions dit que nous voulions un replica de 3 instances « nginx »
root@docker-master:~# docker service ps my-nginx-service
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE
ERROR PORTS
omxbfq0lhqei my-nginx-service.1 nginx:latest worker-1 Running Running 20 minutes
ago
twk7ssgckwkj my-nginx-service.2 nginx:latest docker-master Running Running 20 minutes
ago
sro7x8litwyk my-nginx-service.3 nginx:latest worker-2 Running Running 5 minutes
ago
s2jr2dgyqrm4 \_ my-nginx-service.3 nginx:latest worker-2 Shutdown Complete 5 minutes
ago
Haute disponibilité (3/4)
• Que se passe-t-il si nous perdons un des workers (ex : reboot du
worker-2) ?
root@docker-master:~# docker service ps my-nginx-service
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE
ERROR PORTS
omxbfq0lhqei my-nginx-service.1 nginx:latest worker-1 Running Running 34 minutes
ago
twk7ssgckwkj my-nginx-service.2 nginx:latest docker-master Running Running 33 minutes
ago
nky47woqolom my-nginx-service.3 nginx:latest docker-master Running Running 39 seconds
ago
sro7x8litwyk \_ my-nginx-service.3 nginx:latest worker-2 Shutdown Running 59 seconds
ago
s2jr2dgyqrm4 \_ my-nginx-service.3 nginx:latest worker-2 Shutdown
Haute disponibilité (4/4)
• « Docker Swarm » relance une nouvelle instance « nginx » sur un des
autres workers disponibles en l’occurrence sur le manager dans
l’exemple
root@docker-master:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
de37a4e807bd nginx:latest "nginx -g 'daemon of…" 3 minutes ago Up 3 minutes 80/tcp
my-nginx-service.3.nky47woqolomyjajfo3623jc8
5286e4c297c6 nginx:latest "nginx -g 'daemon of…" 36 minutes ago Up 36 minutes 80/tcp
my-nginx-service.2.twk7ssgckwkjkd27pq1dpkzk0
Détail sur un service

•Pour voir le descriptif complet d’un service :


docker service inspect <service_name>
root@docker-master:~# docker service inspect my-nginx-service
[
{
"ID": "m4ckg2aavltuze6t2aorzfmxe",
"Version": {
"Index": 31
},
"CreatedAt": "2020-04-17T06:56:26.035215128Z",
"UpdatedAt": "2020-04-17T07:08:14.12742664Z",
Stopper un service
• Pour stopper un service (=application(s)):
docker service rm <service_name>

Vous aimerez peut-être aussi