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.