Aller au contenu

Docker Swarm

Mise à jour :

logo docker-compose

Docker Swarm est un outil d’orchesration de conteneurs conçu pour simplifier et optimiser le déploiement et la gestion d’applications à grande échelle. Docker Swarm permet de regrouper plusieurs hôtes Docker, appelés “nœuds”, en un seul cluster. Cette capacité de regroupement facilite grandement la coordination et la distribution des tâches entre les différents nœuds.

Pourquoi Utiliser Docker Swarm ?

Dans le domaine de la gestion des conteneurs, Docker Swarm se distingue par plusieurs atouts clés qui en font un choix privilégié pour certaines enreprises. Ce chapitre explore pourquoi Docker Swarm est un outil incontournable pour les débutants cherchant à déployer et gérer des applications conteneurisées.

Facilité d’utilisation et Intégration Native avec Docker : Docker Swarm est conçu pour s’intégrer parfaitement avec l’écosystème Docker, offrant une expérience utilisateur cohérente et familière. Cette intégration signifie que les utilisateurs de Docker trouveront en Docker Swarm un environnement naturel, avec des commandes et des interfaces qu’ils connaissent déjà. Cette familiarité réduit la courbe d’apprentissage et facilite l’adoption de la technologie.

Haute Disponibilité et Mise à l’Échelle Automatique : L’un des principaux avantages de Docker Swarm est sa capacité à assurer une haute disponibilité des applications. En répartissant les conteneurs sur différents nœuds, Docker Swarm garantit que si un nœud tombe en panne, les conteneurs qu’il héberge peuvent être rapidement redéployés sur d’autres nœuds. De plus, la mise à l’échelle automatique permet aux applications de répondre dynamiquement à des charges de travail fluctuantes, ce qui est important pour maintenir des performances optimales.

Répartition de Charge et Tolérance aux Pannes : Docker Swarm offre des fonctionnalités avancées de répartition de charge, distribuant intelligemment les requêtes entrantes entre les conteneurs pour équilibrer la charge et optimiser l’utilisation des ressources. Cette répartition assure une meilleure performance et une réponse plus rapide des applications. En outre, la tolérance aux pannes intégrée dans Docker Swarm aide à maintenir les applications en ligne même en cas de défaillance de certains composants, réduisant ainsi les temps d’arrêt et améliorant la fiabilité.

Gestion Simplifiée des Secrets et des Configurations : La gestion des secrets et des configurations est un aspect essentiel de la sécurité et de la gestion des applications. Docker Swarm facilite cette tâche en offrant des outils intégrés pour gérer de manière sécurisée les mots de passe, les clés API, les fichiers de configuration, etc. Cette gestion centralisée des secrets aide à renforcer la sécurité tout en simplifiant le processus de déploiement et de mise à jour des applications.

Architecture de Docker Swarm

L’architecture de Docker Swarm est conçue pour être à la fois robuste et flexible, offrant aux utilisateurs un cadre de travail efficace pour la gestion de conteneurs. Ce chapitre se penche sur les composants clés de cette architecture et explique comment ils s’articulent pour former un système cohérent et performant.

Nœuds Managers et Workers : le Cœur du Swarm : Un cluster Docker Swarm est composé de deux types de nœuds : les managers et les workers. Les nœuds managers sont responsables de la gestion de l’état du cluster, y compris la gestion des tâches, la planification des conteneurs et la prise de décisions clés pour le fonctionnement du cluster. Les nœuds workers, quant à eux, sont chargés d’exécuter les conteneurs et les services définis par les managers. Cette séparation des rôles assure une organisation efficace et une répartition claire des responsabilités au sein du cluster.

