Tout sur Docker Swarm et sur la façon dont il gère et orchestre tous les conteneurs d’un cluster.

Qu’est-ce que Docker Swarm ?

Docker Swarm est un mode de gestion d’un cluster de Docker Engines, d’où le nom Swarm. Le cluster d’hôtes Docker fonctionne en mode essaim, composé de managers et de workers. Les instances de moteurs Docker qui participent à l’essaim sont appelées nœuds.

Un déploiement d’essaim au niveau de la production se compose de nœuds Docker répartis sur plusieurs serveurs.

Pourquoi l’utiliser ? – Orchestration de conteneurs

Lorsque vous travaillez dans un environnement de production, des centaines de conteneurs Docker exécutent plusieurs applications. La gestion de tous ces conteneurs peut être un véritable casse-tête pour tous les ingénieurs DevOps; c’est là que Docker Swarm vous aide. Il gère et orchestre le cluster qui exécute plusieurs conteneurs Docker en toute simplicité.

Vous trouverez ci-dessous quelques-unes de ses fonctionnalités :

  • Haute disponibilité – vise à éviter les temps d’arrêt ou les pannes.
  • Équilibrage de la charge – alloue automatiquement les ressources et les demandes sur d’autres nœuds du cluster si un nœud tombe en panne.
  • Décentralisation – plusieurs nœuds gestionnaires fonctionnent dans un environnement de production ; le cluster n’est donc jamais dépendant d’un seul nœud gestionnaire.
  • Évolutivité – à l’aide d’une seule commande docker swarm, vous pouvez facilement augmenter ou diminuer la taille des conteneurs dans le cluster.

Orchestrez les conteneurs Docker

Maintenant que vous connaissez les bases de Docker Swarm, examinons un exemple de sa mise en œuvre.

Dans cet exemple, j’ai trois machines fonctionnant dans un cluster avec les détails ci-dessous :

manager1 : 192.168.56.104

worker1 : 192.168.56.105

worker2 : 192.168.56.102

Pour initialiser le mode essaim dans Docker, exécutez la commande ci-dessous sur le nœud manager. Le drapeau --advertise-addr est utilisé pour s’annoncer aux nœuds qui peuvent rejoindre le cluster.

geekflare@manager1:~$ docker swarm init --advertise-addr 192.168.56.104

Swarm initialisé : le noeud actuel (lssbyfzuiuh3sye1on63eyixf) est maintenant un manager.

Pour ajouter un travailleur à cet essaim, exécutez la commande suivante :

docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377

Pour ajouter un gestionnaire à cet essaim, exécutez 'docker swarm join-token manager' et suivez les instructions.

La commande ci-dessus génère un jeton qui sera utilisé par d’autres nœuds pour rejoindre ce cluster. Copiez la commande avec le jeton généré et exécutez-la sur les nœuds de travail.

Exécutez le jeton sur le noeud worker1.

geekflare@worker1:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377

Ce nœud a rejoint un essaim en tant que travailleur.

Exécution du jeton sur le noeud worker2.

geekflare@worker2:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377

Ce nœud a rejoint un essaim en tant que travailleur.

Maintenant, sur le nœud manager, vous pouvez vérifier quels nœuds sont en cours d’exécution dans le cluster.

geekflare@manager1:~$ docker node ls

ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION

lssbyfzuiuh3sye1on63eyixf * manager1 Ready Active Leader 18.09.6

utdr3dnngqf1oy1spupy1qlhu worker1 Prêt Actif 18.09.6

xs6jqp95lw4cml1i1npygt3cg worker2 Prêt à l'emploi 18.09.6

Construisons l’image docker geekflare_mongodb que nous avons utilisé dans le tutoriel Dockerfile.

docker build -t geekflare_mongodb .

Exécutez un conteneur de l’image docker MongoDB en créant un service swarm. 27017 est le numéro de port sur lequel MongoDB est exposé.

geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 geekflare_mongodb

l'image geekflare_mongodb:latest n'a pas pu être accédée sur un registre pour enregistrer son digest. Chaque noeud accèdera à l'image geekflare_mongodb:latest de manière indépendante, ce qui peut conduire à ce que différents noeuds exécutent des versions différentes de l'image.

kok58xa4zi05psh3uy6s5x9e6

progrès global : 1 sur 1 tâches

1/1 : courir

verify : Service converged

Vérifiez si le service docker swarm a démarré. MODE replicated signifie que le conteneur a été répliqué sur tous les noeuds du cluster et REPLICAS 1/1 signifie qu’un seul service swarm est en cours d’exécution.

geekflare@manager1:~$ docker service ls

