Swarm : services et stacks
En Swarm, l'unité de déploiement est le service (pas le container). Un service définit l'image, le nombre de replicas, la politique de mise à jour. Swarm garantit que le nombre de replicas demandé est maintenu en permanence.
Créer un service
# Service basique
docker service create --name web --replicas 3 --publish published=80,target=80 nginx:1.27-alpine
# Voir l'état du service
docker service ls
docker service ps web # distribution des tasks sur les nœuds
# Logs du service (tous les replicas)
docker service logs -f web
# Inspecter le service
docker service inspect web --prettyRolling update
# Mettre à jour l'image avec un rolling update
docker service update --image nginx:1.27-alpine --update-parallelism 1 --update-delay 10s --update-failure-action rollback web--update-parallelism 1 : met à jour 1 replica à la fois. --update-delay 10s : attend 10s entre chaque replica. --update-failure-action rollback : rollback automatique si une mise à jour échoue.
# Rollback manuel
docker service rollback webStacks : Compose files en Swarm
# compose.yml compatible Swarm
services:
web:
image: myapp:${VERSION}
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
failure_action: rollback
order: start-first # démarre le nouveau avant d'arrêter l'ancien
rollback_config:
parallelism: 1
delay: 5s
restart_policy:
condition: on-failure
max_attempts: 3
placement:
constraints:
- node.labels.role == web
preferences:
- spread: node.id # distribuer uniformément sur les nœuds
resources:
limits:
memory: 256M
networks:
- app-net
networks:
app-net:
driver: overlay# Déployer une stack
docker stack deploy -c compose.yml myapp
# Lister les stacks
docker stack ls
# Services d'une stack
docker stack services myapp
# Supprimer une stack
docker stack rm myappScaler un service
# Changer le nombre de replicas
docker service scale web=5
# Ou via update
docker service update --replicas 5 webMode global (daemon set)
# 1 replica par nœud du cluster (utile pour les agents de monitoring)
docker service create --name node-exporter --mode global --mount type=bind,source=/proc,target=/host/proc:ro prom/node-exporter:latest