Raft Consensus Algorithm : Assurer la Cohérence et la Fiabilité : Docker Swarm utilise l’algorithme de consensus Raft pour maintenir un état cohérent à travers le cluster. Cet algorithme garantit que toutes les modifications apportées à l’état du cluster (comme la création ou la mise à jour de services) sont effectuées de manière sûre et cohérente, même en cas de défaillance de certains nœuds managers. Grâce à Raft, Docker Swarm assure une haute fiabilité et évite les problèmes de divergence d’état qui pourraient autrement perturber le fonctionnement du cluster.

Services et Tâches : Unités de Travail de Swarm : Dans Docker Swarm, les applications sont déployées sous forme de services. Un service définit un état désiré pour l’application, comme le nombre de réplicas de conteneur à exécuter. Chaque instance d’un service est appelée une tâche. Les managers orchestrent la création et la gestion de ces tâches, s’assurant qu’elles s’exécutent selon les spécifications du service. Cette abstraction des applications en services et tâches permet une gestion plus souple et une meilleure scalabilité.

Réseau Overlay et Découverte de Services : Docker Swarm utilise des réseaux overlay pour permettre la communication entre les conteneurs sur différents nœuds. Cela permet aux conteneurs de se connecter de manière transparente, comme s’ils étaient sur le même hôte. De plus, la découverte de services intégrée simplifie la communication entre les différents services, permettant aux conteneurs de se localiser et de communiquer entre eux sans configuration complexe.

Stockage et Volumes dans Swarm : La gestion du stockage est un aspect essentiel de Docker Swarm. Les volumes peuvent être utilisés pour persister les données au-delà du cycle de vie des conteneurs individuels. Docker Swarm permet de définir des stratégies pour le montage de ces volumes sur les conteneurs, assurant ainsi la disponibilité des données là où elles sont nécessaires.

Prérequis pour Docker Swarm

Avant de commencer à configurer Docker Swarm, il est important de s’assurer que certains prérequis sont remplis. Cette étape est fondamentale pour garantir le bon fonctionnement et la sécurité de votre cluster Docker Swarm.

Installation de Docker

Le premier prérequis est, naturellement, l’installation de Docker. Assurez-vous que Docker est installé sur toutes les machines qui feront partie de votre cluster Docker Swarm. Docker doit être à jour pour éviter les problèmes de compatibilité. Pour vérifier si Docker est installé et connaître sa version, utilisez la commande :

Terminal window
docker --version

Configuration du Réseau

Dans cette documentation je n’utiliserais qu’un seul noeud. Par contre si vous souhaitez le faire sur plusieurs, Docker Swarm nécessite que les machines soient en mesure de communiquer entre elles. Il est donc important de configurer correctement le réseau. Assurez-vous que les ports nécessaires sont ouverts et accessibles. Par exemple, le port TCP 2377 est utilisé pour la communication entre les nœuds managers et les ports TCP/UDP 7946 ainsi que le port UDP 4789 sont utilisés pour la communication entre les nœuds.

Bien sûr, voici le chapitre 3 rédigé selon vos consignes, en se concentrant sur la configuration d’un seul nœud dans Docker Swarm :

Initialisation d’un Cluster Docker Swarm sur un Seul Nœud

L’initialisation d’un cluster Docker Swarm, même sur un seul nœud, est un processus simple mais essentiel. Cela permet de mettre en place l’infrastructure nécessaire pour orchestrer vos conteneurs. Suivons les étapes pour initialiser un cluster Docker Swarm sur un unique nœud.

Pour initialiser le mode Swarm, utilisez la commande suivante :

Terminal window
docker swarm init
Swarm initialized: current node (gxjcih2gwrxjs8w3nym3awsij) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-3xqq5w9tx20sojtag0vweq4snsldrz6yed8c27408hh5odz2sy-5oksdnnuxqjk4c8se47p8iqbv 192.168.121.47:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

Cette commande transforme votre Docker en un nœud manager de Docker Swarm. Elle configure également le nœud pour qu’il puisse gérer les déploiements et orchestrer les conteneurs.

Même si vous utilisez un seul nœud, il est utile de noter le token de worker. Ce token sera nécessaire si vous décidez d’ajouter des nœuds workers à l’avenir. Pour récupérer le token, utilisez :

