Aller au contenu principal

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

TermeDescription
ServiceDéfinition de ce qui doit s'exécuter (image, config, replicas)
TaskUnité de travail assignée à un nœud (1 task = 1 conteneur)
ContainerInstance 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

OptionDescriptionExemple
--nameNom du service--name web
--replicasNombre de réplicas--replicas 3
-p, --publishPublication de port-p 8080:80
-e, --envVariable d'environnement-e KEY=value
--mountMontage de volume--mount type=volume,...
--networkRéseau à utiliser--network my-overlay
--constraintContrainte 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

ModeCas d'usage
ReplicatedApplications web, APIs, workers
GlobalMonitoring 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
OptionDescription
--update-parallelismNombre de tâches mises à jour simultanément
--update-delayDélai entre chaque batch
--update-failure-actionAction en cas d'échec (pause, continue, rollback)
--update-orderOrdre (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
OptionDescription
--limit-cpuCPU maximum
--limit-memoryMémoire maximum
--reserve-cpuCPU garanti (réservé)
--reserve-memoryMé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é

ÉtatDescription
startingPériode de démarrage
healthyHealthcheck réussi
unhealthyHealthcheck é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

CommandeDescription
docker service createCréer un service
docker service lsLister les services
docker service psVoir les tâches d'un service
docker service inspectDétails d'un service
docker service logsLogs d'un service
docker service scaleChanger le nombre de réplicas
docker service updateMettre à jour un service
docker service rollbackRevenir à la version précédente
docker service rmSupprimer 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 replicated pour N instances, global pour 1 par nœud
  • Les contraintes contrôlent le placement des tâches

Exercices pratiques

  1. Créez un service nginx avec 5 réplicas
  2. Mettez à l'échelle le service à 10 réplicas
  3. Mettez à jour l'image avec un rolling update
  4. Testez un rollback après une mise à jour

← Installation | Réseaux Swarm →