Skip to main content

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

ItemMinimumRecommended
Docker Engine1.12+Latest stable
RAM per node2 GB4 GB+
CPU per node1 core2+ cores
Network100 Mbps1 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

                    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

CommandDescription
docker swarm initInitialize a cluster
docker swarm joinJoin a cluster
docker swarm leaveLeave the cluster
docker swarm join-tokenDisplay the tokens
docker node lsList the nodes
docker node promotePromote to manager
docker node demoteDemote to worker
docker node updateModify a node
docker node rmRemove a node
Key points
  • docker swarm init creates 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

  1. Initialize a Swarm cluster on your machine
  2. Create a multi-node cluster with Play with Docker
  3. Add labels to your nodes
  4. Test promoting/demoting a node

← Introduction | Services and Tasks →