Terminal window
docker swarm join-token worker

Gardez ce token en lieu sûr, car il sera requis pour ajouter des nœuds workers à votre cluster.

Après l’initialisation, il est important de vérifier que tout fonctionne correctement. Utilisez la commande suivante pour voir l’état de votre cluster Swarm :

Terminal window
docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
gxjcih2gwrxjs8w3nym3awsij * ubuntu2204.localdomain Ready Active Leader 24.0.7

Cette commande affiche la liste des nœuds dans le cluster et indique si votre nœud est actif et prêt à orchestrer des conteneurs.

Comprendre les Fichiers Stack.yaml et Leurs Différences avec Docker Compose

Lorsque vous travaillez avec Docker Swarm, les fichiers stack.yaml jouent un rôle central. Ces fichiers ressemblent beaucoup aux fichiers docker-compose.yml utilisés dans Docker Compose, mais il y a des différences clés à comprendre.

Tout d’abord, examinons les similitudes. Les deux formats de fichiers sont écrits en YAML et servent à définir des services, des réseaux et des volumes dans un environnement Docker. Vous pouvez spécifier des configurations de conteneurs, des variables d’environnement, des ports, etc., dans les deux types de fichiers.

Gestion d’Orchestration : La principale différence réside dans leur utilisation. Docker Compose est principalement utilisé pour définir et exécuter des applications multi-conteneurs sur un seul hôte. Il est idéal pour le développement, les tests et les environnements de production de petite taille. En revanche, les fichiers stack.yaml sont utilisés avec Docker Swarm, qui est conçu pour l’orchestration de conteneurs sur plusieurs hôtes, offrant une haute disponibilité et une meilleure montée en charge.

Dans Docker Swarm, les fichiers stack.yaml peuvent inclure des spécificités qui ne sont pas présentes ou nécessaires dans Docker Compose. Par exemple, dans Swarm, vous pouvez spécifier des paramètres de déploiement pour vos services, tels que le nombre de réplicas, les contraintes de déploiement sur certains nœuds, ou les politiques de mise à jour.

Exemple de Spécification de Déploiement :

services:
mon_service:
image: mon_image
deploy:
replicas: 5
update_config:
parallelism: 2
delay: 10s

Dans cet exemple, le service mon_service est configuré pour avoir 5 réplicas, avec une politique de mise à jour spécifiant comment les mises à jour doivent être déployées.

Un point important est que les fichiers docker-compose.yml peuvent souvent être utilisés directement ou avec peu de modifications dans Docker Swarm. Cependant, pour tirer pleinement parti des fonctionnalités avancées de Swarm, il est recommandé d’adapter et d’optimiser les fichiers pour ce dernier.

Création de Votre Premier Fichier Stack.yaml

La création d’un fichier stack.yaml est une étape essentielle pour déployer des services sur Docker Swarm. Ce fichier définit les spécifications de votre application dans un format compréhensible par Docker. Abordons étape par étape comment créer ce fichier.

Définir les services : La première section de votre fichier doit décrire les services. Un service dans Docker Swarm est une définition d’une tâche à exécuter sur un conteneur. Par exemple, si votre application nécessite un serveur web et une base de données, vous définirez deux services.

services:
web:
image: nginx
ports:
- "80:80"
db:
image: postgres
environment:
POSTGRES_PASSWORD: mon_mot_de_passe

Dans cet exemple, deux services sont définis : web utilisant l’image nginx et db utilisant l’image postgres. La section ports sous web indique que le port 80 du conteneur sera mappé sur le port 80 de l’hôte.

Les réseaux permettent de connecter vos services entre eux. Dans Docker Swarm, vous pouvez définir des réseaux pour isoler la communication entre les services.

networks:
mon_reseau:

Ce simple exemple crée un réseau nommé mon_reseau.