ID NAME MODE REPLICAS IMAGE PORTS

kok58xa4zi05 Mongo-Container replicated 1/1 geekflare_mongodb:latest *:27017->27017/tcp

Vérifions sur quel nœud du cluster ce service unique est exécuté. Il s’exécute sur le noeud manager1.

geekflare@manager1:~$ docker service ps Mongo-Container

ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS

jgqjo92rbq23 Mongo-Container.1 geekflare_mongodb:latest manager1 Running Running Il y a environ une minute

Exécutez la commande docker ps pour obtenir plus de détails sur le conteneur qui exécute ce service swarm.

geekflare@manager1:~$ docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

05d77e7b4850 geekflare_mongodb:latest "/bin/sh -c usr/bin/..." il y a 2 minutes Up 2 minutes 27017/tcp Mongo-Container.1.jgqjo92rbq23sv01hrufdigtx

Vous pouvez également exécuter le service swarm en mode “global” au lieu du mode “répliqué” par défaut. Le mode global exécute une tâche du service d’essaimage sur tous les nœuds du cluster.

Avant d’exécuter le service en mode global, permettez-moi de supprimer le conteneur en cours d’exécution.

geekflare@manager1:~$ docker service rm Mongo-Container

Conteneur Mongo

Démarrez le service swarm à l’intérieur d’un conteneur docker en mode global en utilisant le drapeau –mode.

geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 --mode global geekflare_mongodb

l'image geekflare_mongodb:latest n'a pas pu être accédée sur un registre pour enregistrer son digest. Chaque noeud accèdera à geekflare_mongodb:latest indépendamment, ce qui peut conduire à ce que différents noeuds exécutent différentes versions de l'image.

mfw8dp0zylffppkllkcjl8391

progrès global : 3 tâches sur 3

utdr3dnngqf1 : en cours

lssbyfzuiuh3 : en cours

xs6jqp95lw4c : en cours d'exécution

verify : Service converged

Vérifiez que le service swarm a bien démarré en mode global. Puisque trois noeuds (1 manager, 2 workers) fonctionnent dans le cluster, c’est pourquoi le nombre de réplicas est de 3.

geekflare@manager1:~$ docker service ls

ID NAME MODE REPLICAS IMAGE PORTS

mfw8dp0zylff Mongo-Container global 3/3 geekflare_mongodb:latest *:27017->27017/tcp

3 services sont en cours d’exécution sur 3 nœuds, vérifiez-le en exécutant la commande ci-dessous.

geekflare@manager1:~$ docker service ps Mongo-Container

ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS

zj2blvptkvj6 Mongo-Container.xs6jqp95lw4cml1i1npygt3cg geekflare_mongodb:latest worker2 Running Running Running il y a environ une minute

3eaweijbbutf Mongo-Container.utdr3dnngqf1oy1spupy1qlhu geekflare_mongodb:latest worker1 En cours d'exécution En cours d'exécution Il y a environ une minute

yejg1o2oyab7 Mongo-Container.lssbyfzuiuh3sye1on63eyixf geekflare_mongodb:latest manager1 Running Running about a minute ago

Ensuite, laissez-moi vous montrer comment vous pouvez définir le nombre de répliques. Avant cela, je vais supprimer le conteneur actuel, qui est en cours d’exécution.

geekflare@manager1:~$ docker service rm Mongo-Container

Conteneur Mongo

Utilisez l’option –replicas dans la commande et indiquez le nombre de répliques que vous souhaitez pour le service swarm. Par exemple, je veux avoir deux répliques du service d’essaimage :

geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 --replicas=2 geekflare_mongodb

l'image geekflare_mongodb:latest n'a pas pu être accédée sur un registre pour enregistrer son digest. Chaque noeud accèdera à l'image geekflare_mongodb:latest indépendamment, ce qui peut conduire à l'exécution de versions différentes de l'image par différents noeuds.

4yfl41n7sfak65p6zqwwjq82c

progrès global : 2 sur 2 tâches

1/2 : en cours

2/2 : en cours

verify : Service converged

Vérifiez les services d’essaimage en cours d’exécution. Vous pouvez voir qu’une réplique est en cours d’exécution sur le nœud manager1 et l’autre sur le nœud worker1.

geekflare@manager1:~$ docker service ps Mongo-Container

ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS

xukodj69h79q Mongo-Container.1 geekflare_mongodb:latest worker1 Running Running 9 seconds ago

e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 9 seconds ago

Allez sur le nœud worker1 et vérifiez si le conteneur docker exécute le service swarm.

geekflare@worker1:~$ docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

