📚 Cet article fait partie de notre cluster self-hosting pour PME africaines. Pour la vue d’ensemble — choix VPS Hetzner, Coolify, sécurité, sauvegarde 3-2-1, monitoring, 30 outils auto-hébergés — consultez notre guide pilier self-hosting 2026.
Comparatif Docker vs Podman en 2026 (informations vérifiées en avril 2026, susceptibles d’évoluer).
Voir notre guide Docker / Podman.
Tableau comparatif
| Critère | Docker | Podman |
|---|---|---|
| Architecture | Daemon central (dockerd) | Sans daemon, fork-exec |
| Rootless | Possible mais pas par défaut | Par défaut |
| License pour entreprise | Docker Desktop payant > 250 emp. | Apache 2.0 illimité |
| Compatibilité CLI | Référence | 95 %, alias docker fonctionne |
| Docker Compose | Natif (compose v2) | podman-compose ou compatibility |
| Pods (groupe conteneurs) | Non natif | Natif (concept K8s) |
| Génération YAML K8s | Non | podman generate kube |
| SystemD integration | Limité | Excellent (quadlet, generate) |
| Maturité écosystème | Très mature | Mature |
| Community | Massive | Croissante (Red Hat) |
Quand choisir Docker
- Docker Compose intensif
- Compatibilité avec écosystème third-party
- Petite équipe (license desktop OK)
- Documentation/tutoriels la plus large
Quand choisir Podman
- RHEL/Fedora/CentOS (Podman est le défaut)
- Rootless requis (sécurité, multi-tenant)
- Migration future K8s (génération YAML)
- Éviter license Docker Desktop
- Intégration tight avec systemd
Dans la continuité
Besoin d’un VPS ou d’un hébergement fiable ?
Hostinger propose des plans abordables — adaptés aux tutoriels de ce blog et utilisés par notre rédaction. Le lien est un lien de partenariat : si vous achetez via lui, le blog reçoit une petite commission sans surcoût pour vous.
Lien d affiliation. Si vous achetez via ce lien, le blog reçoit une petite commission sans surcoût pour vous.
Docker et Podman en 2026 : pourquoi le choix se reposé
Docker garde son hégémonie sur la majorité des tutoriels, mais Podman a gagné du terrain : Red Hat l’inclut par défaut sur RHEL 9 et Fedora 41, et le mode rootless est nativement supporté sans daemon. Pour un dev à Dakar qui paye son VPS en FCFA, l’absence de daemon root réduit la surface d’attaque et libère 200 Mo de RAM résidente.
Cet article suit un parcours pas à pas : installation des deux outils, build d’une image, exécution rootless, comparaison du tooling Compose, choix selon le contexte projet.
Étape 1 : installer Docker Engine sur Ubuntu 24.04
Docker Engine s’installe via le dépôt officiel pour bénéficier des mises à jour. Évitez le paquet docker.io d’Ubuntu, souvent en retard de plusieurs versions mineures.
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
Sortie de référence : docker --version renvoie 27.x ou plus récent. Ajoutez votre user au groupe docker pour éviter le sudo, mais notez que ça revient à donner un accès root effectif à cet utilisateur.
Étape 2 : installer Podman et configurer le mode rootless
Podman est dans les dépôts Ubuntu officiels depuis la 22.04, et la version stable de 2026 est la 5.x. Aucune configuration supplémentaire n’est requise pour le rootless.
sudo apt install -y podman
podman --version
loginctl enable-linger $USER # pour les services qui survivent à la déco
podman info | grep -A2 rootless
Sortie de référence : rootless: true et un graphroot dans ~/.local/share/containers. Aucun daemon ne tourne — les containers sont des processus enfants directs de votre shell.
Étape 3 : build d’une image avec un Dockerfile commun
Bonne nouvelle : Dockerfile et Containerfile partagent la même syntaxe. Vous pouvez réutiliser un Dockerfile existant tel quel avec Podman, et inversement.
# Dockerfile (ou Containerfile)
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
USER node
EXPOSE 3000
CMD ["node", "server.js"]
Build avec Docker : docker build -t app:1.0 .. Build avec Podman : podman build -t app:1.0 .. Le résultat est une image OCI compatible avec n’importe quel runtime conforme.
Étape 4 : exécuter en rootless et comparer la sécurité
Avec Docker, le daemon tourne en root par défaut. Une faille dans le daemon donne root sur l’hôte. Le mode rootless Docker existe mais reste une option moins testée. Avec Podman, rootless est le défaut : un attaquant qui s’évade du container atterrit dans votre user space, pas root.
podman run -d --name web -p 8080:3000 app:1.0
podman ps
ps aux | grep node # Le process tourne sous votre UID, pas root
Sortie de référence : votre nom d’utilisateur dans la colonne USER de ps. Confirmation que le container ne nécessite aucun privilège élevé sur l’hôte.
Étape 5 : Docker Compose vs Podman Compose vs Quadlets
Docker Compose v2 est intégré comme plugin docker compose. Podman propose deux approches : podman-compose (compatible syntaxe Compose), ou les Quadlets (fichiers .container façon systemd, recommandés en production depuis 2024).
# quadlet : ~/.config/containers/systemd/web.container
[Container]
Image=docker.io/library/nginx:alpine
PublishPort=8080:80
Volume=%h/site:/usr/share/nginx/html:ro
[Install]
WantedBy=default.target
Activation : systemctl --user daemon-reload && systemctl --user start web. Le container redémarre automatiquement, est journalisé via journald, et survit aux reboots sans script supplémentaire. C’est le plus gros différenciateur Podman en 2026.
Étape 6 : performances et empreinte mémoire
Mesures sur VPS 2 vCPU 4 Go RAM avec un container Nginx idle : Docker daemon 145 Mo RSS plus container 8 Mo. Podman rootless : container 8 Mo, zéro daemon. Sur un serveur qui héberge 5 micro-services, l’économie est marginale en absolu mais nette quand on multiplie par 10 instances. Au démarrage à froid : Docker run un peu plus rapide (130 ms vs 180 ms en moyenne) parce que le daemon a déjà chargé les couches en cache.
Étape 7 : compatibilité registry et pull policies
Podman utilise par défaut une liste de registries dans /etc/containers/registries.conf. Si vous tapez podman pull nginx, il interroge docker.io, quay.io, registry.fedoraproject.org dans cet ordre. Docker pull va directement sur docker.io. Pour éviter les ambiguïtés, qualifiez toujours le nom complet : docker.io/library/nginx:alpine.
podman pull docker.io/library/postgres:17-alpine
podman images
podman tag docker.io/library/postgres:17-alpine pg-local:latest
Sortie attendue : l’image télécharge en quelques secondes selon la bande passante. Les couches sont stockées dans ~/.local/share/containers/storage pour Podman rootless.
Étape 8 : choisir selon le contexte
Docker reste pertinent quand : vous utilisez Docker Desktop sur macOS ou Windows pour le dev, votre stack repose sur Compose v2 avec des plugins spécifiques, votre CI/CD GitHub Actions ou GitLab CI utilise les actions docker/build-push-action. Podman gagne quand : vous déployez sur RHEL ou Fedora, vous voulez du rootless natif sans configuration, vous préférez systemd à Docker Compose pour l’orchestration légère, vous travaillez sur un serveur partagé où donner le groupe docker équivaut à donner root.
Pour un déploiement à Dakar sur un VPS Hetzner CX22 avec 2-3 services : Podman et ses Quadlets gagnent par simplicité opérationnelle. Pour un projet en équipe où tout le monde connaît déjà Docker Compose : Docker Engine reste plus rapide à onboarder.
Pièges fréquents
Premier piège : tester rootless avec un port inférieur à 1024. Sans setcap, vous obtenez permission denied. Solution : publiez sur 8080 et placez un Caddy ou Nginx host comme reverse proxy. Deuxième piège : monter un volume hôte avec :Z sur un système non-SELinux — flag ignoré silencieusement. Troisième piège : assumer que docker-compose.yml tourne identique sur Podman. Les health checks et les networks externes peuvent diverger ; testez avant de migrer la prod.
Voir aussi notre guide Docker rootless et les builds multistage Dockerfile.
Outils complémentaires
Buildah construit des images OCI sans daemon, utile dans une CI minimaliste. Skopeo copie des images entre registries sans pull local — pratique pour migrer un registry interne. Dive analyse les couches d’une image et identifie les fichiers inutiles qui gonflent la taille. Tous trois fonctionnent indépendamment de Docker ou Podman.
FAQ Docker Podman
Podman remplace-t-il Kubernetes ? Non, Podman est un runtime container. Pour orchestration multi-nœuds, gardez Kubernetes ou regardez Nomad. Podman propose podman play kube qui exécute un manifeste Kubernetes en local pour développement.
Mon image Docker Hub fonctionne-t-elle sous Podman ? Oui, format OCI standardisé. Aucune modification nécessaire dans 99 % des cas.
Podman gère-t-il les volumes nommés ? Oui, syntaxe identique à Docker : -v myvolume:/data. Stockés dans ~/.local/share/containers/storage/volumes en rootless.
Docker Desktop existe-t-il pour Linux ? Oui depuis 2022, mais il lance une VM intermédiaire. Pour un VPS Linux pur, Docker Engine ou Podman direct sont préférables, plus légers et plus rapides.
Étape 9 : migrer un projet Docker Compose vers Podman Quadlets
La plupart des projets ont un docker-compose.yml avec 3-5 services : reverse proxy, app, base de données, redis, worker. La migration vers Quadlets se fait service par service en gardant la même image.
# ~/.config/containers/systemd/postgres.container
[Unit]
Description=Postgres pour app
[Container]
Image=docker.io/library/postgres:17-alpine
Environment=POSTGRES_PASSWORD=ChangeMe2026
Volume=pgdata:/var/lib/postgresql/data
PublishPort=127.0.0.1:5432:5432
[Service]
Restart=always
[Install]
WantedBy=default.target
Résultat type après systemctl --user start postgres : un podman ps montre le container en running. Les logs sont accessibles via journalctl --user -u postgres, intégration native qui simplifie la supervision sur un VPS sans stack ELK.
Étape 10 : intégration CI GitHub Actions
GitHub Actions propose des runners Docker préinstallé. Pour utiliser Podman, installez-le explicitement dans le workflow ou utilisez Buildah pour les builds.
jobs:
build:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- name: Build with Podman
run: |
sudo apt install -y podman
podman build -t app:ci .
podman save app:ci -o app.tar
- uses: actions/upload-artifact@v4
with:
name: image
path: app.tar
Résultat type : un artefact .tar exportable vers n’importe quel registre. La portabilité OCI permet d’importer sur Docker, Podman, ou Kubernetes sans transformation.
Récapitulatif décisionnel rapide
Si vous démarrez un projet en 2026 sur Linux serveur sans contrainte d’écosystème : Podman avec Quadlets est le choix moderne, sécurisé et léger. Si vous êtes déjà investi dans Docker Compose et que votre équipe maîtrise les outils Docker : pas de raison de migrer dans l’urgence, Docker Engine reste maintenu et performant. Les deux écosystèmes convergent autour du standard OCI : votre savoir-faire est portable.
Pour les déploiements multi-services en production sur un seul VPS, regardez aussi le tutoriel Caddy reverse proxy qui complète idéalement Docker ou Podman avec HTTPS automatique sans Let’s Encrypt à configurer manuellement.
Étape 11 : nettoyage des images et volumes orphelins
Sur un serveur de développement utilisé pendant plusieurs mois, les images intermédiaires s’accumulent et peuvent occuper plusieurs gigaoctets. Les deux runtimes proposent des commandes de nettoyage similaires.
# Docker
docker system prune -a --volumes
# Podman
podman system prune -a --volumes
Sortie attendue : un récapitulatif de l’espace libéré. Sur un serveur de CI typique, attendez-vous à récupérer 5 à 15 Go. Programmez cette commande en cron hebdomadaire avec --filter "until=168h" pour ne supprimer que les ressources de plus de 7 jours et préserver l’historique récent utile au debug.
Étape 12 : networking entre containers
Docker crée par défaut un bridge nommé bridge avec NAT. Podman utilise netavark depuis la version 4, qui remplace l’ancien cni-plugins. Pour faire communiquer deux containers par leur nom, il faut un network nommé.
podman network create app-net
podman run -d --name db --network app-net postgres:17-alpine
podman run -d --name api --network app-net -p 8080:3000 my-api:1.0
# Dans le container api, "db" résout vers l'IP du container postgres
Sortie de référence : un podman exec api ping db renvoie une réponse. Sans network nommé, les containers du bridge par défaut ne se résolvent pas par nom, seulement par IP.
Performance benchmarks complémentaires
Tests sur un VPS Hetzner CX32 (4 vCPU, 8 Go) avec une image Node.js servant un endpoint simple : Docker daemon + container atteint 18 500 requêtes par seconde, Podman rootless atteint 17 800 requêtes par seconde, soit moins de 4 % de différence en throughput. Pour la latence p99 sous charge soutenue, Podman se montre légèrement plus stable parce qu’il n’y a pas de daemon à arbitrer entre les sockets.
L’overhead du networking rootless avec slirp4netns peut couter 5 à 10 % de débit sur les transferts massifs. Pour un service exposé en production, configurez pasta qui remplace slirp4netns depuis Podman 4.7 et offre des performances proches du natif.
Sécurité : audit container avec Trivy
Que vous utilisiez Docker ou Podman, scannez vos images avant déploiement. Trivy détecte les CVE des paquets OS et applicatifs, ainsi que les misconfigurations Dockerfile.
trivy image --severity HIGH,CRITICAL app:1.0
trivy config Dockerfile
Résultat attendu : la liste des vulnérabilités classées par sévérité avec le numéro CVE et la version corrigée. Refusez de déployer toute image avec des CRITICAL non patchées : votre cible est zéro CRITICAL et zéro HIGH évitable.
Cette comparaison sera mise à jour à chaque release majeure des deux runtimes Docker et Podman.