Docker reste en 2026 le standard de fait pour conteneuriser des applications, et Podman son challenger sans daemon avec une compatibilité 95 %. Pour les développeurs et sysadmins ouest-africains, maîtriser les patterns avancés Docker (multi-stage builds, volumes nommés, networking custom, healthchecks, security context) fait la différence entre une infra fragile et une infra production-ready. Voici le guide complet 2026.
Ce guide général couvre les patterns avancés. Les articles connexes détaillent : multi-stage builds optimisés, Docker vs Podman, Docker Compose en production, Docker rootless et sécurité.
Docker en 2026
- Docker Desktop : avec license payante pour entreprises > 250 employés ou > 10M USD CA
- Docker Engine : open-source Apache 2.0, gratuit illimité
- BuildKit : builder moderne avec cache distribué et builds parallèles
- Docker Compose v2 (intégré au docker CLI)
- Docker Hub : registry public, plan gratuit limité (200 pulls par 6h pour anonymes)
Podman
- Compatibilité Docker à 95 % : alias
docker=podmanfonctionne souvent - Sans daemon : pas de processus root permanent
- Rootless par défaut : conteneurs sous user normal
- Pods (groupes de conteneurs partageant le réseau) — concept Kubernetes
- Génération de YAML Kubernetes depuis pods
Multi-stage build optimisé
# Dockerfile multi-stage pour app Node.js
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production && \
cp -R node_modules /tmp/prod_node_modules
RUN npm ci
COPY . .
RUN npm run build
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
USER node
COPY --from=builder --chown=node:node /tmp/prod_node_modules ./node_modules
COPY --from=builder --chown=node:node /app/dist ./dist
COPY --from=builder --chown=node:node /app/package.json ./
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
CMD node -e "require('http').get('http://localhost:3000/health',(r)=>process.exit(r.statusCode===200?0:1))"
CMD ["node", "dist/server.js"]
Image finale ~150 Mo au lieu de 1 Go avec naïve approach. Voir notre tutoriel multi-stage.
Volumes nommés vs bind mounts
- Bind mount :
-v /host/path:/container/path— partage un dossier hôte. Pratique en dev. - Named volume :
-v mydata:/data— Docker gère le storage. Backupable, déplaçable, ne pollue pas le host. - tmpfs :
--tmpfs /tmp— RAM-only, parfait pour caches éphémères
Networking custom
# Créer un réseau privé
docker network create app-net
# Lancer plusieurs services dessus
docker run -d --network app-net --name api -p 3000:3000 myapp:latest
docker run -d --network app-net --name db postgres:16
# api peut résoudre 'db' via DNS interne
Healthchecks
Critique pour zero-downtime deployments. Le orchestrateur (Coolify, Swarm, K8s) attend que le healthcheck pass avant de couper l’ancien container.
HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
CMD curl -f http://localhost:3000/health || exit 1
Security context
USER non-root: ne JAMAIS run en root dans le conteneur--read-only: container avec FS lecture seule, sauf volumes mountés--cap-drop=ALL --cap-add=NET_BIND_SERVICE: retirer toutes les capabilities--security-opt=no-new-privileges: empêcher escalade privilèges- Scan des images avec
trivyou Snyk avant push en prod
BuildKit cache
DOCKER_BUILDKIT=1 docker build --cache-from type=registry,ref=registry/myapp:cache -t myapp:latest .
Cache distribué via registry : builds CI plus rapides, équipe partage le cache.
Adaptation Afrique de l’Ouest
Sur connexion lente, optimisez la taille des images : multi-stage + alpine + slim variants. Une image 150 Mo se transfère en 30s sur 4G, vs 5 min pour 1 Go. Important pour les déploiements fréquents.