L’issue s’ouvre déjà remplie avec le titre et l’adresse de cette page.
Docker Swarm est le mode d'orchestration natif de Docker. En une seule commande (docker swarm init), vous transformez votre Docker Engine en un cluster capable de distribuer des conteneurs sur plusieurs machines, d'assurer la haute disponibilité et de gérer automatiquement les pannes. Contrairement à Kubernetes qui nécessite une installation séparée, Swarm est intégré à Docker et utilise les mêmes fichiers docker-compose.yml que vous connaissez déjà.
Docker Swarm est un outil d'orchestration de conteneurs intégré nativement à Docker. Il permet de regrouper plusieurs machines Docker (appelées nœuds) en un cluster unique, géré comme une seule entité.
Le choix se joue rarement sur les fonctionnalités : il se joue sur le coût d'entrée. Swarm réutilise le vocabulaire Docker que vous maîtrisez déjà (image, volume, réseau, docker-compose.yml), là où Kubernetes impose un modèle d'objets complet à apprendre avant le premier déploiement. Le tableau ci-dessous résume les écarts qui pèsent le plus dans une décision d'équipe.
La question est légitime tant l'écosystème pousse vers Kubernetes. La réponse est oui : Mirantis, qui maintient Swarm depuis le rachat de Docker Enterprise, en garantit le support jusqu'en 2030, et le projet SwarmKit reste activement développé. Swarm n'est pas un projet mort, mais une brique stabilisée : peu de nouveautés, une maintenance assurée et un vrai créneau pour les petites équipes, le homelab et l'edge, là où la complexité de Kubernetes ne se justifie pas.
Le point de vigilance de 2026 vient de Docker Engine v29, qui introduit des ruptures touchant Swarm en priorité : les plugins de volume V1 (NFS/iSCSI hérités) sont rejetés, et dans un cluster mixte mélangeant v29 et versions antérieures, le trafic overlay chiffré peut s'arrêter silencieusement. La règle est de migrer tous les nœuds en une seule fois. Si vous pilotez Swarm via Portainer, mettez-le à jour vers une version LTS récente avant de basculer en v29.
Un cluster Swarm est composé de deux types de nœuds avec des rôles distincts. Cette séparation détermine tout le reste : qui stocke l'état du cluster, qui accepte vos commandes, qui exécute réellement les conteneurs. Un même serveur peut cumuler les deux rôles, ce qui explique qu'un cluster de test à un seul nœud fonctionne parfaitement. Le schéma ci-dessous montre comment une demande de déploiement descend des managers vers les workers.
Pour fonctionner, un cluster Swarm a besoin d'au moins un nœud manager. Ce manager assure trois fonctions : il décide où placer les conteneurs, maintient l'état du cluster et expose l'API pour recevoir vos commandes. Les nœuds workers sont les exécutants : ils reçoivent les instructions du manager et font tourner les conteneurs.
Concrètement, quand vous tapez docker service create, votre commande arrive sur un manager qui décide sur quel(s) nœud(s) lancer les conteneurs, puis envoie les ordres aux workers concernés.
Type
Rôle
Responsabilités
Manager
Décide et coordonne
Orchestration, planification, API, stockage de l'état (Raft)
Dans Swarm, vous ne déployez pas des conteneurs directement, mais des services :
Service : Définition déclarative avec un état désiré (image, réplicas, ports, ressources). Swarm s'assure que l'état réel correspond toujours à cet état désiré.
Tâche (Task) : Instance d'un service = 1 conteneur. Si vous demandez 3 réplicas, Swarm crée 3 tâches.
Exemple : Un service web avec 3 réplicas crée 3 tâches (web.1, web.2, web.3), chacune étant un conteneur nginx.
Un Service nginx à 3 réplicas crée trois tasks, nginx.1, nginx.2 et nginx.3, une par réplica, chacune planifiée en conteneur nginx sur un worker différent.Service : nginx (replicas: 3)la définitionTasks : unités de travail, une par replicaWorker 1Worker 2Worker 3nginx.1nginx.2nginx.3Conteneur nginxConteneur nginxConteneur nginxcréeplanifieplanifieplanifie
Docker Swarm utilise l'algorithme de consensus Raft pour synchroniser l'état du cluster entre les managers. Un algorithme de consensus garantit que plusieurs machines se mettent d'accord sur une même version de la vérité, même si certaines tombent en panne ou répondent en retard. C'est ce qui permet à Swarm de survivre à la perte d'un manager sans perdre la liste de vos services.
Le quorum est le nombre minimum de managers qui doivent être disponibles pour que le cluster puisse prendre des décisions. C'est une notion fondamentale pour comprendre la haute disponibilité de Swarm.
Prenons un exemple concret : avec 3 managers, le quorum est de 2. Si un manager tombe en panne, les 2 restants peuvent continuer à fonctionner. Mais si 2 managers tombent, le dernier ne peut plus rien décider seul et le cluster devient indisponible pour les opérations d'écriture (création de services, scaling...).
Le calcul est simple : quorum = (N/2) + 1 où N est le nombre de managers.
Managers
Quorum
Pannes tolérées
1
1
0
2
2
0 ⚠️
3
2
1
5
3
2
7
4
3
Glissez pour voir
Notez que 2 managers ne tolèrent aucune panne (quorum = 2, donc les 2 doivent être up). C'est pourquoi Docker recommande 3 managers minimum en production pour avoir une vraie tolérance aux pannes.
L'activation du swarm mode ne demande aucune installation : le binaire est déjà présent dans votre Docker Engine. Une seule commande bascule le moteur en mode cluster, génère l'autorité de certification interne et fait du nœud courant le premier manager. L'opération est réversible avec docker swarm leave --force, qui détruit l'état du cluster local.
Initialiser le cluster
Transformez votre Docker Engine en nœud manager :
Fenêtre de terminal
dockerswarminit
Résultat attendu :
Swarm initialized: current node (abc123) is now a manager.
Si vos nœuds sont sur des machines différentes (ce qui est le cas en production), ils doivent pouvoir communiquer entre eux. Swarm utilise trois ports distincts, chacun avec un rôle précis :
Le port 2377 est le plus important : c'est par là que les managers communiquent entre eux (algorithme Raft) et que vous envoyez vos commandes docker. C'est l'API de gestion du cluster.
Le port 7946 sert aux échanges d'informations entre tous les nœuds (managers et workers). C'est le protocole "gossip" qui permet aux nœuds de se découvrir et de partager leur état.
Le port 4789 transporte le trafic réseau entre vos conteneurs sur différents hôtes. C'est la technologie VXLAN qui crée un réseau virtuel au-dessus de votre réseau physique.
Le service est l'unité de travail de Swarm : vous ne lancez plus un conteneur, vous déclarez combien d'instances doivent tourner et sur quelle image. Swarm compare en permanence cet état désiré à l'état réel et corrige l'écart, qu'un conteneur ait planté ou qu'un nœud entier soit tombé. Les commandes de cette section (create, ls, scale, ps) forment le socle du travail quotidien sur un cluster.
Swarm propose deux modes de déploiement qui répondent à des besoins différents.
Le mode replicated (par défaut) est celui que vous utiliserez le plus souvent : vous demandez un nombre précis de conteneurs, et Swarm les répartit intelligemment sur les nœuds disponibles. Par exemple, "je veux 5 instances de mon API", Swarm décide sur quels serveurs les placer.
Le mode global est plus spécifique : il lance exactement une instance par nœud du cluster. C'est idéal pour les agents de monitoring comme Prometheus Node Exporter, les collecteurs de logs comme Fluentd, ou tout service qui doit tourner sur chaque machine. Quand un nouveau nœud rejoint le cluster, il reçoit automatiquement sa propre instance.
Docker Swarm utilise le même format de fichier déclaratif que Docker Compose. Vous pouvez réutiliser vos fichiers docker-compose.yml avec quelques adaptations.
Bien que les fichiers soient au même format YAML, certaines directives fonctionnent différemment selon que vous utilisez docker compose up (environnement local) ou docker stack deploy (Swarm).
La différence principale concerne le build : en local, Compose peut construire vos images à la volée depuis un Dockerfile. En Swarm, c'est impossible car les workers n'ont pas accès à votre code source, vous devez utiliser des images déjà construites et poussées dans un registry.
De même, depends_on qui garantit l'ordre de démarrage en local n'a pas de sens dans un cluster distribué où les conteneurs peuvent être sur des machines différentes. Swarm ignore cette directive.
En contrepartie, Swarm ajoute la section deploy qui permet de configurer le nombre de réplicas, les contraintes de placement sur certains nœuds, et les stratégies de mise à jour progressive.
Cette stack à trois services rassemble tout ce qui précède : un frontal nginx répliqué, une API contrainte aux workers et une base PostgreSQL isolée sur un réseau backend. Notez le secret db_password déclaré external: true, ce qui signifie qu'il doit exister avant le déploiement.
La section deploy offre de nombreuses options, regroupées en trois familles : le dimensionnement (replicas), les quotas de ressources (resources) et le comportement en cas de changement ou d'échec (update_config, restart_policy). Ce bloc est ignoré par docker compose up, il ne sert que sous docker stack deploy.
deploy:
# Nombre de conteneurs
replicas: 3
# Limites de ressources
resources:
limits:
cpus: '0.5'
memory: 256M
reservations:
cpus: '0.25'
memory: 128M
# Stratégie de mise à jour
update_config:
parallelism: 2# Conteneurs mis à jour simultanément
Une stack est un groupe de services déployés et gérés ensemble à partir d'un seul fichier YAML. Elle joue pour Swarm le rôle que docker compose up joue sur une machine isolée : une commande, un fichier, un ensemble cohérent de services, réseaux et secrets. Toutes les ressources créées portent le nom de la stack en préfixe, ce qui rend la suppression complète triviale.
Le drapeau -c désigne le fichier de composition et le dernier argument donne le nom de la stack, qui servira de préfixe à toutes les ressources créées.
Fenêtre de terminal
dockerstackdeploy-cstack.ymlma_stack
Sortie :
Creating network ma_stack_frontend
Creating network ma_stack_backend
Creating secret ma_stack_db_password
Creating service ma_stack_web
Creating service ma_stack_api
Creating service ma_stack_db
Les services sont automatiquement préfixés par le nom de la stack (ma_stack_).
Ces quatre commandes suffisent au suivi courant ; retenez que docker stack rm supprime les services, les réseaux et les secrets de la stack, mais jamais les volumes, qui restent sur les nœuds.
Les réseaux overlay permettent aux conteneurs de communiquer à travers plusieurs hôtes comme s'ils étaient sur le même réseau local. Un overlay est un réseau virtuel construit par-dessus votre réseau physique : Swarm encapsule le trafic des conteneurs dans des paquets UDP qui circulent normalement entre vos serveurs. Le résultat est qu'un conteneur peut joindre un autre conteneur par son nom de service, quel que soit le nœud qui l'héberge, sans que vous ayez à toucher au routage de votre infrastructure.
Le sous-réseau est facultatif : sans --subnet, Swarm en choisit un dans sa plage par défaut, au risque d'entrer en conflit avec votre plan d'adressage existant.
Le routing mesh est un load balancer intégré à Swarm. Quand vous publiez un port (-p 80:80) :
Tous les nœuds écoutent sur ce port
Le trafic est automatiquement redirigé vers un conteneur du service
C'est transparent pour le client
Exemple : Avec 3 nœuds et un service web sur le nœud 2, vous pouvez accéder au service depuis n'importe quel nœud (1, 2 ou 3).
Routing mesh : le client joint le port 80 de n'importe quel nœud, et l'ingress redirige vers un conteneur actif, que le nœud en héberge (nœud 2 avec web.2 et web.3) ou non (nœud 3).ClientRouting mesh (ingress)Nœud 1 · 192.168.1.1:80Nœud 2 · 192.168.1.2:80Nœud 3 · 192.168.1.3:80aucun conteneurweb.1web.2web.3:80
Swarm offre deux façons de publier les ports de vos services, avec des comportements très différents.
Le mode ingress (par défaut) active le routing mesh : le port est ouvert sur tous les nœuds du cluster, même ceux qui n'exécutent pas de conteneur pour ce service. C'est pratique car vous pouvez pointer votre load balancer externe vers n'importe quel nœud, et Swarm redirigera le trafic vers un conteneur actif.
Le mode host bind le port uniquement sur les nœuds où le conteneur tourne réellement. C'est utile dans deux cas : quand vous avez besoin de connaître l'IP réelle du client (le routing mesh fait du NAT qui masque l'IP source), ou pour des performances maximales en évitant la couche de routage supplémentaire.
Mode
Description
Cas d'usage
ingress (défaut)
Port publié sur tous les nœuds via routing mesh
Applications web standard
host
Port bindé uniquement sur les nœuds où la tâche tourne
Bypass du mesh, IP client réelle
Glissez pour voir
ports:
- target: 80
published: 80
mode: host# ou ingress (défaut)
Attention avec le mode host : si vous avez 3 réplicas mais seulement 2 nœuds, le 3ème conteneur ne pourra pas démarrer (conflit de port).
Les secrets Docker Swarm stockent des données sensibles (mots de passe, clés d'API, certificats) sans jamais les écrire sur le disque des workers. Ils remplacent les variables d'environnement, qui apparaissent en clair dans docker inspect et dans les journaux. Quatre propriétés distinguent un secret Swarm d'un simple fichier de configuration.
Chiffrés au repos dans le store Raft des managers
Chiffrés en transit via TLS mutuel entre les nœuds
Accessibles uniquement aux services Swarm autorisés (pas aux conteneurs standalone)
Un secret est immuable : pour changer sa valeur, il faut en créer un nouveau puis mettre à jour les services qui l'utilisent. Le tiret final indique à Docker de lire la valeur sur l'entrée standard, ce qui évite de laisser traîner un fichier en clair.
Le drapeau --secret accorde au service l'accès à un secret déjà créé ; un service qui ne le déclare pas ne peut pas le lire, même s'il tourne sur le même nœud.
Fenêtre de terminal
dockerservicecreate\
--nameapi\
--secretdb_password\
mon-api
Dans le conteneur, le secret est disponible dans /run/secrets/db_password.
La forme longue (source, target, mode) sert quand l'application attend le fichier à un emplacement précis ou exige des permissions restreintes. La clé external: true suppose le secret déjà créé à la main, tandis que file: le fait créer par Swarm au moment du déploiement.
Un cluster vit : des machines partent en maintenance, d'autres rejoignent le groupe, un worker devient manager. Toutes ces opérations passent par la commande docker node, exécutable uniquement depuis un manager. Les trois gestes à connaître sont l'inspection, le changement de disponibilité avant une intervention, et le changement de rôle.
Chaque nœud Swarm possède un état de disponibilité qui contrôle s'il peut recevoir des tâches. Comprendre ces trois états est essentiel pour gérer correctement la maintenance de votre cluster.
L'état active est le fonctionnement normal : le nœud accepte de nouvelles tâches et celles qu'il exécute continuent de tourner.
L'état pause est utile pour une maintenance légère : le nœud garde ses tâches existantes mais le scheduler ne lui en assignera plus de nouvelles. C'est pratique si vous voulez empêcher temporairement un nœud de recevoir du travail sans perturber ce qui tourne déjà.
L'état drain est le plus radical : Swarm évacue toutes les tâches du nœud vers d'autres nœuds disponibles. Utilisez-le avant un reboot, une mise à jour système, ou toute opération qui nécessite d'arrêter le nœud.
État
Description
Usage
active
Accepte de nouvelles tâches
Fonctionnement normal
pause
Pas de nouvelles tâches, tâches existantes continuent
La séquence ci-dessous évite toute coupure de service : le passage en drain déclenche la replanification des tâches avant que vous ne touchiez à la machine. Sur un manager, pensez à vérifier que le quorum reste atteint pendant l'opération.
Mettre le nœud en drain
Fenêtre de terminal
dockernodeupdate--availabilitydrainserver1
Swarm replanifie automatiquement les tâches sur d'autres nœuds.
Effectuer la maintenance (reboot, mise à jour Docker, etc.)
Le rôle d'un nœud se change à chaud, sans arrêter les conteneurs qu'il héberge : un worker promu rejoint le groupe Raft et reçoit une copie de l'état du cluster.
Docker Swarm permet des rolling updates contrôlés : au lieu de tout arrêter puis tout relancer, il remplace les tâches par petits lots et observe le résultat entre chaque lot. Si le taux d'échec dépasse le seuil que vous avez fixé, il stoppe la manœuvre ou revient à la version précédente. Cette mécanique se pilote indifféremment depuis le fichier de stack ou depuis la ligne de commande.
Les cinq paramètres qui suivent se lisent ensemble : update_config.parallelism fixe la taille du lot, delay et monitor le temps d'observation, max_failure_ratio le seuil de déclenchement de failure_action. C'est bien update_config.parallelism qui décide combien de tâches basculent à la fois, donc quelle fraction du service est indisponible pendant la manœuvre : à parallelism: 2 sur 10 réplicas, vous ne touchez jamais plus de 20 % du service.
Les mêmes réglages existent en options de docker service update ; changer l'image dans la même commande déclenche immédiatement la mise à jour progressive.
Pour qu'un cluster Swarm soit vraiment résilient en production, quelques règles simples font toute la différence.
La première concerne le nombre de managers : toujours impair (3 ou 5) pour optimiser le quorum. Trois managers tolèrent une panne, cinq en tolèrent deux. Docker ne fixe pas de limite, mais plus vous ajoutez de managers, plus les écritures Raft sont lentes.
Ensuite, répartissez vos managers géographiquement : sur différents racks, différentes zones de disponibilité, voire différents datacenters. Si tous vos managers sont sur le même rack et qu'il prend feu, vous perdez tout.
Côté services, les healthchecks sont indispensables : sans eux, Swarm ne sait pas si votre application fonctionne vraiment. Un conteneur peut tourner mais être planté, le healthcheck permet de le détecter et de le remplacer automatiquement.
Enfin, configurez toujours vos rolling updates avec rollback automatique. Si une nouvelle version de votre application plante, Swarm reviendra automatiquement à la version précédente au lieu de casser tout votre service.
En résumé :
Toujours un nombre impair de managers (3 ou 5 recommandés)
Distribuer les managers sur différentes zones/racks
Limiter le nombre de managers si les performances d'écriture comptent
Utiliser des healthchecks pour détecter les services défaillants
Configurer des rolling updates avec rollback automatique
Monitorer le leader Raft (docker node ls)
Renouveler les tokens périodiquement (ex: tous les 6 mois)
Les contraintes contrôlent où les tâches peuvent s'exécuter. Par défaut, Swarm place les conteneurs sur le nœud le moins chargé, sans se soucier du matériel ni de la localisation. Dès que vos machines ne sont plus interchangeables (disques SSD sur certaines, données réglementées cantonnées à une zone, licence liée à un serveur), il faut lui dire explicitement quels nœuds sont éligibles.
Les contraintes utilisent des attributs des nœuds pour filtrer où vos conteneurs peuvent s'exécuter. Vous pouvez utiliser des attributs intégrés (rôle, hostname, ID) ou créer vos propres labels.
Les labels personnalisés sont particulièrement puissants : vous pouvez par exemple labelliser vos nœuds par zone géographique (zone=europe), par type de stockage (storage=ssd), ou par environnement (env=production). Ensuite, vous contraignez vos services à ne tourner que sur les nœuds correspondants.
La syntaxe utilise les opérateurs == (égal) et != (différent). Vous pouvez combiner plusieurs contraintes, elles doivent toutes être satisfaites pour qu'un nœud soit éligible.
Sans quota, un conteneur qui fuit peut consommer toute la mémoire d'un nœud et faire tomber les services voisins. Swarm distingue deux notions souvent confondues : la réservation, qui sert au calcul de placement, et la limite, qui est appliquée par le noyau via les cgroups. Déclarer les deux est la seule façon d'obtenir à la fois un placement pertinent et un cloisonnement réel.
Les healthchecks permettent à Swarm de vérifier la santé réelle des conteneurs. Sans eux, le seul critère disponible est « le processus principal tourne encore », ce qui laisse passer une application bloquée sur une base de données injoignable ou un serveur qui répond 500 à chaque requête. Un healthcheck est une commande exécutée à intervalle régulier dans le conteneur : son code de retour décide de l'état healthy ou unhealthy. Il se déclare à trois endroits, du plus durable au plus ponctuel.
Le paramètre start_period est celui qui manque le plus souvent : il laisse à l'application le temps de démarrer avant que les échecs ne soient comptabilisés, ce qui évite une boucle de redémarrages sur un service lent à s'initialiser.
La durée de validité par défaut des certificats de nœud est de 90 jours, et le renouvellement est automatique. Elle s'exprime en heures, d'où la valeur 2160h.
Sur Swarm, l'erreur est rarement là où on la cherche : docker ps sur un worker ne montre rien d'utile si la tâche n'a jamais été planifiée. Le réflexe est de partir du service, de descendre vers ses tâches, puis seulement ensuite vers les logs du conteneur. La colonne ERROR de docker service ps porte presque toujours la réponse.
Voici les problèmes que vous rencontrerez le plus souvent avec Swarm, et comment les résoudre.
Quand un service affiche 0/3 réplicas, c'est généralement que l'image n'est pas accessible. Vérifiez d'abord le nom et le tag (nginx:latest vs nginx:1.25), puis assurez-vous que vos workers peuvent accéder au registry (authentification avec docker login si nécessaire).
Une tâche en Pending signifie que Swarm ne trouve pas de nœud capable de l'exécuter. La cause la plus fréquente : vous avez défini des réservations de ressources (--reserve-memory 4G) mais aucun nœud n'a autant de mémoire disponible. Réduisez les réservations ou ajoutez des nœuds plus puissants.
L'état Rejected indique qu'une contrainte de placement n'est pas satisfaite. Par exemple, vous demandez node.labels.zone == europe mais aucun nœud n'a ce label. Utilisez docker node inspect pour voir les labels existants.
Si vous avez perdu le quorum (majorité des managers down), votre cluster ne peut plus accepter de modifications. Essayez d'abord de remettre des managers en ligne. En dernier recours, utilisez --force-new-cluster sur un manager survivant.
Docker Swarm est une solution d'orchestration qui brille par sa simplicité. Si vous savez utiliser Docker et Docker Compose, vous savez déjà utiliser Swarm à 80%.
Les concepts clés à retenir :
Docker Swarm est natif : intégré à Docker, utilise les mêmes fichiers Compose
Managers vs Workers : les managers orchestrent, les workers exécutent
Raft assure la cohérence : toujours un nombre impair de managers (3 ou 5)
Services = état désiré : Swarm maintient automatiquement le nombre de réplicas
Overlay = communication multi-hôtes : les conteneurs communiquent comme sur un même réseau
Routing mesh : tout nœud peut recevoir le trafic pour n'importe quel service
Secrets chiffrés : jamais en clair, uniquement en mémoire dans le conteneur
Rolling updates : déploiements progressifs avec rollback automatique
Swarm n'est pas aussi riche en fonctionnalités que Kubernetes, mais pour beaucoup de cas d'usage, sa simplicité est un avantage considérable. Commencez par Swarm pour comprendre les concepts d'orchestration, vous pourrez toujours migrer vers Kubernetes plus tard si vos besoins évoluent.
Dix questions tirées de la banque Swarm pour vérifier que les notions de quorum, de service et de routing mesh sont acquises. La note de passage est fixée à 70 %.
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
10 questions
15 min.
70% requis
Informations
Le chronomètre démarre au clic sur Démarrer
Questions à choix multiples, vrai/faux et réponses courtes
Vous pouvez naviguer entre les questions
Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
⏱️--:--
0 / 10
Vérification
(0/0)
--:--
0%
0Correctes
0À revoir
0:00Temps
-Niveau
Score par domaine
Un domaine regroupe plusieurs guides et reçoit plusieurs questions : son score est plus fiable qu'un score par thème, qui porte souvent sur une seule question.
Bilan
Points forts
Aucun sujet réussi à 80 % sur au moins deux questions pour l’instant.
Points faibles
Aucun sujet sous le seuil de réussite.
À faire ensuite
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires