Docker a longtemps dominé le paysage des conteneurs Linux, mais il traîne un défaut structurel : son daemon central dockerd tourne en root et ouvre un socket système que n’importe quel processus autorisé peut exploiter pour obtenir des privilèges root sur la machine hôte. Podman (Pod Manager), développé par Red Hat et la communauté open source, propose une architecture radicalement différente : pas de daemon, pas de root par défaut, et une compatibilité quasi-totale avec l’interface de Docker.
Depuis RHEL 8, Podman est le moteur de conteneurs officiel de l’écosystème Red Hat — Docker n’y est tout simplement pas supporté. La version 5.x, disponible depuis 2024, consolide cette maturité avec une intégration systemd native, le support complet des pods et une compatibilité OCI exemplaire. Cet article vous guide à travers l’installation, les fondamentaux du mode rootless, et la migration depuis un environnement Docker existant.
Que vous administriez un serveur de production, un serveur partagé multi-utilisateurs ou un pipeline CI/CD, les garanties de sécurité apportées par Podman méritent sérieusement d’être considérées.
Pourquoi choisir Podman plutôt que Docker ?
L’argument central de Podman est la sécurité par architecture. Là où Docker délègue l’exécution de chaque conteneur à un daemon root unique, Podman lance chaque conteneur comme un processus enfant direct de l’utilisateur courant. Le tableau ci-dessous résume les différences fondamentales :
| Aspect | Docker | Podman |
|---|---|---|
| Daemon central | dockerd en root |
Aucun daemon |
| Socket | /var/run/docker.sock (root) |
/run/user/$UID/podman/podman.sock |
| Processus conteneur | Enfant de dockerd (root) |
Processus utilisateur direct |
| Mode rootless | Opt-in depuis Docker 20.10 | Activé par défaut |
| User namespaces | Non par défaut | Oui par défaut |
| Pods natifs | Non | Oui (comme Kubernetes) |
| Intégration systemd | Limitée | Quadlet (natif) |
Le mode rootless expliqué
En mode rootless, Podman exploite les user namespaces du noyau Linux pour mapper les UIDs des processus conteneurisés vers des UIDs non-privilégiés sur l’hôte. Un processus qui « s’échappe » d’un conteneur se retrouve avec les droits d’un utilisateur ordinaire — sans aucun accès root réel sur la machine.
# Lancer un conteneur sans aucun sudo
podman run --rm -it nginx:alpine
# Vérifier l'UID réel sur l'hôte (UID non-privilégié mappé)
podman run --rm alpine id
# Affiche : uid=0(root) gid=0(root) — root dans le conteneur
# mais UID 100000+ sur l'hôte grâce au user namespace
Installation de Podman
Ubuntu 20.10+ et Debian 11+
Podman est disponible directement dans les dépôts officiels des distributions récentes :
sudo apt update
sudo apt install -y podman
podman --version
# → podman version 5.x
Pour Debian 10 ou Ubuntu 20.04, ajoutez le dépôt Kubic (project OBS) :
VERSION_ID=$(. /etc/os-release; echo $VERSION_ID)
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/Debian_${VERSION_ID}/ /"
| sudo tee /etc/apt/sources.list.d/kubic.list
curl -fsSL "https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/Debian_${VERSION_ID}/Release.key"
| sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kubic.gpg
sudo apt update && sudo apt install -y podman
Fedora, RHEL, CentOS Stream
sudo dnf install -y podman
podman --version
# → podman version 5.8.2
Commandes essentielles : Docker vs Podman
La compatibilité CLI est quasi-totale. Voici les commandes les plus utilisées :
| Docker | Podman |
|---|---|
docker run |
podman run |
docker ps |
podman ps |
docker build |
podman build |
docker pull / push |
podman pull / push |
docker exec |
podman exec |
docker logs |
podman logs |
docker network |
podman network |
docker volume |
podman volume |
docker inspect |
podman inspect |
docker-compose up |
podman-compose up |
Migration depuis Docker
Alias rapide pour une transition transparente
La migration la plus simple consiste à ajouter un alias dans votre shell :
# Dans ~/.bashrc ou ~/.zshrc
alias docker=podman
alias docker-compose=podman-compose
source ~/.bashrc
# Vos scripts existants fonctionnent sans modification
docker run --rm hello-world
docker ps
docker images
Certaines distributions proposent un paquet dédié qui crée ces alias automatiquement :
# Fedora/RHEL
sudo dnf install podman-docker
# Ubuntu/Debian
sudo apt install podman-docker
Migrer docker-compose vers podman-compose
podman-compose implémente la Compose Specification en utilisant Podman comme moteur. Vos fichiers docker-compose.yml existants sont utilisables sans modification :
# Installation
sudo dnf install -y podman-compose # Fedora/RHEL
sudo apt install -y podman-compose # Ubuntu/Debian
# ou via pip3
pip3 install podman-compose
# Utilisation identique à docker-compose
podman-compose up -d
podman-compose ps
podman-compose logs -f
podman-compose down
Passerelle vers Kubernetes avec podman kube
Podman offre une fonctionnalité unique : générer du YAML Kubernetes valide depuis vos conteneurs existants, facilitant une migration progressive vers l’orchestration :
# Créer un pod avec plusieurs conteneurs
podman pod create --name mon-app -p 8080:80
podman run -dt --pod mon-app nginx:alpine
podman run -dt --pod mon-app redis:alpine
# Générer le YAML Kubernetes depuis le pod
podman kube generate mon-app -f mon-app.yaml
# Déployer depuis le YAML (sans Kubernetes !)
podman kube play mon-app.yaml
# Arrêter et supprimer via le YAML
podman kube down mon-app.yaml
Gestion des services avec Quadlet (intégration systemd)
Podman s’intègre nativement avec systemd grâce à Quadlet, qui remplace l’ancienne commande podman generate systemd (dépréciée depuis Podman 4.4). Quadlet génère automatiquement des unités systemd à partir de fichiers de configuration simples au format INI.
Les fichiers portent l’extension .container et se placent dans :
- Système (root) :
/etc/containers/systemd/ - Utilisateur (rootless) :
$HOME/.config/containers/systemd/
Exemple : Nginx géré par systemd
Créez le fichier /etc/containers/systemd/nginx.container :
[Unit]
Description=Nginx containerisé
After=network-online.target
Wants=network-online.target
[Container]
Image=docker.io/library/nginx:alpine
PublishPort=8080:80
Volume=/srv/www:/usr/share/nginx/html:ro,z
ContainerName=nginx-prod
[Service]
Restart=always
TimeoutStartSec=60
[Install]
WantedBy=multi-user.target
# Recharger systemd — génère automatiquement nginx.service
sudo systemctl daemon-reload
# Activer et démarrer
sudo systemctl enable --now nginx.service
# Vérifier le statut
sudo systemctl status nginx.service
Mode rootless avec lingering
mkdir -p ~/.config/containers/systemd/
Créez ~/.config/containers/systemd/mon-app.container :
[Unit]
Description=Mon application
After=network-online.target
[Container]
Image=quay.io/monorg/mon-app:latest
PublishPort=3000:3000
Environment=NODE_ENV=production
[Service]
Restart=on-failure
[Install]
WantedBy=default.target
systemctl --user daemon-reload
systemctl --user enable --now mon-app.service
# Démarrage automatique même sans session active
loginctl enable-linger $USER
Bonnes pratiques en production
Registres de confiance
Configurez /etc/containers/registries.conf pour définir vos registres préférés et éviter des pull ambigus :
[registries.search]
registries = ['registry.access.redhat.com', 'quay.io', 'docker.io']
[registries.insecure]
registries = []
Volumes et SELinux
# Créer un volume nommé
podman volume create mes-donnees
# Monter avec :z pour le relabeling SELinux automatique
podman run -v mes-donnees:/data:z mon-image
Nettoyage et audit
# Supprimer images, conteneurs et volumes orphelins
podman system prune -a --volumes
# Vérifier l'espace disque utilisé par Podman
podman system df
# Inspecter la configuration de sécurité en vigueur
podman info | grep -A5 security
À lire également
- Docker sur Debian/Ubuntu : Installation, Configuration et Utilisation
- Gestion des services avec systemd sur Debian et Ubuntu
- Gestion des ressources cgroups v1/v2 avec LXC
- Installation et Configuration des Conteneurs LXC sur Linux