Les volumes sont utilisés pour stocker et gérer les données. Ils sont particulièrement importants pour les bases de données ou pour conserver des données spécifiques en dehors des conteneurs.

volumes:
db_data:

Ici, db_data est un volume qui pourrait être utilisé par le service de base de données pour stocker les données de manière persistante.

Déploiement de la Stack sur Docker Swarm

Après avoir créé et configuré votre fichier stack.yaml, l’étape suivante consiste à déployer la stack sur Docker Swarm. Ce processus implique la mise en place de vos services, réseaux et volumes définis dans le fichier stack.yaml sur le cluster Swarm. Suivons les étapes pour un déploiement réussi.

Pour déployer votre stack, utilisez la commande docker stack deploy. Cette commande prend en charge la création et la mise à jour des services dans votre stack. Assurez-vous d’être connecté au nœud manager de votre Swarm pour exécuter cette commande. Voici comment déployer une stack nommée ma_stack :

Terminal window
docker stack deploy -c stack.yaml ma_stack
Creating network ma_stack_default
Creating service ma_stack_web
Creating service ma_stack_db

Cette commande indique à Docker de lire la configuration de votre stack depuis le fichier mon_stack.yaml et de déployer les services sous le nom de stack ma_stack.

Après le déploiement, il est important de vérifier que tout fonctionne comme prévu. Vous pouvez voir l’état des services dans votre stack en utilisant :

Terminal window
docker stack services ma_stack
ID NAME MODE REPLICAS IMAGE PORTS
ac93y3421md7 ma_stack_db replicated 1/1 postgres:latest
r83dedfnvufy ma_stack_web replicated 1/1 nginx:latest *:80->80/tcp

Cette commande affiche une liste de tous les services dans votre stack, avec des informations sur leur état, le nombre de réplicas et d’autres détails utiles.

Pour dépanner ou simplement suivre ce qui se passe, vous pouvez consulter les logs de vos services. La commande suivante vous permet de voir les logs d’un service spécifique :

Terminal window
docker logs ma_stack_web.1.t0epe9gh2qo9ytk1cym5vae8a
2023/12/07 12:57:10 [notice] 1#1: using the "epoll" event method
2023/12/07 12:57:10 [notice] 1#1: nginx/1.25.3
2023/12/07 12:57:10 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2023/12/07 12:57:10 [notice] 1#1: OS: Linux 5.15.0-88-generic
2023/12/07 12:57:10 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2023/12/07 12:57:10 [notice] 1#1: start worker processes
2023/12/07 12:57:10 [notice] 1#1: start worker process 29
2023/12/07 12:57:10 [notice] 1#1: start worker process 30
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up

Vous pouvez aussi contrôler que le port 80 réponds bien sur votre machine :

Terminal window
curl http://localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Nickel. Ainsi c’est suffisant pour le besoin de formation. Mais si comptez déployer plusieurs services partageant les mêmes ports il faut faire appel à un reverse proxy comme Traefik.

Si vous apportez des modifications à votre fichier stack.yaml, vous pouvez mettre à jour la stack en exécutant à nouveau la commande docker stack deploy avec le même nom de stack. Docker Swarm mettra à jour les services en fonction des modifications apportées au fichier de configuration.

Terminal window
docker stack deploy -c mon_stack.yaml ma_stack

Cette commande applique les modifications au cluster sans interrompre les services en cours d’exécution.

Gestion et Mise à Jour de Votre Stack

Une fois votre stack déployée sur Docker Swarm, il est essentiel de savoir comment la gérer et la mettre à jour efficacement. Cette gestion inclut la surveillance de l’état des services, l’équilibrage des charges, la mise à jour des configurations et l’assurance de la résilience et de la disponibilité.

La première étape dans la gestion de votre stack est de surveiller régulièrement l’état de vos services. Utilisez la commande suivante pour obtenir un aperçu de l’état des services de votre stack :

