Introduction à Docker Swarm
Objectifs du chapitre
- Comprendre l'orchestration de conteneurs
- Découvrir Docker Swarm et ses concepts
- Comparer Swarm avec d'autres orchestrateurs
- Comprendre l'architecture Swarm
1 - Qu'est-ce que l'orchestration ?
Le problème
En production, gérer des conteneurs manuellement devient rapidement impossible :
Défis de la production
┌────────────────────────────────────────────────────────────┐
│ │
│ ❓ Comment déployer sur plusieurs serveurs ? │
│ ❓ Comment gérer les pannes de serveurs ? │
│ ❓ Comment mettre à l'échelle automatiquement ? │
│ ❓ Comment router le trafic vers les conteneurs ? │
│ ❓ Comment mettre à jour sans interruption ? │
│ │
└────────────────────────────────────────────────────────────┘
La solution : l'orchestration
Un orchestrateur automatise :
| Fonction | Description |
|---|---|
| Scheduling | Placement des conteneurs sur les nœuds |
| Scaling | Ajustement du nombre de réplicas |
| Networking | Communication entre conteneurs |
| Load Balancing | Distribution du trafic |
| Health Checks | Surveillance et redémarrage |
| Rolling Updates | Mises à jour sans interruption |
2 - Qu'est-ce que Docker Swarm ?
Définition
Docker Swarm est le mode d'orchestration natif de Docker. Il transforme un groupe de Docker hosts en un seul "hôte virtuel".
┌────────────────────────────────────────────────────────────── ───┐
│ Docker Swarm Cluster │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Manager │ │ Manager │ │ Manager │ │
│ │ (Leader) │───│ (Reachable)│───│ (Reachable)│ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │
│ ┌──────┴─────────────────┴─────────────────┴──────┐ │
│ │ Raft Consensus │ │
│ └──────┬─────────────────┬─────────────────┬──────┘ │
│ │ │ │ │
│ ┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐ │
│ │ Worker │ │ Worker │ │ Worker │ │
│ │ Node │ │ Node │ │ Node │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
Caractéristiques principales
| Caractéristique | Description |
|---|---|
| Natif | Intégré à Docker Engine |
| Simple | Pas d'installation supplémentaire |
| Déclaratif | Définir l'état désiré |
| Sécurisé | TLS par défaut |
| Scalable | De 1 à milliers de nœuds |
3 - Concepts fondamentaux
Nœuds (Nodes)
Un nœud est une instance Docker Engine dans le cluster.
Manager Nodes :
- Gèrent l'état du cluster
- Planifient les tâches
- Servent l'API Swarm
- Utilisent le consensus Raft
Worker Nodes :
- Exécutent les conteneurs
- Reçoivent les tâches des managers
- Rapportent l'état des tâches
┌─────────────────────────────────────────────────────────────┐
│ Manager Node │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌──────────────────┐ │
│ │ API Server │ │ Scheduler │ │ Orchestrator │ │
│ └─────────────┘ └─────────────┘ └──────────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ ┌──────────────────┐ │
│ │ Raft │ │ Dispatcher │ │ Worker (opt.) │ │
│ └─────────────┘ └─────────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Worker Node │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────────────────────────────┐ │
│ │ Agent │ │ Container Runtime │ │
│ └─────────────┘ └─────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
Services
Un service est la définition d'une application à exécuter sur le Swarm.
# Créer un service
docker service create --name web --replicas 3 -p 80:80 nginx
Types de services :
| Type | Description | Exemple |
|---|---|---|
| Replicated | N réplicas distribués | Web servers |
| Global | 1 instance par nœud | Monitoring agents |
Tasks
Une task est l'unité de travail dans Swarm = 1 conteneur.
Service "web" (3 replicas)
│
├── Task 1 → Conteneur (Node 1)
├── Task 2 → Conteneur (Node 2)
└── Task 3 → Conteneur (Node 3)
Stacks
Une stack est un groupe de services liés (équivalent Docker Compose pour Swarm).
# stack.yml
version: "3.9"
services:
web:
image: nginx
deploy:
replicas: 3
db:
image: postgres
4 - Swarm vs Kubernetes
Comparaison
| Aspect | Docker Swarm | Kubernetes |
|---|---|---|
| Installation | Intégré | Complexe |
| Courbe d'apprentissage | Douce | Raide |
| Scalabilité | Milliers de nœuds | Très grande échelle |
| Écosystème | Limité | Très riche |
| Auto-healing | Basique | Avancé |
| Configuration | Docker Compose | YAML spécifique |
| Community | Petite | Très large |
Quand utiliser Swarm ?
✅ Utilisez Swarm si :
- Vous connaissez déjà Docker
- Vous avez besoin d'une solution simple
- Votre infrastructure est de taille moyenne
- Vous utilisez déjà Docker Compose
❌ Préférez Kubernetes si :
- Vous avez besoin de fonctionnalités avancées
- Vous gérez de très grandes infrastructures
- Vous avez besoin d'un écosystème riche
- Vous êtes dans un environnement multi-cloud
5 - Architecture détaillée
Composants internes
┌─────────────────────────────────────────────────────────────┐
│ Swarm Manager │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────────────────────────────── ───────────────┐ │
│ │ Cluster Store │ │
│ │ (Distributed State - Raft) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────┼──────────────────┐ │
│ │ │ │ │
│ ┌──────▼──────┐ ┌──────▼──────┐ ┌───────▼─────┐ │
│ │ Orchestrator│ │ Allocator │ │ Scheduler │ │
│ │ (état désiré│ │ (IP, ports) │ │ (placement) │ │
│ │ vs actuel) │ │ │ │ │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │ │
│ ┌───────▼───────┐ │
│ │ Dispatcher │ │
│ │ (assign tasks)│ │
│ └───────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Raft Consensus
Le consensus Raft assure que tous les managers partagent le même état :
┌─────────┐
│ Leader │ ◄── Reçoit les commandes
└────┬────┘
│ Réplique
┌────────┼────────┐
▼ ▼ ▼
┌───────┐ ┌───────┐ ┌───────┐
│Follower│ │Follower│ │Follower│
└───────┘ └───────┘ └───────┘
Quorum = (N/2) + 1 managers
3 managers → quorum = 2
5 managers → quorum = 3
Recommandations pour les managers
| Nombre de managers | Tolérance aux pannes | Recommandation |
|---|---|---|
| 1 | 0 | Développement uniquement |
| 3 | 1 | Production minimale |
| 5 | 2 | Production standard |
| 7 | 3 | Grande production |
Important
Plus de 7 managers n'est pas recommandé car cela ralentit le consensus.
6 - Ports et communication
Ports requis
| Port | Protocole | Usage |
|---|---|---|
| 2377/tcp | TCP | Communication cluster management |
| 7946/tcp+udp | TCP/UDP | Communication entre nœuds |
| 4789/udp | UDP | Trafic réseau overlay |
Configuration firewall
# Sur tous les nœuds
sudo ufw allow 2377/tcp
sudo ufw allow 7946/tcp
sudo ufw allow 7946/udp
sudo ufw allow 4789/udp
7 - Avantages de Docker Swarm
Simplicité
# Initialiser un cluster : 1 commande
docker swarm init
# Rejoindre le cluster : 1 commande
docker swarm join --token <token> <ip>:2377
# Déployer un service : 1 commande
docker service create --name web nginx
Intégration native
- Utilise les mêmes images Docker
- Compatible Docker Compose (avec adaptations)
- Même CLI (
dockeravec sous-commandes) - Mêmes concepts (images, conteneurs, réseaux, volumes)
Sécurité par défaut
- TLS mutuel automatique
- Rotation automatique des certificats
- Chiffrement du trafic control plane
- Gestion native des secrets
Résumé
| Concept | Description |
|---|---|
| Swarm | Mode orchestration natif de Docker |
| Node | Machine dans le cluster (Manager ou Worker) |
| Service | Définition d'une application à déployer |
| Task | Instance de conteneur d'un service |
| Stack | Groupe de services (multi-services) |
Points clés
- Docker Swarm est simple et intégré à Docker
- Les managers gèrent l'état, les workers exécutent les tâches
- Le consensus Raft assure la cohérence entre managers
- Recommandé : 3 ou 5 managers pour la production
Exercices pratiques
- Expliquez la différence entre un manager et un worker
- Pourquoi avoir un nombre impair de managers ?
- Qu'est-ce qu'un service répliqué vs global ?
- Quels ports doivent être ouverts pour Swarm ?