Services and Tasks
Chapter objectives
- Understand the service and task concepts
- Create and manage services
- Configure deployment modes
- Monitor the state of services
1 - Fundamental concepts
Hierarchy of Swarm objects
┌─────────────────────────────────────────────────────────────┐
│ 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 │ │
│ └─────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Definitions
| Term | Description |
|---|---|
| Service | Definition of what must run (image, config, replicas) |
| Task | Unit of work assigned to a node (1 task = 1 container) |
| Container | Actual instance running on a node |
2 - Create a service
Basic syntax
docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
Examples
# 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
Common options
| Option | Description | Example |
|---|---|---|
--name | Service name | --name web |
--replicas | Number of replicas | --replicas 3 |
-p, --publish | Port publishing | -p 8080:80 |
-e, --env | Environment variable | -e KEY=value |
--mount | Volume mount | --mount type=volume,... |
--network | Network to use | --network my-overlay |
--constraint | Placement constraint | --constraint node.role==worker |
3 - Deployment modes
Replicated (default)
Runs N instances distributed across the available nodes:
# 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
Runs exactly 1 instance per node:
# 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 │
└─────────┘ └─────────┘ └─────────┘
Use cases
| Mode | Use case |
|---|---|
| Replicated | Web applications, APIs, workers |
| Global | Monitoring agents, log collectors, antivirus |
4 - Manage services
List services
# Liste simple
docker service ls
# Format personnalisé
docker service ls --format "{{.Name}}: {{.Replicas}}"
Inspect a 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}}'
View a service's tasks
# 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"
View 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 - Update a 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
Modify the 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 | Number of tasks updated simultaneously |
--update-delay | Delay between each batch |
--update-failure-action | Action on failure (pause, continue, rollback) |
--update-order | Order (stop-first, start-first) |
6 - Rollback
Return to the previous version
# Rollback automatique
docker service rollback web
# Configurer le rollback automatique
docker service update \
--update-failure-action rollback \
--update-max-failure-ratio 0.3 \
web
Rollback configuration
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 - Placement constraints
Constraints on nodes
# 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
Placement preferences
# 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 - Resources and limits
Define limits
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 | Maximum CPU |
--limit-memory | Maximum memory |
--reserve-cpu | Guaranteed (reserved) CPU |
--reserve-memory | Guaranteed (reserved) memory |
Impact on 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
Configure a 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
Health states
| State | Description |
|---|---|
starting | Startup period |
healthy | Healthcheck succeeded |
unhealthy | Healthcheck failed (restart) |
10 - Remove a 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 - Complete example
Web application with database
# 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
Command summary
| Command | Description |
|---|---|
docker service create | Create a service |
docker service ls | List services |
docker service ps | View a service's tasks |
docker service inspect | Details of a service |
docker service logs | Logs of a service |
docker service scale | Change the number of replicas |
docker service update | Update a service |
docker service rollback | Return to the previous version |
docker service rm | Remove a service |
Key points
- A service defines the desired state, Swarm maintains it
- Tasks are the units of work (1 task = 1 container)
replicatedmode for N instances,globalfor 1 per node- Constraints control the placement of tasks
Practical exercises
- Create an nginx service with 5 replicas
- Scale the service to 10 replicas
- Update the image with a rolling update
- Test a rollback after an update