Comparaison des solutions de conteneurisation¶
Choisir le bon runtime de conteneurs selon le contexte projet : critères objectifs, forces et faiblesses de chaque solution.
Contexte de la décision¶
Ce tutoriel utilise Podman comme runtime de conteneurisation. Ce choix n'est pas anodin : il résulte d'une analyse comparative des principales solutions disponibles en 2025. Cette page documente cette analyse au format ADR afin de tracer la décision et ses motivations.
Format ADR
Un Architecture Decision Record (ADR) capture une décision technique significative, son contexte et ses conséquences. Voir le chapitre dédié pour la méthodologie complète.
Grille de comparaison¶
| Critère | Podman | Docker | containerd | CRI-O | LXC/LXD |
|---|---|---|---|---|---|
| Licence | Apache 2.0 | Apache 2.0 | Apache 2.0 | Apache 2.0 | LGPL 2.1 / Apache 2.0 |
| Rootless natif | |||||
| Daemonless | dockerd | containerd | crio | lxd | |
| Compatibilité CRI Kubernetes | |||||
| Support Compose | podman-compose | docker compose | |||
| Conformité OCI | |||||
| Intégration systemd | podman generate systemd | ||||
| Empreinte ressources | Faible (pas de daemon) | Moyenne (daemon permanent) | Faible | Faible | Variable |
| Modèle de sécurité | SELinux, user namespaces, seccomp | seccomp, AppArmor | seccomp, AppArmor | SELinux, seccomp | AppArmor, seccomp |
| Maturité écosystème | Haute (Red Hat, RHEL 9+) | Très haute (standard de facto) | Haute (CNCF graduated) | Haute (CNCF graduated) | Moyenne |
Analyse détaillée¶
Podman¶
Podman est un runtime OCI sans daemon qui exécute chaque conteneur comme un processus fils direct. Il supporte le mode rootless nativement depuis sa conception, ce qui élimine le vecteur d'attaque principal des runtimes à daemon (escalade de privileges via le socket).
Forces :
- Compatible CLI Docker (
alias docker=podman) - Génération de fichiers systemd intégrée
- Outils compagnons : Buildah (build), Skopeo (registre)
- Adopte par Red Hat comme runtime par défaut sur RHEL 9 et dérivés
Limites :
- Écosystème Compose moins mature que Docker Compose
- Certains outils tiers supposent la présence du socket Docker
Docker¶
Docker reste le standard de facto pour le développement local et les pipelines CI/CD. Son écosystème est le plus riche : Docker Desktop, Docker Hub, extensions, intégrations IDE.
Forces :
- Écosystème et communauté les plus larges
- Docker Compose V2 intégré en plugin natif
- Documentation abondante
Limites :
- Daemon
dockerdtournant en root par défaut - Docker Desktop soumis a licence commerciale (entreprises > 250 employés)
- Le shim CRI (
cri-dockerd) est deprecated pour Kubernetes
containerd¶
containerd est un runtime de bas niveau extrait de Docker. Il sert de couche d'exécution sous Docker et comme runtime CRI pour Kubernetes.
Forces :
- Projet CNCF graduated, très stable
- Runtime CRI par défaut de la plupart des distributions Kubernetes managées
- API gRPC extensible via plugins (snapshotter, etc.)
Limites :
- Pas d'interface utilisateur ni de Compose
- Nécessite
nerdctlpour une expérience CLI comparable a Docker - Daemon permanent requis
CRI-O¶
CRI-O est un runtime dédié Kubernetes : il implémente uniquement l'interface CRI, rien de plus. Il est optimise pour les clusters de production.
Forces :
- Surface d'attaque minimale (pas de fonctionnalités superflues)
- Aligné sur les versions Kubernetes (versionning 1:1)
- Intégration SELinux poussée
Limites :
- Inutilisable en dehors de Kubernetes
- Pas de CLI interactive, pas de Compose
- Adoption limitée hors OpenShift / RHEL
LXC/LXD¶
LXC/LXD fournit des conteneurs système : des machines virtuelles légères qui exécutent un init complet (systemd) plutôt qu'un unique processus applicatif.
Forces :
- Idéal pour virtualiser un OS complet sans hyperviseur
- Gestion déclarative via profils LXD
- Snapshots et migration live
Limites :
- Pas conçu pour les conteneurs applicatifs (pas OCI)
- Images non compatibles Docker Hub / registres OCI
- Canonical a transféré LXD a Incus (fork communautaire)
Décision¶
Choix retenu : Podman
Motivation¶
Pour un déploiement serveur en production sur AlmaLinux 9, Podman est le choix le plus adapte :
- Rootless natif — réduit la surface d'attaque sans configuration supplémentaire
- Daemonless — pas de processus permanent a surveiller, chaque conteneur est un processus indépendant
- Intégration systemd — génération automatique des units, activation socket, compatibilité lingering
- Compatibilité Docker — migration transparente des
docker-compose.ymlexistants - Support Red Hat — runtime par défaut sur RHEL 9 et dérivés (AlmaLinux, Rocky Linux)
Alternatives acceptables¶
| Situation | Recommandation |
|---|---|
| Écosystème Docker existant (CI/CD, Docker Desktop, registre privé Docker) | Docker — le coût de migration ne se justifie pas |
| Runtime Kubernetes uniquement (pas de CLI interactive nécessaire) | containerd ou CRI-O — runtimes CRI optimises |
| Virtualisation légère d'un OS complet (environnements de test, isolation réseau) | LXC/LXD (Incus) — conteneurs système, pas applicatifs |
Conséquences¶
- Les fichiers Compose utilisent la syntaxe Docker standard
- Les services systemd sont générés via
podman generate systemd - Les images proviennent de registres OCI (Docker Hub, Artifactory)
- L'équipe doit connaître les quelques différences Podman/Docker (réseau, volumes
:Z)
Statut¶
Accepte — applique dans ce tutoriel.
| Champ | Valeur |
|---|---|
| Date | 2025-01 |
| Auteur | Équipe plateforme |
| Réviseurs | Architecte infrastructure |
| Statut | Accepte |