Terminal window
docker stack services ma_stack
ID NAME MODE REPLICAS IMAGE PORTS
ac93y3421md7 ma_stack_db replicated 1/1 postgres:latest
r83dedfnvufy ma_stack_web replicated 1/1 nginx:latest *:80->80/tcp

Pour augmenter le nombre de réplicas d’un service dans Docker Swarm, vous utilisez la commande docker service update.

Terminal window
docker service update --replicas=5 ma_stack_web
ma_stack_web
overall progress: 5 out of 5 tasks
1/5: running [==================================================>]
2/5: running [==================================================>]
3/5: running [==================================================>]
4/5: running [==================================================>]
5/5: running [==================================================>]
verify: Service converged

Cette commande ajuste le nombre de réplicas du service ma_stack_web à 5. Docker Swarm s’occupera de lancer les conteneurs supplémentaires pour respecter ce nombre de réplicas.

Après avoir exécuté la commande, vous pouvez vérifier que le nombre de réplicas a été mis à jour avec :

Terminal window
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ac93y3421md7 ma_stack_db replicated 1/1 postgres:latest
r83dedfnvufy ma_stack_web replicated 5/5 nginx:latest *:80->80/tcp

ou pour des détails plus spécifiques :

Terminal window
docker service ps
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
t0epe9gh2qo9 ma_stack_web.1 nginx:latest ubuntu2204.localdomain Running Running 13 minutes ago
z1l90itqonjn ma_stack_web.2 nginx:latest ubuntu2204.localdomain Running Running about a minute ago
dsq0p5jv2lup ma_stack_web.3 nginx:latest ubuntu2204.localdomain Running Running about a minute ago
3g13ha7c3s9h ma_stack_web.4 nginx:latest ubuntu2204.localdomain Running Running about a minute ago
mto8p4ogmsdr ma_stack_web.5 nginx:latest ubuntu2204.localdomain Running Running about a minute ago

Ces commandes afficheront le nombre actuel de réplicas en cours d’exécution pour le service nginx.

Dépannage Commun dans Docker Swarm

Même avec une configuration soigneuse, vous pouvez rencontrer des problèmes lors de l’utilisation de Docker Swarm. Ce chapitre aborde quelques problèmes courants et leurs solutions pour vous aider à résoudre rapidement les difficultés que vous pourriez rencontrer.

Problème 1 : Services qui ne démarrent pas

  • Cause: Cela peut être dû à des problèmes de configuration, à des images manquantes ou à des ressources insuffisantes.

  • Solution: Vérifiez les logs du service pour identifier le problème :

    Terminal window
    docker service logs mon_service

    Assurez-vous que votre fichier stack.yaml soit correct et que les images utilisées sont disponibles. Vérifiez également la disponibilité des ressources système.

Problème 2 : Problèmes de Réseau entre les Conteneurs

  • Cause: Souvent causé par une mauvaise configuration de réseau ou des problèmes de ports.
  • Solution: Vérifiez les configurations de réseau dans votre fichier stack.yaml. Assurez-vous que les ports nécessaires sont ouverts et que les réseaux sont correctement définis et connectés aux services appropriés.

Problème 3 : Échec de l’Équilibrage de Charge

  • Cause: Cela peut survenir si l’équilibrage de charge n’est pas correctement configuré ou si les services ne répondent pas.

  • Solution: Vérifiez la configuration de l’équilibrage de charge et assurez-vous que tous les services fonctionnent comme prévu. Utilisez :

    Terminal window
    docker service ls

    Pour vérifier l’état des services.

Problème 4 : Mise à Jour de Service Échouée

  • Cause: Échecs lors de la mise à jour des services en raison de configurations incorrectes ou de problèmes de compatibilité.

  • Solution: Vérifiez les logs du service pour les erreurs lors de la mise à jour :

    Terminal window
    docker service logs mon_service

    Vous pouvez également revenir à une version précédente du service si nécessaire.

