Vous devez choisir un moteur de conteneurs mais vous êtes perdu entre Docker, Podman, containerd et LXC ? Cette page vous guide vers le bon choix en 5 minutes. Docker reste le standard pour débuter, Podman pour la sécurité rootless, containerd pour Kubernetes, et LXC/Incus pour les conteneurs système.
Que vous soyez développeur, administrateur système ou architecte, ce guide comparatif vous aide à identifier le moteur adapté à votre contexte et vous oriente vers les ressources détaillées.
En 30 secondes
Section intitulée « En 30 secondes »- Docker : meilleur choix par défaut (dev, docs, Compose)
- Podman : rootless/daemonless sur Linux + compatibilité Docker
- containerd : runtime CRI-compatible (Kubernetes)
- CRI-O : minimal « K8s only »
- LXC/Incus : conteneurs système (OS complet), unprivileged/userns
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »Les 6 moteurs comparés
Docker, Podman, containerd, CRI-O, LXC et Incus — leurs forces et faiblesses.
Recommandation par cas
Développement local, production, Kubernetes, sécurité — quel moteur pour quel usage.
Critères de décision
Architecture, sécurité, écosystème, courbe d’apprentissage.
Outils complémentaires
Portainer, LazyDocker, Podman Desktop — les interfaces graphiques.
Recommandation rapide
Section intitulée « Recommandation rapide »Vous êtes pressé ? Voici le résumé en un tableau :
| Votre situation | Moteur recommandé | Pourquoi |
|---|---|---|
| Débutant / Apprentissage | Docker | Documentation abondante, écosystème mature |
| Développement local | Docker ou Podman | Docker Compose, intégration IDE |
| Sécurité prioritaire (rootless) | Podman | Sans daemon, rootless par défaut |
| Kubernetes en production | containerd | Runtime natif K8s, léger |
| Kubernetes minimaliste | CRI-O | Conçu uniquement pour K8s |
| Conteneurs système (VM légères) | LXC / Incus | OS complet dans un conteneur |
| Éviter la licence Docker Desktop | Podman + Colima | 100% open source |
Qu’est-ce qu’un moteur de conteneurs ?
Section intitulée « Qu’est-ce qu’un moteur de conteneurs ? »Un moteur de conteneurs (ou container engine) est le logiciel qui permet de créer, exécuter et gérer des conteneurs. C’est la fondation sur laquelle repose toute votre infrastructure conteneurisée.
Moteur vs runtime vs conteneur système
Section intitulée « Moteur vs runtime vs conteneur système »Cette page compare des outils de natures différentes. Voici le vocabulaire précis :
| Terme | Exemples | Rôle |
|---|---|---|
| Engine (moteur) | Docker, Podman | Build + run + UX complète |
| Runtime | containerd, CRI-O | Exécution uniquement, orienté CRI/Kubernetes |
| System containers | LXC, Incus | OS complet dans un conteneur (logique « VM légère ») |
L’analogie du transport maritime
Section intitulée « L’analogie du transport maritime »Le nom « conteneur » vient directement du transport maritime. Avant l’invention du conteneur standardisé dans les années 1950, charger un navire prenait des jours : chaque colis avait une forme différente, nécessitait une manutention spécifique.
Le conteneur maritime a tout changé : une boîte standardisée qui se charge de la même façon à Shanghai, Rotterdam ou Los Angeles. Peu importe ce qu’il y a dedans — le transport est identique.
Les conteneurs logiciels fonctionnent pareil : ils standardisent le déploiement d’applications. Peu importe le langage, les dépendances ou la configuration — si ça tourne dans un conteneur, ça tourne partout où le moteur est installé.
Ce que fait un moteur de conteneurs
Section intitulée « Ce que fait un moteur de conteneurs »| Fonction | Description |
|---|---|
| Créer des images | Construire des packages contenant application + dépendances |
| Exécuter des conteneurs | Lancer des instances isolées à partir des images |
| Gérer l’isolation | Séparer CPU, mémoire, réseau, filesystem entre conteneurs |
| Orchestrer le réseau | Permettre aux conteneurs de communiquer entre eux |
| Persister les données | Gérer les volumes pour conserver les données |
Technologies Linux sous-jacentes
Section intitulée « Technologies Linux sous-jacentes »Tous les moteurs de conteneurs reposent sur les mêmes primitives du noyau Linux :
- Namespaces : isolent ce que le conteneur voit (processus, réseau, utilisateurs, filesystem)
- Cgroups : limitent ce que le conteneur utilise (CPU, mémoire, I/O)
- Union filesystems : permettent le système de couches (layers) des images
La différence entre les moteurs réside dans l’architecture, l’interface utilisateur et les fonctionnalités supplémentaires.
Les 6 moteurs de conteneurs en détail
Section intitulée « Les 6 moteurs de conteneurs en détail »Docker — Le standard de facto
Section intitulée « Docker — Le standard de facto »
Docker a démocratisé les conteneurs en 2013. Aujourd’hui encore, c’est le moteur le plus utilisé, avec l’écosystème le plus riche.
Points forts :
- Documentation exhaustive et communauté massive
- Docker Hub : des millions d’images prêtes à l’emploi
- Docker Compose pour les applications multi-conteneurs
- Intégration native dans tous les IDE et outils CI/CD
Points faibles :
- Daemon root par défaut (risque sécurité)
- Docker Desktop payant pour les entreprises > 250 employés
- Plus lourd que les alternatives minimalistes
Quand choisir Docker :
- Apprentissage des conteneurs
- Développement local
- Équipes qui ont besoin de documentation abondante
Podman — Sécurité et compatibilité
Section intitulée « Podman — Sécurité et compatibilité »
Podman (POD Manager) est l’alternative de Red Hat, conçue pour répondre aux critiques de sécurité de Docker.
Points forts :
- Rootless par défaut : pas besoin de privilèges root (sur Linux)
- Sans daemon sur Linux : chaque commande est un processus isolé (sur macOS/Windows, Podman utilise une VM via
podman machine) - Compatible Docker : mêmes commandes, mêmes images, migration facile
- Support natif des pods (concept Kubernetes)
- 100% open source, pas de licence commerciale
Points faibles :
- Écosystème moins mature que Docker
- Quelques incompatibilités mineures avec Docker Compose
- Moins de documentation pour les débutants
Quand choisir Podman :
- Sécurité prioritaire (environnements réglementés)
- Éviter la licence Docker Desktop
- Préparation à Kubernetes (concept de pods)
Quel runtime pour Kubernetes : containerd ou CRI-O ?
Section intitulée « Quel runtime pour Kubernetes : containerd ou CRI-O ? »containerd est le moteur de conteneurs utilisé en interne par Docker et adopté nativement par Kubernetes.
Points forts :
- Léger et performant : fait uniquement l’exécution
- Runtime officiel Kubernetes depuis la suppression de dockershim
- Interface CRI native (Container Runtime Interface)
- Maintenu par la CNCF
Points faibles :
- Pas d’interface utilisateur conviviale (CLI
ctrbasique) - Pas de build d’images intégré (utiliser BuildKit ou Buildah)
- Destiné aux administrateurs expérimentés
Quand choisir containerd :
- Clusters Kubernetes en production
- Besoin d’un runtime minimal
- Infrastructure cloud-native
CRI-O — Kubernetes only
Section intitulée « CRI-O — Kubernetes only »CRI-O est un runtime minimaliste conçu exclusivement pour Kubernetes. Contrairement à containerd (qui peut être utilisé seul), CRI-O n’a de sens qu’avec K8s.
Points forts :
- Ultra-léger : fait uniquement ce que Kubernetes demande
- Moins de surface d’attaque que containerd
- Adopté par OpenShift (Red Hat)
Points faibles :
- Inutilisable hors Kubernetes
- Moins polyvalent que containerd
Quand choisir CRI-O :
- Clusters OpenShift
- Kubernetes avec exigences de sécurité strictes
LXC — Conteneurs système
Section intitulée « LXC — Conteneurs système »
LXC (Linux Containers) est la technologie de conteneurisation originelle de Linux, antérieure à Docker. Elle crée des conteneurs système : des environnements qui ressemblent à des VM légères.
Points forts :
- Conteneurs système complets : init, services, comme une VM
- Conteneurs non privilégiés (unprivileged) via user namespaces — le root dans le conteneur est mappé sur un UID non privilégié côté hôte
- Contrôle fin des ressources (cgroups avancés)
- Idéal pour migrer des workloads VM vers conteneurs
Points faibles :
- Plus bas niveau que Docker/Podman
- Pas de Dockerfile, pas de layers
- Courbe d’apprentissage plus raide
Quand choisir LXC :
- Virtualisation légère de systèmes complets
- Migration depuis des VM
- Besoin de plusieurs services dans un même conteneur
Incus — LXC avec des super-pouvoirs
Section intitulée « Incus — LXC avec des super-pouvoirs »
Incus est un fork de LXD (créé par Canonical), maintenu par Stéphane Graber. Il ajoute une couche de gestion avancée au-dessus de LXC.
Points forts :
- Gère conteneurs ET machines virtuelles (via QEMU)
- Conteneurs non privilégiés par défaut (user namespaces / idmap)
- Clustering natif pour la haute disponibilité
- API REST complète
- Images prêtes à l’emploi (Ubuntu, Debian, Alpine…)
Points faibles :
- Écosystème plus petit que Docker
- Moins adapté aux conteneurs applicatifs
Quand choisir Incus :
- Infrastructure unifiée conteneurs + VM
- Alternative légère à Proxmox
- Conteneurs système en production
Tableau comparatif détaillé
Section intitulée « Tableau comparatif détaillé »| Critère | Docker | Podman | containerd | CRI-O | LXC | Incus |
|---|---|---|---|---|---|---|
| Type de conteneurs | Applicatifs | Applicatifs | Applicatifs | Applicatifs | Système | Système + VM |
| Architecture | Daemon (dockerd) | Sans daemon (Linux)* | Daemon | Daemon | Bas niveau | Daemon + API |
| Unprivileged/Rootless | Optionnel | Par défaut (Linux) | Selon setup | Selon setup | ✅ Unprivileged | ✅ Par défaut |
| CLI conviviale | ✅ Excellente | ✅ Compatible Docker | ⚠️ Basique (ctr) | ❌ Via kubectl | ⚠️ Technique | ✅ Bonne |
| Build d’images | ✅ Dockerfile | ✅ Containerfile | ❌ Externe (BuildKit) | ❌ Non | ❌ Non | ❌ Non |
| Docker Compose | ✅ Natif | ✅ podman-compose | ⚠️ Via nerdctl | ❌ Non | ❌ Non | ❌ Non |
| Support Kubernetes | ⚠️ Via containerd | ✅ Pods natifs | ✅ Runtime officiel | ✅ Conçu pour K8s | ❌ Non | ❌ Non |
| Documentation | ✅ Abondante | ✅ Bonne | ⚠️ Technique | ⚠️ Technique | ⚠️ Limitée | ⚠️ Correcte |
| Licence | Apache 2.0 (Desktop payant)** | Apache 2.0 | Apache 2.0 | Apache 2.0 | LGPL | Apache 2.0 |
| Cas d’usage principal | Développement, CI/CD | Sécurité, Red Hat | Kubernetes | Kubernetes | VM légères | Infra hybride |
podman machine).
** Docker Desktop est payant pour les entreprises > 250 employés ou > 10M$ de revenus.
Outils complémentaires : les interfaces graphiques
Section intitulée « Outils complémentaires : les interfaces graphiques »La ligne de commande n’est pas pour tout le monde. Voici les interfaces graphiques pour gérer vos conteneurs :
| Outil | Type | Moteurs supportés | Idéal pour |
|---|---|---|---|
| Portainer CE | Interface web | Docker, Swarm, K8s | Équipes, gestion multi-environnements |
| LazyDocker | TUI (terminal) | Docker | Développeurs CLI qui veulent du visuel |
| Podman Desktop | Application desktop | Podman, Docker, K8s | Développeurs sur poste local |
| Docker Desktop | Application desktop | Docker | Windows/macOS (licence commerciale) |
Arbre de décision
Section intitulée « Arbre de décision »Utilisez ce guide pour choisir :
Recommandation : Docker
- Installez Docker
- Suivez le guide CLI Docker
- Apprenez Docker Compose
Quand vous serez à l’aise, vous pourrez explorer Podman ou containerd.
Recommandation : Podman
- Installez Podman
- Profitez du mode rootless par défaut
- Utilisez
podman-composepour vos stacks
Bonus : les commandes sont identiques à Docker — pas de réapprentissage.
Recommandation : containerd (ou CRI-O)
- containerd pour la polyvalence
- CRI-O si vous êtes sur OpenShift ou voulez le minimum
En développement local, gardez Docker ou Podman pour le confort.
Pièges fréquents à éviter
Section intitulée « Pièges fréquents à éviter »À retenir
Section intitulée « À retenir »-
Docker reste le standard pour débuter et pour le développement local — écosystème incomparable.
-
Podman = Docker + sécurité : rootless par défaut (Linux), sans daemon, commandes compatibles.
-
containerd est le runtime Kubernetes : léger, performant, mais sans interface conviviale. Utilisez nerdctl pour une CLI Docker-compatible.
-
LXC/Incus = conteneurs système : quand vous avez besoin d’un OS complet dans un conteneur, avec support unprivileged.
-
Les images sont compatibles : grâce au standard OCI, une image Docker fonctionne avec Podman, containerd, CRI-O.
-
La migration est possible : commencez par Docker, migrez vers Podman ou containerd quand le besoin se présente.
-
Les interfaces graphiques existent : Portainer, LazyDocker, Podman Desktop selon vos préférences.
Prochaines étapes
Section intitulée « Prochaines étapes »FAQ — Questions fréquentes
Section intitulée « FAQ — Questions fréquentes »Oui, Podman est conçu pour être compatible avec Docker à plusieurs niveaux :
Compatibilité CLI
# Les commandes sont identiques
podman run -d nginx
podman ps
podman build -t mon-image .
# Alias pour migration transparente
alias docker=podman
Ce qui fonctionne directement
| Élément | Compatibilité |
|---|---|
| Images Docker Hub | ✅ Complète |
| Dockerfile | ✅ (appelé Containerfile) |
| docker-compose.yml | ✅ Via podman-compose |
| Volumes, réseaux | ✅ Syntaxe identique |
| Variables d'env | ✅ Identique |
Différences mineures
- Podman utilise des registres multiples par défaut (pas seulement Docker Hub)
- Le socket est différent (
/run/podman/podman.sockvs/var/run/docker.sock) - Certaines options avancées Docker peuvent différer
Oui, containerd exécute les images Docker sans aucune modification grâce au standard OCI.
Pourquoi ça fonctionne
Docker et containerd utilisent le même format d'image défini par l'Open Container Initiative :
# Avec Docker
docker build -t mon-app:1.0 .
docker push registry.example.com/mon-app:1.0
# Avec containerd (via ctr ou nerdctl)
ctr images pull registry.example.com/mon-app:1.0
nerdctl run registry.example.com/mon-app:1.0
Standard OCI
| Spécification | Définit |
|---|---|
| OCI Image Format | Structure des images (layers, manifest) |
| OCI Runtime Spec | Comment exécuter un conteneur |
| OCI Distribution Spec | Comment pousser/puller des images |
Tous les moteurs modernes (Docker, Podman, containerd, CRI-O) implémentent ces standards → interopérabilité totale.
Depuis Kubernetes 1.24 (mai 2022), le composant dockershim a été supprimé du code de Kubernetes.
Pourquoi ce changement ?
┌─────────────────────────────────────────────┐
│ Kubernetes │
│ ┌─────────┐ ┌─────────┐ │
│ │ kubelet │────▶│ CRI │ (interface) │
│ └─────────┘ └────┬────┘ │
│ │ │
│ ┌─────────────┼─────────────┐ │
│ ▼ ▼ ▼ │
│ containerd CRI-O ❌ Docker │
│ (natif CRI) (natif CRI) (via shim) │
└─────────────────────────────────────────────┘
Docker n'implémente pas nativement la CRI (Container Runtime Interface). Kubernetes devait maintenir un adaptateur (dockershim) pour traduire les appels CRI vers l'API Docker.
Ce que ça change
| Aspect | Impact |
|---|---|
| Images Docker | ✅ Fonctionnent toujours (format OCI) |
| Dockerfile | ✅ Aucun changement |
| docker build | ✅ Continue de fonctionner |
| Runtime K8s | ⚠️ Utiliser containerd ou CRI-O |
En pratique
Vos images Docker fonctionnent sans modification. Seul le runtime sur les nœuds Kubernetes change.
Incus utilise par défaut des conteneurs non privilégiés (unprivileged), ce qui est différent mais comparable au mode rootless de Docker/Podman.
Unprivileged vs Rootless
| Mode | Mécanisme | Résultat |
|---|---|---|
| Rootless (Docker/Podman) | Le daemon tourne sans root | Conteneurs sans privilèges hôte |
| Unprivileged (LXC/Incus) | User namespaces + idmap | Root conteneur = UID non privilégié hôte |
Comment ça fonctionne dans Incus
# Créer un conteneur (unprivileged par défaut)
incus launch images:ubuntu/22.04 mon-conteneur
# Vérifier le mapping UID
incus config show mon-conteneur | grep -A5 "idmap"
# raw.idmap: both 0 100000 65536
# → root (0) dans le conteneur = UID 100000 sur l'hôte
Sécurité
Même si un attaquant obtient root dans le conteneur Incus, il n'a que les droits de l'utilisateur 100000 sur l'hôte → pas d'escalade de privilèges.
Docker Desktop est gratuit dans certains cas, payant dans d'autres.
Qui peut l'utiliser gratuitement ?
| Usage | Gratuit ? |
|---|---|
| Usage personnel | ✅ Oui |
| Éducation | ✅ Oui |
| Projets open source | ✅ Oui |
| Petites entreprises | ✅ Oui* |
| Grandes entreprises | ❌ Payant |
*Moins de 250 employés ET moins de 10 millions $ de revenus annuels.
Tarifs entreprise (2024)
- Pro : ~5$/mois/utilisateur
- Team : ~9$/mois/utilisateur
- Business : ~24$/mois/utilisateur
Alternatives gratuites
# Sur macOS/Windows
# Option 1 : Colima (Docker Engine dans une VM Lima)
brew install colima docker
colima start
# Option 2 : Podman + Podman Desktop
brew install podman
podman machine init && podman machine start
Nerdctl n'est pas un remplacement de Docker, mais une CLI compatible Docker pour piloter containerd directement.
Pourquoi nerdctl ?
containerd est un excellent runtime, mais sa CLI native (ctr) est basique :
# CLI ctr (complexe)
ctr images pull docker.io/library/nginx:latest
ctr run docker.io/library/nginx:latest nginx-ctr
# CLI nerdctl (familière)
nerdctl pull nginx
nerdctl run -d -p 80:80 nginx
Fonctionnalités supportées
| Commande | Support nerdctl |
|---|---|
run, exec, logs |
✅ |
build (Dockerfile) |
✅ (via BuildKit) |
compose up/down |
✅ |
| Volumes, réseaux | ✅ |
| Multi-plateforme | ✅ (mieux que Docker !) |
Installation
# Linux
wget https://github.com/containerd/nerdctl/releases/latest/download/nerdctl-full-linux-amd64.tar.gz
tar -xzf nerdctl-full-linux-amd64.tar.gz -C /usr/local
# Alias optionnel
alias docker=nerdctl
Quand utiliser nerdctl ?
- Vous avez containerd (Kubernetes) et voulez une CLI conviviale
- Vous voulez éviter Docker pour des raisons de licence
- Vous avez besoin de builds multi-plateformes avancés
La distinction fondamentale est ce qui tourne dans le conteneur :
Conteneur applicatif (Docker, Podman)
# Un processus = un conteneur
FROM node:20-alpine
COPY app.js .
CMD ["node", "app.js"] # UN seul processus
- Exécute un processus principal
- Pas de système d'init (pas de systemd)
- Philosophie microservices
- Éphémère par nature
Conteneur système (LXC, Incus)
# Un OS complet dans le conteneur
incus launch images:ubuntu/22.04 ma-vm-legere
incus exec ma-vm-legere -- systemctl status
# → systemd tourne, services multiples possibles
- Exécute un OS complet (init, services, utilisateurs)
- Ressemble à une VM mais partage le kernel
- Idéal pour migrer des workloads VM
- Persistent par nature
Comparaison
| Aspect | Applicatif | Système |
|---|---|---|
| Processus | Un seul | Multiples (init) |
| systemd | Non | Oui |
| SSH dans le conteneur | Anti-pattern | Normal |
| Cas d'usage | Microservices, CI/CD | Migration VM, serveurs classiques |
| Outils | Docker, Podman | LXC, Incus |
Oui, vous pouvez utiliser vos fichiers docker-compose.yml avec Podman de plusieurs façons.
Option 1 : podman-compose
# Installation
pip install podman-compose
# Utilisation (syntaxe identique)
podman-compose up -d
podman-compose logs -f
podman-compose down
Option 2 : Socket compatible Docker
# Activer le socket Podman compatible Docker
podman system service --time=0 &
export DOCKER_HOST=unix:///run/user/$(id -u)/podman/podman.sock
# Puis utiliser docker-compose normalement
docker-compose up -d
Option 3 : Podman 4.x intégré
# Podman 4+ supporte compose nativement
podman compose up -d
Compatibilité
| Fonctionnalité | Support |
|---|---|
| services, volumes, networks | ✅ |
| depends_on | ✅ |
| build | ✅ |
| healthcheck | ✅ |
| deploy (swarm) | ⚠️ Partiel |