Orchestrer des applications multi-conteneurs, sécuriser, monitorer et préparer le passage à Kubernetes.
Leçon 1 acquise (Dockerfile, volumes, réseaux). Docker Compose v2 (intégré docker compose depuis Docker 20.10+, plugin Go remplaçant docker-compose Python). Notion CI/CD (GitHub Actions, GitLab CI).
Docker Compose est l'outil officiel Docker pour orchestrer des applications composées de plusieurs services. Initialement écrit en Python (Fig, 2014, racheté par Docker), réécrit en Go en 2021 et intégré comme plugin CLI. Il consomme un fichier YAML déclaratif (compose.yaml ou docker-compose.yml) décrivant services, volumes, réseaux, secrets, configs.
Pour des applications jusqu'à 10-15 conteneurs sur un seul hôte, Compose suffit largement. Au-delà — multi-hôte, haute disponibilité, scaling auto, load balancing avancé — il faut un orchestrateur de classe entreprise : Kubernetes (de loin majoritaire), Nomad (HashiCorp), ou Docker Swarm (en déclin mais maintenu).
Cette leçon explore Compose en profondeur puis trace la transition vers K8s : isomorphisme service/Deployment, volume/PVC, etc.
name: myapp
services:
web:
image: ghcr.io/acme/web:1.4.2
restart: unless-stopped
ports:
- "8080:80"
environment:
LOG_LEVEL: info
depends_on:
api:
condition: service_healthy
healthcheck:
test: ["CMD", "wget", "-q", "-O-", "http://localhost/health"]
interval: 10s
timeout: 5s
retries: 3
start_period: 10s
deploy:
resources:
limits: { cpus: '1.0', memory: 512M }
reservations: { cpus: '0.25', memory: 128M }
logging:
driver: json-file
options:
max-size: 10m
max-file: '3'
networks: [frontend]
api:
image: ghcr.io/acme/api:1.4.2
secrets: [db_password, jwt_secret]
networks: [frontend, backend]
depends_on:
db: { condition: service_healthy }
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 10s
db:
image: postgres:16-alpine
volumes: [pgdata:/var/lib/postgresql/data]
environment:
POSTGRES_DB: app
POSTGRES_USER: app
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
secrets: [db_password]
networks: [backend]
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app"]
interval: 10s
volumes:
pgdata:
networks:
frontend: { driver: bridge }
backend:
driver: bridge
internal: true # pas d'accès Internet
secrets:
db_password: { file: ./secrets/db_password.txt }
jwt_secret: { file: ./secrets/jwt_secret.txt }
restart: unless-stopped — résilience hôtedepends_on.condition: service_healthy — orchestration ordonnéenetworks: internal: true — DB sans Internetsecrets: — pas de mot de passe en clair dans envdeploy.resources.limits — limites mémoire/CPU stricteslogging.options.max-size — rotation logs JSONdocker compose up -d — démarrer en arrière-plandocker compose ps — étatdocker compose logs -f api — logs streamingdocker compose exec api sh — shell dans le servicedocker compose pull && docker compose up -d — rolling updatedocker compose down -v — arrêter + supprimer volumesdocker compose config — valider le yaml + interpolation envdocker compose --profile dev up — profils conditionnelsLe Center for Internet Security publie le CIS Docker Benchmark v1.6 (2024) avec 100+ recommandations. Outil d'audit : docker run --net host --pid host --userns host --cap-add audit_control -e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST -v /etc:/etc:ro -v /usr/bin/containerd:/usr/bin/containerd:ro -v /usr/bin/runc:/usr/bin/runc:ro -v /usr/lib/systemd:/usr/lib/systemd:ro -v /var/lib:/var/lib:ro -v /var/run/docker.sock:/var/run/docker.sock:ro --label docker_bench_security docker/docker-bench-security.
trivy image my-api:v1 → CVE + secrets + misconfigsgrype my-api:v1docker scout cves my-api:v1--read-only : système de fichiers en lecture seule--cap-drop ALL --cap-add NET_BIND_SERVICE : capabilities minimales--security-opt no-new-privileges : empêche setuid--user 1000:1000 : forcer utilisateur non-root--pids-limit 100 : fork bomb protection--cpus 1.0 --memory 512m : limites cgroupSelon le NIST SP 800-190 (Application Container Security Guide) : « Container images should be scanned for vulnerabilities continuously, both at build time and at registry. Runtime workloads should drop unnecessary capabilities. » (NIST, 2017).
docker login
docker tag my-api:v1 acme/my-api:1.4.2
docker push acme/my-api:1.4.2
# repos privés : abonnement Docker Pro/Team
echo $CR_PAT | docker login ghcr.io -u USERNAME --password-stdin
docker tag my-api:v1 ghcr.io/USERNAME/my-api:1.4.2
docker push ghcr.io/USERNAME/my-api:1.4.2
Sigstore cosign (CNCF, 2021) permet de signer cryptographiquement les images : cosign sign --key cosign.key acme/my-api:1.4.2, vérification cosign verify --key cosign.pub acme/my-api:1.4.2. Indispensable supply-chain SLSA Level 2+.
trivy image nginx:1.27-alpinedocker compose up -dcurl -i http://localhostdocker compose logs -f --tail 50Livrable : compose.yaml versionné Git, scan Trivy 0 critique, image signée cosign.
| Besoin | Docker seul | Kubernetes |
|---|---|---|
| Multi-hôte | Compose monolithe / Swarm | Native, des dizaines/centaines de nodes |
| Auto-scaling | Manuel | HPA / VPA / Cluster Autoscaler |
| Self-healing | restart: unless-stopped | ReplicaSet + liveness/readiness |
| Load balancing | nginx custom | Service + Ingress + IngressClass |
| Rolling updates | Manuel | Strategy: RollingUpdate |
| Service discovery | DNS Docker | CoreDNS K8s |
| Storage | Volumes locaux | StorageClass + PV/PVC + CSI |
| Network policies | Limité bridge | NetworkPolicy + CNI (Calico, Cilium) |
| Écosystème | ~50 outils | CNCF Landscape 1500+ projets |
depends_on n'attend que le démarrage (pas la santé) sans condition!./ → owner uid/gid host vs container → erreurs permissionsInscrivez-vous pour accéder aux 5 autres leçons + le quiz final.
Créer mon compteChoisis quels cookies tu acceptes — modifiable à tout moment.