Services et Tasks
Objectifs du chapitre
- Comprendre les concepts de service et task
- Créer et gérer des services
- Configurer les modes de déploiement
- Surveiller l'état des services
1 - Concepts fondamentaux
Hiérarchie des objets Swarm
┌─────────────────────────────────────────────────────────────┐
│ Stack │
│ (docker-compose.yml) │
├───── ────────────────────────────────────────────────────────┤
│ │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│ │ Service │ │ Service │ │ Service │ │
│ │ "web" │ │ "api" │ │ "db" │ │
│ └─────┬─────┘ └─────┬─────┘ └─────┬─────┘ │
│ │ │ │ │
│ ┌─────┴─────┐ ┌─────┴─────┐ ┌─────┴─────┐ │
│ │ Tasks │ │ Tasks │ │ Task │ │
│ │ (3 repli) │ │ (2 repli) │ │ (1 repli) │ │
│ └───────────┘ └───────────┘ └───────────┘ │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Containers │ │
│ │ web.1 web.2 web.3 api.1 api.2 db.1 │ │
│ └─────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Définitions
| Terme | Description |
|---|---|
| Service | Définition de ce qui doit s'exécuter (image, config, replicas) |
| Task | Unité de travail assignée à un nœud (1 task = 1 conteneur) |
| Container | Instance réelle exécutée sur un nœud |
2 - Créer un service
Syntaxe de base
docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
Exemples
# Service simple
docker service create --name web nginx
# Avec nombre de réplicas
docker service create --name web --replicas 3 nginx
# Avec publication de port
docker service create --name web -p 80:80 nginx
# Avec variables d'environnement
docker service create --name api \
-e NODE_ENV=production \
-e DB_HOST=db \
node:18-alpine
# Avec montage de volume
docker service create --name db \
--mount type=volume,source=db-data,target=/var/lib/postgresql/data \
postgres:15
Options courantes
| Option | Description | Exemple |
|---|---|---|
--name | Nom du service | --name web |
--replicas | Nombre de réplicas | --replicas 3 |
-p, --publish | Publication de port | -p 8080:80 |
-e, --env | Variable d'environnement | -e KEY=value |
--mount | Montage de volume | --mount type=volume,... |
--network | Réseau à utiliser | --network my-overlay |
--constraint | Contrainte de placement | --constraint node.role==worker |
3 - Modes de déploiement
Replicated (par défaut)
Exécute N instances réparties sur les nœuds disponibles :
# 5 réplicas distribués sur le cluster
docker service create --name web --replicas 5 nginx
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Node 1 │ │ Node 2 │ │ Node 3 │
├─────────┤ ├─────────┤ ├─────────┤
│ web.1 │ │ web.2 │ │ web.3 │
│ web.4 │ │ web.5 │ │ │
└─────────┘ └─────────┘ └─────────┘
Global
Exécute exactement 1 instance par nœud :
# 1 instance sur chaque nœud
docker service create --name agent --mode global prometheus/node-exporter
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Node 1 │ │ Node 2 │ │ Node 3 │
├─────────┤ ├─────────┤ ├─────────┤
│ agent.1 │ │ agent.2 │ │ agent.3 │
└─────────┘ └─────────┘ └─────────┘
Cas d'usage
| Mode | Cas d'usage |
|---|---|
| Replicated | Applications web, APIs, workers |
| Global | Monitoring agents, log collectors, antivirus |
4 - Gérer les services
Lister les services
# Liste simple
docker service ls
# Format personnalisé
docker service ls --format "{{.Name}}: {{.Replicas}}"
Inspecter un service
# Informations complètes
docker service inspect web
# Format JSON pretty
docker service inspect web --pretty
# Extraire une valeur
docker service inspect web --format '{{.Spec.Mode.Replicated.Replicas}}'
Voir les tâches d'un service
# Lister les tâches
docker service ps web
# Avec plus de détails
docker service ps web --no-trunc
# Filtrer par état
docker service ps web --filter "desired-state=running"
Voir les logs
# Logs de toutes les tâches
docker service logs web
# Suivre en temps réel
docker service logs -f web
# Avec timestamps
docker service logs -t web
# Limiter le nombre de lignes
docker service logs --tail 100 web
5 - Mettre à jour un service
Scaling
# Changer le nombre de réplicas
docker service scale web=5
# Plusieurs services à la fois
docker service scale web=5 api=3 worker=10
Modifier la configuration
# Mettre à jour l'image
docker service update --image nginx:1.25 web
# Ajouter une variable d'environnement
docker service update --env-add DEBUG=true web
# Supprimer une variable
docker service update --env-rm DEBUG web
# Modifier les ressources
docker service update \
--limit-cpu 0.5 \
--limit-memory 512M \
web
# Modifier le port publié
docker service update --publish-add 8080:80 web
docker service update --publish-rm 80:80 web
Rolling updates
# Mise à jour progressive
docker service update \
--update-parallelism 2 \
--update-delay 10s \
--image nginx:1.25 \
web
| Option | Description |
|---|---|
--update-parallelism | Nombre de tâches mises à jour simultanément |
--update-delay | Délai entre chaque batch |
--update-failure-action | Action en cas d'échec (pause, continue, rollback) |
--update-order | Ordre (stop-first, start-first) |
6 - Rollback
Revenir à la version précédente
# Rollback automatique
docker service rollback web
# Configurer le rollback automatique
docker service update \
--update-failure-action rollback \
--update-max-failure-ratio 0.3 \
web
Configuration du rollback
docker service create --name web \
--replicas 5 \
--update-parallelism 2 \
--update-delay 10s \
--update-failure-action rollback \
--rollback-parallelism 1 \
--rollback-delay 5s \
nginx:1.24
7 - Contraintes de placement
Contraintes sur les nœuds
# Uniquement sur les workers
docker service create --name web \
--constraint 'node.role==worker' \
nginx
# Uniquement sur un nœud spécifique
docker service create --name singleton \
--constraint 'node.hostname==worker1' \
myapp
# Basé sur les labels
docker service create --name web \
--constraint 'node.labels.env==production' \
nginx
# Plusieurs contraintes (AND)
docker service create --name web \
--constraint 'node.role==worker' \
--constraint 'node.labels.zone==eu-west' \
nginx
Préférences de placement
# Préférer une distribution par zone
docker service create --name web \
--replicas 6 \
--placement-pref 'spread=node.labels.zone' \
nginx
Zone A Zone B Zone C
┌─────────┐ ┌─────────┐ ┌─────────┐
│ web.1 │ │ web.3 │ │ web.5 │
│ web.2 │ │ web.4 │ │ web.6 │
└─────────┘ └─────────┘ └─────────┘
8 - Ressources et limites
Définir des limites
docker service create --name api \
--limit-cpu 0.5 \
--limit-memory 256M \
--reserve-cpu 0.25 \
--reserve-memory 128M \
node:18-alpine
| Option | Description |
|---|---|
--limit-cpu | CPU maximum |
--limit-memory | Mémoire maximum |
--reserve-cpu | CPU garanti (réservé) |
--reserve-memory | Mémoire garantie (réservée) |
Impact sur le scheduling
Node avec 4 CPU, 8 Go RAM
Service demandant reserve-cpu=1, reserve-memory=2G
→ Maximum 4 instances sur ce nœud
9 - Healthchecks
Configurer un healthcheck
docker service create --name api \
--health-cmd "curl -f http://localhost:3000/health || exit 1" \
--health-interval 30s \
--health-timeout 10s \
--health-retries 3 \
--health-start-period 60s \
myapi:latest
États de santé
| État | Description |
|---|---|
starting | Période de démarrage |
healthy | Healthcheck réussi |
unhealthy | Healthcheck échoué (redémarrage) |
10 - Supprimer un service
# Supprimer un service
docker service rm web
# Supprimer plusieurs services
docker service rm web api worker
# Forcer sans confirmation
docker service rm $(docker service ls -q)
11 - Exemple complet
Application web avec base de données
# Créer le réseau overlay
docker network create --driver overlay app-network
# Créer le service de base de données
docker service create --name db \
--network app-network \
--mount type=volume,source=pg-data,target=/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_DB=myapp \
--constraint 'node.labels.type==database' \
postgres:15
# Créer le service API
docker service create --name api \
--network app-network \
--replicas 3 \
-e DATABASE_URL=postgres://postgres:secret@db:5432/myapp \
--constraint 'node.role==worker' \
myapi:latest
# Créer le service web (frontend)
docker service create --name web \
--network app-network \
--replicas 3 \
-p 80:80 \
-e API_URL=http://api:3000 \
myweb:latest
Résumé des commandes
| Commande | Description |
|---|---|
docker service create | Créer un service |
docker service ls | Lister les services |
docker service ps | Voir les tâches d'un service |
docker service inspect | Détails d'un service |
docker service logs | Logs d'un service |
docker service scale | Changer le nombre de réplicas |
docker service update | Mettre à jour un service |
docker service rollback | Revenir à la version précédente |
docker service rm | Supprimer un service |
Points clés
- Un service définit l'état désiré, Swarm le maintient
- Les tasks sont les unités de travail (1 task = 1 conteneur)
- Mode
replicatedpour N instances,globalpour 1 par nœud - Les contraintes contrôlent le placement des tâches
Exercices pratiques
- Créez un service nginx avec 5 réplicas
- Mettez à l'échelle le service à 10 réplicas
- Mettez à jour l'image avec un rolling update
- Testez un rollback après une mise à jour