Installation et création du cluster
Objectifs du chapitre
- Initialiser un cluster Swarm
- Ajouter des nœuds managers et workers
- Gérer les nœuds du cluster
- Configurer Docker Desktop pour Swarm
1 - Prérequis
Configuration requise
| Élément | Minimum | Recommandé |
|---|---|---|
| Docker Engine | 1.12+ | Latest stable |
| RAM par nœud | 2 Go | 4 Go+ |
| CPU par nœud | 1 core | 2+ cores |
| Réseau | 100 Mbps | 1 Gbps |
Ports à ouvrir
# Sur tous les nœuds du cluster
# TCP 2377 : Management du cluster
# TCP/UDP 7946 : Communication entre nœuds
# UDP 4789 : Overlay network
# Avec UFW (Ubuntu)
sudo ufw allow 2377/tcp
sudo ufw allow 7946/tcp
sudo ufw allow 7946/udp
sudo ufw allow 4789/udp
# Avec firewalld (CentOS/RHEL)
sudo firewall-cmd --permanent --add-port=2377/tcp
sudo firewall-cmd --permanent --add-port=7946/tcp
sudo firewall-cmd --permanent --add-port=7946/udp
sudo firewall-cmd --permanent --add-port=4789/udp
sudo firewall-cmd --reload
Vérifier Docker
# Vérifier l'installation Docker
docker --version
docker info
# Vérifier que le mode Swarm est disponible
docker swarm --help
2 - Initialiser le cluster
Sur le premier manager
# Initialisation simple
docker swarm init
# Avec une IP spécifique (recommandé)
docker swarm init --advertise-addr 192.168.1.10
# Avec un port personnalisé
docker swarm init --advertise-addr 192.168.1.10:2377
Sortie de l'initialisation
Swarm initialized: current node (abc123def456) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-xxx-yyy 192.168.1.10:2377
To add a manager to this swarm, run 'docker swarm join-token manager'
and follow the instructions.
Vérifier l'état
# État du Swarm
docker info | grep -A 10 Swarm
# Lister les nœuds
docker node ls
# Résultat
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
abc123def456 * manager1 Ready Active Leader
3 - Ajouter des nœuds
Récupérer les tokens
# Token pour ajouter un worker
docker swarm join-token worker
# Token pour ajouter un manager
docker swarm join-token manager
# Afficher uniquement le token (pour scripts)
docker swarm join-token -q worker
docker swarm join-token -q manager
Ajouter un worker
Sur le serveur worker :
# Rejoindre comme worker
docker swarm join --token SWMTKN-1-xxx-worker 192.168.1.10:2377
# Résultat
This node joined a swarm as a worker.
Ajouter un manager
Sur le serveur manager :
# Rejoindre comme manager
docker swarm join --token SWMTKN-1-xxx-manager 192.168.1.10:2377
# Résultat
This node joined a swarm as a manager.
Vérifier le cluster
# Sur un manager
docker node ls
# Résultat
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
abc123def456 * manager1 Ready Active Leader
ghi789jkl012 manager2 Ready Active Reachable
mno345pqr678 manager3 Ready Active Reachable
stu901vwx234 worker1 Ready Active
yza567bcd890 worker2 Ready Active
4 - Gestion des nœuds
Promouvoir un worker en manager
# Promouvoir
docker node promote worker1
# Équivalent
docker node update --role manager worker1
Rétrograder un manager en worker
# Rétrograder
docker node demote manager3
# Équivalent
docker node update --role worker manager3
Mettre un nœud en maintenance
# Drainer un nœud (les tâches sont déplacées)
docker node update --availability drain worker1
# Mettre en pause (pas de nouvelles tâches)
docker node update --availability pause worker1
# Réactiver
docker node update --availability active worker1
Supprimer un nœud
# Sur le nœud à supprimer
docker swarm leave
# Forcer (si manager ou si problème)
docker swarm leave --force
# Sur un manager : supprimer le nœud de la liste
docker node rm worker1
# Forcer la suppression
docker node rm --force worker1
Inspecter un nœud
# Informations détaillées
docker node inspect worker1
# Format spécifique
docker node inspect --format '{{.Status.Addr}}' worker1
docker node inspect --format '{{.Spec.Role}}' worker1
5 - Labels sur les nœuds
Ajouter des labels
# Ajouter un label
docker node update --label-add env=production worker1
docker node update --label-add zone=eu-west-1 worker1
docker node update --label-add type=gpu worker2
# Plusieurs labels
docker node update \
--label-add env=production \
--label-add tier=frontend \
worker1
Voir les labels
# Voir les labels d'un nœud
docker node inspect --format '{{.Spec.Labels}}' worker1
# Format plus lisible
docker node inspect worker1 --format '{{json .Spec.Labels}}' | jq
Utiliser les labels pour le placement
# Déployer uniquement sur les nœuds de production
docker service create \
--name web \
--constraint 'node.labels.env==production' \
nginx
# Déployer sur les nœuds GPU
docker service create \
--name ml-model \
--constraint 'node.labels.type==gpu' \
tensorflow/tensorflow
6 - Sécurité du cluster
Rotation des tokens
# Changer le token worker
docker swarm join-token --rotate worker
# Changer le token manager
docker swarm join-token --rotate manager
Rotation des certificats
# Forcer la rotation des certificats
docker swarm ca --rotate
# Définir la période de rotation (90 jours par défaut)
docker swarm update --cert-expiry 720h
Verrouiller le cluster (autolock)
# Activer l'autolock
docker swarm update --autolock=true
# Sauvegarder la clé de déverrouillage !
# To unlock a swarm manager after it restarts, run:
# docker swarm unlock
# Déverrouiller après un redémarrage
docker swarm unlock
# Voir la clé actuelle
docker swarm unlock-key
# Changer la clé
docker swarm unlock-key --rotate
7 - Configuration avec Docker Desktop
Windows/macOS
Docker Desktop inclut un Swarm single-node :
# Initialiser Swarm (single-node)
docker swarm init
# C'est tout ! Vous pouvez utiliser les services
docker service create --name web -p 80:80 nginx
Swarm multi-nœuds avec Docker Machine (legacy)
# Créer des machines virtuelles
docker-machine create manager1
docker-machine create worker1
docker-machine create worker2
# Se connecter au manager
eval $(docker-machine env manager1)
# Initialiser le swarm
docker swarm init --advertise-addr $(docker-machine ip manager1)
Alternative : Multipass ou Vagrant
# Avec Multipass (Ubuntu)
multipass launch --name manager1
multipass launch --name worker1
multipass launch --name worker2
# Installer Docker sur chaque VM
multipass exec manager1 -- bash -c "curl -fsSL https://get.docker.com | sh"
8 - Play with Docker (apprentissage)
Environnement gratuit en ligne
Visitez labs.play-with-docker.com pour un environnement Swarm gratuit :
# Créer 3 instances (bouton "Add new instance")
# Sur la première instance :
docker swarm init --advertise-addr eth0
# Copier la commande join et l'exécuter sur les autres instances
9 - Haute disponibilité des managers
Architecture recommandée
Production Setup
┌────────────────────────────────────────────────────┐
│ │
│ Manager 1 Manager 2 Manager 3 │
│ (Leader) (Reachable) (Reachable) │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ Raft │◄───────▶│ Raft │◄───────▶│ Raft │ │
│ └──────┘ └──────┘ └──────┘ │
│ │
│ Zone A Zone B Zone C │
│ │
├────────────────────────────────────────────────────┤
│ │
│ Worker 1 Worker 2 Worker 3 Worker N │
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ │ │ │ │ │ │ │ │
│ └──────┘ └──────┘ └──────┘ └──────┘ │
│ │
└────────────────────────────────────────────────────┘
Répartition géographique
# Manager 1 - Zone A
docker node update --label-add zone=a manager1
# Manager 2 - Zone B
docker node update --label-add zone=b manager2
# Manager 3 - Zone C
docker node update --label-add zone=c manager3
Récupération après perte de quorum
# Si vous perdez le quorum (plus de la moitié des managers)
# Sur un manager survivant :
docker swarm init --force-new-cluster --advertise-addr <IP>
# Attention : cela crée un nouveau cluster avec ce seul manager
# Vous devrez ré-ajouter les autres managers
10 - Commandes de diagnostic
État du cluster
# Vue d'ensemble
docker info
# Nœuds
docker node ls
# Services
docker service ls
# Stacks
docker stack ls
Logs système
# Logs du daemon Docker (Linux)
sudo journalctl -u docker.service -f
# Événements Swarm
docker events --filter type=node
docker events --filter type=service
Résumé des commandes
| Commande | Description |
|---|---|
docker swarm init | Initialiser un cluster |
docker swarm join | Rejoindre un cluster |
docker swarm leave | Quitter le cluster |
docker swarm join-token | Afficher les tokens |
docker node ls | Lister les nœuds |
docker node promote | Promouvoir en manager |
docker node demote | Rétrograder en worker |
docker node update | Modifier un nœud |
docker node rm | Supprimer un nœud |
Points clés
docker swarm initcrée le cluster et le premier manager- Les tokens permettent de rejoindre comme worker ou manager
- Utilisez 3 ou 5 managers pour la haute disponibilité
- Les labels permettent de cibler le placement des services
Exercices pratiques
- Initialisez un cluster Swarm sur votre machine
- Créez un cluster multi-nœuds avec Play with Docker
- Ajoutez des labels à vos nœuds
- Testez la promotion/rétrogradation d'un nœud