Problème 5 : Nœuds Injoignables ou Défaillants

  • Cause: Des problèmes de réseau, des configurations de sécurité ou des défaillances matérielles peuvent rendre les nœuds injoignables.

  • Solution: Vérifiez la connectivité réseau et les configurations de pare-feu. Utilisez :

    Terminal window
    docker node ls

    Pour vérifier l’état des nœuds. Si un nœud est en panne, vous devrez peut-être le remplacer ou le réparer.

Nettoyage de la Stack dans Docker Swarm

Le nettoyage de votre stack Docker Swarm est une étape importante pour maintenir un environnement ordonné et efficace. Que vous souhaitiez mettre à jour votre stack, la remplacer par une nouvelle configuration, ou simplement la retirer, voici les étapes à suivre pour un nettoyage complet.

Pour supprimer une stack de votre cluster Docker Swarm, utilisez la commande docker stack rm. Par exemple, pour supprimer une stack nommée ma_stack, exécutez :

Terminal window
docker stack rm ma_stack

Cette commande supprime tous les services associés à la stack, mais garde en place les volumes et les réseaux non utilisés.

Après la suppression d’une stack, certains réseaux peuvent rester orphelins. Pour les nettoyer, vous pouvez utiliser la commande docker network prune. Cette commande supprimera tous les réseaux non utilisés :

Terminal window
docker network prune

Assurez-vous de vérifier qu’aucun de ces réseaux n’est utilisé par d’autres services ou stacks avant de les supprimer.

De même, pour nettoyer les volumes orphelins, utilisez docker volume prune :

Terminal window
docker volume prune

Cette commande est particulièrement utile pour libérer de l’espace disque. Toutefois, soyez prudent car elle supprimera tous les volumes non associés à des conteneurs en cours d’exécution.

Au fil du temps, votre système peut accumuler des images Docker inutilisées. Pour les supprimer, utilisez :

Terminal window
docker image prune

Pour un nettoyage plus approfondi, y compris des images utilisées dans des conteneurs arrêtés, utilisez :

Terminal window
docker image prune -a

Enfin, pour supprimer les conteneurs qui ont été arrêtés, vous pouvez utiliser :

Terminal window
docker container prune

Cette commande libère de l’espace en supprimant les conteneurs qui ne sont plus en cours d’utilisation.

En effectuant régulièrement ces opérations de nettoyage, vous maintenez votre environnement Docker Swarm optimisé, ordonné et efficace, en vous assurant que seules les ressources nécessaires sont conservées et utilisées.

Conclusion

Nous avons parcouru ensemble les étapes essentielles pour configurer, gérer et maintenir une stack dans Docker Swarm. De l’initialisation d’un cluster sur un seul nœud à la gestion et au nettoyage de votre environnement, vous avez maintenant une bonne compréhension de la puissance et de la flexibilité offertes par Docker Swarm pour l’orchestration de conteneurs.

Vers de Nouvelles Aventures

Ce guide n’est que le début de votre voyage avec Docker Swarm. Chaque application et environnement est unique et il y aura toujours de nouvelles choses à apprendre et à explorer. Je vous encourage à expérimenter avec Docker Swarm, à tester différentes configurations et à adapter les solutions présentées ici à vos besoins spécifiques.

Docker Swarm offre un cadre robuste et évolutif pour la gestion des conteneurs, et avec les connaissances que vous avez acquises, vous êtes bien équipé pour tirer le meilleur parti de cette puissante plateforme d’orchestration.

Continuez à Explorer

Le monde de l’orchestration de conteneurs est en constante évolution et il y a toujours de nouvelles fonctionnalités, outils et meilleures pratiques à découvrir. Restez curieux, continuez à apprendre et n’hésitez pas à partager vos expériences et connaissances avec la communauté. D’ailleurs j’en profite pour vous indiquer que sur le site https://slash-root.fr vous trouverez plein d’exemples de stacks Docker Swarm.