Installation and cluster creation
Chapter objectives
- Initialize a Swarm cluster
- Add manager and worker nodes
- Manage the cluster nodes
- Configure Docker Desktop for Swarm
1 - Prerequisites
System requirements
| Item | Minimum | Recommended |
|---|---|---|
| Docker Engine | 1.12+ | Latest stable |
| RAM per node | 2 GB | 4 GB+ |
| CPU per node | 1 core | 2+ cores |
| Network | 100 Mbps | 1 Gbps |
Ports to open
# 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
Check Docker
# Vérifier l'installation Docker
docker --version
docker info
# Vérifier que le mode Swarm est disponible
docker swarm --help
2 - Initialize the cluster
On the first 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
Initialization output
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.
Check the state
# É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 - Add nodes
Retrieve the 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
Add a worker
On the worker server:
# 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.
Add a manager
On the manager server:
# 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.
Check the 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 - Node management
Promote a worker to manager
# Promouvoir
docker node promote worker1
# Équivalent
docker node update --role manager worker1
Demote a manager to worker
# Rétrograder
docker node demote manager3
# Équivalent
docker node update --role worker manager3
Put a node in 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
Remove a node
# 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
Inspect a node
# 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 on nodes
Add 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
View 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
Use labels for 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 - Cluster security
Token rotation
# Changer le token worker
docker swarm join-token --rotate worker
# Changer le token manager
docker swarm join-token --rotate manager
Certificate rotation
# 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
Lock the 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 with Docker Desktop
Windows/macOS
Docker Desktop includes a single-node Swarm:
# Initialiser Swarm (single-node)
docker swarm init
# C'est tout ! Vous pouvez utiliser les services
docker service create --name web -p 80:80 nginx
Multi-node Swarm with 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 or 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 (learning)
Free online environment
Visit labs.play-with-docker.com for a free Swarm environment:
# 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 - High availability of managers
Recommended architecture
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 │
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ │ │ │ │ │ │ │ │
│ └──────┘ └──────┘ └──────┘ └──────┘ │
│ │
└────────────────────────────────────────────────────┘
Geographic distribution
# 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
Recovery after quorum loss
# 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 - Diagnostic commands
Cluster state
# Vue d'ensemble
docker info
# Nœuds
docker node ls
# Services
docker service ls
# Stacks
docker stack ls
System logs
# Logs du daemon Docker (Linux)
sudo journalctl -u docker.service -f
# Événements Swarm
docker events --filter type=node
docker events --filter type=service
Command summary
| Command | Description |
|---|---|
docker swarm init | Initialize a cluster |
docker swarm join | Join a cluster |
docker swarm leave | Leave the cluster |
docker swarm join-token | Display the tokens |
docker node ls | List the nodes |
docker node promote | Promote to manager |
docker node demote | Demote to worker |
docker node update | Modify a node |
docker node rm | Remove a node |
Key points
docker swarm initcreates the cluster and the first manager- Tokens allow joining as a worker or manager
- Use 3 or 5 managers for high availability
- Labels allow targeting service placement
Practical exercises
- Initialize a Swarm cluster on your machine
- Create a multi-node cluster with Play with Docker
- Add labels to your nodes
- Test promoting/demoting a node