Aller au contenu
Conteneurs & Orchestration medium

Maîtriser Podman : conteneurs rootless, systemd et pods

6 min de lecture

logo podman

Podman est un moteur de conteneurs sans démon obligatoire (daemonless), pensé pour une utilisation “Linux native” : rootless par défaut, intégration propre à systemd via Quadlet, et support des pods façon Kubernetes. Sur macOS/Windows, il s’appuie sur Podman Machine (VM).

Retenir 3 piliers (et 1 bonus) :

  1. Rootless : les conteneurs tournent avec les droits de ton utilisateur, via les user namespaces.
  2. Daemonless : pas besoin d’un service central permanent pour gérer tes conteneurs au quotidien.
  3. Systemd-first : avec Quadlet, un conteneur devient un service propre (restart, logs, dépendances). Bonus) Pods & play kube : regrouper des conteneurs “style Kubernetes” et lancer des manifests sans cluster.

Si tu veux le “pourquoi” et les détails d’architecture : Concepts

Objectif : valider que Podman tourne, que tu sais exposer un port, lire des logs, monter un volume, puis nettoyer.

Fenêtre de terminal
# Vérifier la version
podman version
# Lancer un conteneur nginx
podman run -d --name web -p 8080:80 docker.io/library/nginx:alpine
# Vérifier qu'il tourne
curl http://localhost:8080
# Voir les logs
podman logs web
# Tester un volume (SELinux: :Z)
podman run -d --name web2 -v ~/html:/usr/share/nginx/html:Z -p 8081:80 nginx:alpine
# Nettoyer
podman rm -f web web2

L’objectif ici n’est pas de refaire une comparaison exhaustive : c’est de t’aider à décider vite, puis de t’envoyer vers les guides.

Comparaison architecture Docker vs Podman
  • Tu veux rootless par défaut (multi-utilisateurs, postes partagés, moindre risque).
  • Tu veux des services systemd propres (serveur, self-hosting, edge).
  • Tu veux rester proche de Kubernetes (pods, play kube, generate kube).
  • Tu veux éviter un daemon central obligatoire sur la machine.
  • Ton quotidien dépend d’un Docker Compose complexe et d’intégrations “Docker-only”.
  • Tu es dans un contexte où l’écosystème “Docker Desktop + tooling” est imposé.

Si tu veux un guide dédié “migrer sans douleur” : crée/ajoute une page Migration Docker → Podman et pointe-la ici.

Le mode rootless est le gros avantage de Podman, mais il a des implications “terrain”.

Podman utilise les user namespaces pour mapper les identités du conteneur vers des UIDs/GIDs non privilégiés sur l’hôte :

Hôte Conteneur
─────────────────────────────────────────────
UID 1000 (vous) UID 0 (root)
UID 100000-165535 (subuid) UID 1-65535

Les 3 frictions les plus courantes (et les bons réflexes)

Section intitulée « Les 3 frictions les plus courantes (et les bons réflexes) »
FrictionSymptômeRéflexe
Ports basbind: permission denied sur 80/443utiliser ≥1024 ou sysctl
Volumesfichiers “root:root” / permission denied--userns=keep-id ou options volume
RéseauDNS/perf surprenantsréseau dédié + backend rootless adapté

En pratique, c’est souvent le réseau rootless qui “surprend”. L’idée : tu veux un réseau où les conteneurs se résolvent par nom et où la perf n’est pas catastrophique.

Fenêtre de terminal
# Créer un réseau applicatif (résolution par nom)
podman network create app-network
# Exemple simple : un conteneur "db" et un client
podman run -d --network app-network --name db postgres:16
podman run --rm --network app-network alpine ping -c 1 db

Si tu veux du “prod-like” sur un serveur Linux, Quadlet est le point d’inflexion : un conteneur devient un service (journalctl, restart, dépendances).

Quadlet est la voie recommandée par l’écosystème Podman, et podman generate systemd est marqué comme déprécié (toujours utilisable, mais plus la direction). ([GitHub][1])

[Container]
Image=docker.io/library/nginx:alpine
PublishPort=8080:80
Volume=/data/nginx:/usr/share/nginx/html:ro,Z
[Service]
Restart=always
[Install]
WantedBy=default.target

Activation (rootless) :

Fenêtre de terminal
mkdir -p ~/.config/containers/systemd
# placer nginx.container dans ce dossier
systemctl --user daemon-reload
systemctl --user start nginx
systemctl --user enable nginx
journalctl --user -u nginx -f

Bonus — Pods et intégration Kubernetes (sans cluster)

Section intitulée « Bonus — Pods et intégration Kubernetes (sans cluster) »

Quand tu as besoin d’un “mini-Kubernetes mental model” sans déployer un cluster, les pods Podman sont parfaits.

Fenêtre de terminal
podman pod create --name webapp -p 8080:80
podman run -d --pod webapp --name db \
-e POSTGRES_PASSWORD=secret postgres:16-alpine
podman run -d --pod webapp --name app \
-e DATABASE_URL=postgres://postgres:secret@localhost:5432 \
mon-app:latest

podman play kube : exécuter un manifest sans cluster

Section intitulée « podman play kube : exécuter un manifest sans cluster »
Fenêtre de terminal
podman play kube deployment.yaml
podman play kube deployment.yaml --down
Fenêtre de terminal
podman generate kube webapp > webapp.yaml

Sur macOS et Windows, les conteneurs Linux nécessitent une VM, car ils dépendent du kernel Linux.

Fenêtre de terminal
podman machine init
podman machine start
podman run -d -p 8080:80 nginx
podman machine ssh

Choisis ton point d’entrée, puis avance module par module :

ModuleObjectif
Installationêtre opérationnel (Linux/macOS/Windows)
Commandes de baserun/ps/exec/logs/images/nettoyage
Run avancérootless, namespaces, sécurité, options utiles
Volumespersistance + permissions
RéseauxDNS, ports, isolation, multi-tier
BuildContainerfile, multi-stage, optimisation

Évolutions à connaître (pour éviter les surprises)

Section intitulée « Évolutions à connaître (pour éviter les surprises) »

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.