5042b7f161cb geekflare_mongodb:latest "/bin/sh -c usr/bin/..."   Il y a environ une minute Up Il y a environ une minute 27017/tcp Mongo-Container.1.xukodj69h79q3xf0pouwm7bwv

Pour arrêter ce conteneur, exécutez la commande ci-dessous.

geekflare@worker1:~$ docker stop 5042b7f161cb

5042b7f161cb

Maintenant, à partir du nœud manager1, si vous vérifiez quels nœuds exécutent le service, vous verrez qu’il fonctionne sur le nœud manager1 et le nœud worker2. L’ÉTAT ACTUEL du nœud worker1 est Shutdown (car nous avons arrêté le conteneur qui exécute le service). Mais comme deux répliques de ce service doivent fonctionner, un autre service a été démarré sur le nœud worker 2.

C’est ainsi que vous obtenez une haute disponibilité en utilisant docker swarm.

geekflare@manager1:~$ docker service ps Mongo-Container

ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS

cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running Running 30 seconds ago

xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed il y a 38 secondes "task : non-zero exit (137)"

e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running Il y a 3 minutes

Il est très facile d’augmenter ou de réduire la taille des conteneurs Docker. La commande ci-dessous va augmenter le conteneur Mongo à 5.

geekflare@manager1:~$ docker service scale Mongo-Container=5

Mongo-Container mis à l'échelle à 5

progrès global : 5 sur 5 tâches

1/5 : en cours d'exécution

2/5 : en cours

3/5 : en cours

4/5 : en cours

5/5 : en cours

verify : Service converged

Vérifiez combien de répliques du conteneur Mongo sont en cours d’exécution, il doit y en avoir 5.

geekflare@manager1:~$ docker service ls

ID NAME MODE REPLICAS IMAGE PORTS

4yfl41n7sfak Mongo-Container replicated 5/5 geekflare_mongodb:latest *:27017->27017/tcp

Vérifiez où ces 5 répliques sont exécutées dans le cluster. 1 réplique fonctionne sur le noeud manager1 et 2 répliques sur les deux noeuds de travail.

geekflare@manager1:~$ docker service ps Mongo-Container

ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS

cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 2 minutes ago

xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed il y a 2 minutes "task : non-zero exit (137)"

e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running Il y a 5 minutes

qmp0gqr6ilxi Mongo-Container.3 geekflare_mongodb:latest worker2 Running Running Il y a 47 secondes

9ddrf4tsvnu2 Mongo-Container.4 geekflare_mongodb:latest worker1 En cours d'exécution En cours d'exécution Il y a 46 secondes

e9dhoud30nlk Mongo-Container.5 geekflare_mongodb:latest worker1 En cours d'exécution En cours d'exécution Il y a 44 secondes

Dans votre cluster, si vous ne voulez pas que vos services s’exécutent sur le(s) nœud(s) manager, et que vous voulez le garder uniquement pour gérer les nœuds, vous pouvez drainer le nœud manager.

geekflare@manager1:~$ docker node update --availability drain manager1

manager1

Vérifiez la disponibilité du noeud manager.

geekflare@manager1:~$ docker node ls

ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION

lssbyfzuiuh3sye1on63eyixf * manager1 Ready Drain Leader 18.09.6

utdr3dnngqf1oy1spupy1qlhu worker1 Prêt Actif 18.09.6

xs6jqp95lw4cml1i1npygt3cg worker2 Prêt Actif 18.09.6

Vous verrez que les services ne s’exécutent plus sur le noeud manager ; ils sont répartis sur les noeuds workers du cluster.

geekflare@manager1:~$ docker service ps Mongo-Container

ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS

cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 5 minutes ago

xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed il y a 5 minutes "task : non-zero exit (137)"

qo405dheuutj Mongo-Container.2 geekflare_mongodb:latest worker1 Running Running Il y a 41 secondes

e66zllm0foc8 \_ Mongo-Container.2 geekflare_mongodb:latest manager1 Shutdown Shutdown Il y a 44 secondes

qmp0gqr6ilxi Mongo-Container.3 geekflare_mongodb:latest worker2 Running Running Il y a 3 minutes

9ddrf4tsvnu2 Mongo-Container.4 geekflare_mongodb:latest worker1 Running Running Il y a 3 minutes

e9dhoud30nlk Mongo-Container.5 geekflare_mongodb:latest worker1 En cours d'exécution En cours d'exécution Il y a 3 minutes

Voilà pour ce qui est de Docker Swarm et de l’orchestration des conteneurs en mode Docker Swarm. Essayez-les sur votre environnement de non-production pour vous faire une idée de leur fonctionnement.