Docker et Kubernetes : orchestrer ses services sans se perdre
Les conteneurs, c'est la partie facile. Les faire tourner de façon fiable par dizaines, c'est là que ça se corse. Voici un guide pratique : builds Docker multi-stage, quand vous avez vraiment besoin de Kubernetes, les objets de base, les health checks, et les alternatives managées.
Docker a changé la façon de construire et déployer les applications. Kubernetes a changé la façon de les faire tourner à l'échelle, et a ajouté beaucoup de surface opérationnelle au passage. Connaître les deux, et savoir quand vous n'avez pas besoin du second, fait aujourd'hui partie du métier de tout ingénieur backend sur des systèmes distribués.
Docker : construire une image petite et correcte
Un conteneur empaquette l'application avec ses dépendances dans une unité portable et reproductible, définie par le Dockerfile. Deux choses comptent pour une image de production : utiliser un build multi-stage pour que l'image finale ne contienne que le runtime et l'app construite, pas les outils de build, et tourner en utilisateur non-root. Ajoutez un .dockerignore pour ne pas copier .git, node_modules ou les fichiers d'env locaux dans le contexte de build.
# Stage 1 : build
FROM composer:2 AS vendor
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-dev --optimize-autoloader --no-scripts
# Stage 2 : runtime
FROM php:8.4-fpm-alpine
RUN docker-php-ext-install pdo_mysql opcache
WORKDIR /var/www
COPY --from=vendor /app/vendor ./vendor
COPY . .
RUN php artisan config:cache && php artisan route:cache \
&& addgroup -g 1000 app && adduser -u 1000 -G app -S app \
&& chown -R app:app /var/www
USER app
EXPOSE 9000
CMD ["php-fpm"]Docker Compose : le local, et la petite production
Pour le développement local et pour une poignée de services sur un seul VPS, Docker Compose suffit. Un fichier décrit chaque service, son réseau, ses volumes et son environnement, et docker compose up monte toute la stack. Ne cherchez pas plus loin tant qu'un seul hôte ne peut réellement pas porter votre charge ou que vous n'avez pas besoin de bascule automatique.
Quand vous avez vraiment besoin de Kubernetes
- ✓Vous faites tourner plus qu'une poignée de services et un seul hôte ne peut pas les porter.
- ✓Vous avez besoin d'un scaling automatique en réponse au trafic, pas d'un nombre fixe de conteneurs.
- ✓Vous avez besoin de déploiements progressifs avec rollout conditionné à la santé et rollback automatique.
- ✓Vous avez besoin d'auto-guérison : un conteneur crashé redémarré, un noeud malsain drainé, sans réveiller personne.
- ✓Vous avez l'équipe pour l'opérer, ou vous utilisez un control plane managé (GKE, EKS, AKS).
Les objets de base
Apprenez ces cinq-là en premier : Pod (un ou plusieurs conteneurs planifiés ensemble), Deployment (gère un ensemble de Pods identiques et leur rollout), Service (un nom réseau stable et un load balancer pour ces Pods), Ingress (routage HTTP depuis l'extérieur du cluster), et ConfigMap et Secret (configuration et identifiants injectés en env ou en fichiers).
Un Deployment minimal avec health checks
L'erreur la plus fréquente dans un premier setup Kubernetes est de sauter les probes. Sans readiness probe, du trafic est envoyé à un Pod avant qu'il soit prêt ; sans liveness probe, un Pod bloqué n'est jamais redémarré. Les deux tiennent en quelques lignes.
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-service
spec:
replicas: 3
selector:
matchLabels: { app: api-service }
template:
metadata:
labels: { app: api-service }
spec:
containers:
- name: api
image: my-registry/api-service:v1.2.0
ports:
- containerPort: 9000
envFrom:
- secretRef: { name: api-secrets }
readinessProbe:
httpGet: { path: /health, port: 9000 }
initialDelaySeconds: 5
livenessProbe:
httpGet: { path: /health, port: 9000 }
initialDelaySeconds: 15
resources:
requests: { cpu: 100m, memory: 256Mi }
limits: { memory: 512Mi }Config et secrets : jamais dans l'image
Une image doit être identique dans tous les environnements. Les valeurs spécifiques à un environnement viennent d'un ConfigMap, et les identifiants d'un Secret (idéalement adossé à un vrai gestionnaire de secrets, puisqu'un Secret Kubernetes brut n'est qu'encodé en base64). Injectez-les en variables d'environnement ou en fichiers montés au runtime, jamais au build.
Déploiements progressifs et rollback
Un Deployment déploie une nouvelle image en remplaçant les Pods progressivement, en attendant que chaque nouveau Pod passe sa readiness probe avant de continuer. Si la nouvelle version ne devient jamais prête, le rollout se bloque au lieu de faire tomber le service, et kubectl rollout undo vous ramène à la version précédente.
Les alternatives managées
Entre Docker Compose et Kubernetes complet, il y a les plateformes de conteneurs managées : Google Cloud Run, AWS App Runner ou ECS Fargate, Fly.io. Elles font tourner votre conteneur, le scalent, lui donnent HTTPS et des déploiements progressifs, et ne vous laissent presque aucune charge opérationnelle. Pour la plupart des services petits et moyens, c'est la bonne réponse, et vous passez à Kubernetes seulement quand vous les dépassez.
| Docker Compose | Plateforme managée | Kubernetes | |
|---|---|---|---|
| Effort de mise en place | Minimal | Faible | Élevé |
| Charge opérationnelle | Vous gérez l'hôte | Quasi nulle | Importante, ou un control plane managé |
| Autoscaling | Non | Oui | Oui, fin |
| Bon pour | Local, quelques services sur un hôte | La plupart des prods petites à moyennes | Beaucoup de services, grande échelle, une équipe plateforme |
FAQ
- Ai-je besoin de Kubernetes ?
- Probablement pas encore. Si vous faites tourner une poignée de services, Docker Compose sur un VPS ou une plateforme managée comme Cloud Run couvre le besoin avec bien moins de coût opérationnel. Kubernetes mérite sa complexité une fois que vous avez beaucoup de services, besoin d'autoscaling fin et d'auto-guérison, et l'équipe ou un control plane managé pour l'opérer.
- Quelle différence entre Docker et Kubernetes ?
- Docker construit et fait tourner un seul conteneur. Kubernetes orchestre beaucoup de conteneurs sur beaucoup de machines : il les planifie, leur donne des noms réseau stables, équilibre la charge, les scale, redémarre ceux qui sont malsains, et déploie les nouvelles versions. Docker est l'unité ; Kubernetes est le système qui fait tourner des milliers d'unités.
- Docker Compose suffit-il en production ?
- Pour un petit nombre de services sur un seul hôte avec un trafic modeste, oui. C'est simple, bien compris, et facile à raisonner. Vous le dépassez quand un hôte ne peut plus porter la charge, ou quand vous avez besoin de bascule automatique et de scaling au trafic que Compose ne fournit pas.
- Qu'est-ce qu'un liveness probe ?
- Un liveness probe est une vérification périodique que Kubernetes exécute contre un conteneur pour décider s'il est encore sain. S'il échoue de façon répétée, Kubernetes redémarre le conteneur. Il attrape les processus bloqués qui tournent mais ne travaillent pas. Un readiness probe est distinct : il décide si le conteneur doit déjà recevoir du trafic.
- Kubernetes ou une plateforme managée ?
- Commencez par une plateforme managée (Cloud Run, App Runner, Fly). Elle vous donne le scaling, HTTPS et les déploiements progressifs avec presque aucun travail d'ops. Passez à Kubernetes quand vous avez besoin de capacités qu'elles n'offrent pas, comme du réseau complexe, des charges avec état, ou beaucoup de services partageant un cluster, et que vous avez l'équipe pour ça.
Docker est une compétence dont tout le monde dans une équipe backend a besoin. Kubernetes est un outil pour une échelle précise, et le sortir trop tôt échange un problème simple contre un problème dur. Construisez des images petites et correctes, faites-les tourner avec Compose ou une plateforme managée, et adoptez Kubernetes quand c'est la charge, pas le CV, qui l'exige.
Besoin d'aide sur ce sujet ? Migration Microservices
Découvrir ce service →