Objectif : Créer un cluster Swarm avec 3 nœuds (1 manager et 2 workers) et déployer un service simple.
Tâches :
# Sur le nœud 1 (futur manager)
docker swarm init --advertise-addr <IP-NOEUD-1>
# La commande précédente affichera un token. Copiez-le et utilisez-le sur les nœuds 2 et 3
# Sur les nœuds 2 et 3
docker swarm join --token <TOKEN> <IP-NOEUD-1>:2377
# Vérifiez que les trois nœuds font partie du cluster (sur le nœud 1)
docker node ls
# Déployez le service nginx avec 3 réplicas
docker service create --name webserver --replicas 3 --publish 8080:80 nginx:latest
# Vérifiez l'état du service
docker service ls
docker service ps webserver
# Pour voir comment les tâches sont réparties sur les nœuds
docker node ps $(docker node ls -q)
Objectif : Déployer une application multi-conteneurs avec réseau overlay et contraintes de placement.
Tâches :
# Créer le réseau overlay chiffré
docker network create --driver overlay --opt encrypted secure-net
# Ajouter les labels aux nœuds
docker node update --label-add type=frontend node2
docker node update --label-add type=backend node3
# Créer un fichier stack-compose.yml avec le contenu suivant:
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "8080:80"
networks:
- secure-net
deploy:
replicas: 2
placement:
constraints:
- node.labels.type == frontend
redis:
image: redis:latest
networks:
- secure-net
deploy:
replicas: 1
placement:
constraints:
- node.labels.type == backend
networks:
secure-net:
external: true
# Déployer la stack
docker stack deploy -c stack-compose.yml myapp
# Vérifier le déploiement
docker stack services myapp
docker stack ps myapp
# Vérifier le respect des contraintes de placement
docker service ps myapp_web
docker service ps myapp_redis
Objectif : Simuler une panne de quorum, récupérer le cluster et implémenter des stratégies de HA.
Contexte : Vous avez un cluster à 5 nœuds (3 managers, 2 workers) avec plusieurs services critiques déployés.
Tâches :
--force-new-cluster
# 1. Mettre les managers en mode drain
for node in $(docker node ls --filter "role=manager" -q); do
docker node update --availability drain $node
done
# 2. Déployer un service "vital" avec des contraintes
docker service create \
--name vital-service \
--replicas 3 \
nginx:latest
# 3. Simuler une panne sur 2 managers (sur les nœuds concernés)
# Arrêter Docker sur manager2 et manager3
systemctl stop docker # ou kill -9 $(pgrep dockerd) sur play-with-docker
# 4. Vérifier la perte de quorum sur manager1
docker node ls # Devrait montrer une erreur de quorum
# Récupérer le cluster sur manager1
docker swarm init --force-new-cluster --advertise-addr <IP-MANAGER1>
# 5. Une fois les managers réparés, les réintégrer:
# Sur manager2 et manager3
dockerd > /docker.log 2>&1 &
docker swarm leave --force
# Obtenir le nouveau token de manager
docker swarm join-token manager # Sur manager1
# Rejoindre avec le nouveau token
docker swarm join --token <NOUVEAU-TOKEN> <IP-MANAGER1>:2377 # Sur manager2 et manager3
# Nettoyer les nœuds obsolètes
docker node rm <id_node1,id_node2>
# 6. Activer le verrouillage automatique du cluster
docker swarm update --autolock=true
# Conserver la clé de déverrouillage en sécurité
# Après redémarrage, déverrouillez avec:
docker swarm unlock # Et entrez la clé quand demandé
# Vérifier l'état du cluster rétabli
docker node ls
docker service ls