Podman
Podman est un moteur de conteneurs open source développé par Red Hat, conçu comme une alternative "daemonless" à Docker : pas de processus en arrière-plan tournant en root, chaque commande podman s'exécute directement, ce qui permet nativement l'exécution en rootless (sans privilèges administrateur). Sa syntaxe reprend volontairement celle de Docker au point que alias docker=podman fonctionne dans la grande majorité des cas. Mais Podman ajoute des concepts propres, notamment les pods (groupes de conteneurs partageant le même namespace réseau, comme dans Kubernetes). Référence : documentation officielle Podman.
Différences clés avec Docker
- Pas de démon : chaque commande
podmanest un processus indépendant, il n'y a pas d'équivalent audockerdqui tourne en permanence en root. - Rootless par défaut : un utilisateur non-root peut lancer des conteneurs sans
sudo, grâce aux user namespaces. Les conteneurs rootless restent limités sur certains points (ports < 1024, certaines options réseau). - Pods natifs : Podman peut regrouper plusieurs conteneurs dans un pod partageant le même namespace réseau (localhost entre eux), à l'image d'un pod Kubernetes.
- Pas de Compose natif historiquement :
podman-compose(projet tiers) oupodman play kube(à partir d'un manifeste Kubernetes) remplissent ce rôle ; Podman supporte aussi désormaispodman composeen s'appuyant sur Docker Compose en arrière-plan si disponible. - Systemd intégré :
podman generate systemd(remplacé progressivement par Quadlet) permet de générer directement des units systemd pour gérer les conteneurs comme des services.
Images
# Construire une image à partir d'un Containerfile (ou Dockerfile, les deux sont acceptés)
podman build -t mon-app:latest .
# Pointer vers un fichier précis
podman build -t mon-app:latest -f Containerfile.prod .
# Lister les images locales
podman images
# Télécharger une image
podman pull docker.io/library/nginx:1.27
# Pousser une image vers un registre
podman push mon-registre.fr/mon-app:latest
# Tagger une image
podman tag mon-app:latest mon-registre.fr/mon-app:latest
# Supprimer une image
podman rmi mon-app:latest
# Supprimer les images non utilisées
podman image prune
# Inspecter les métadonnées d'une image
podman inspect mon-app:latestContrairement à Docker qui a un registre par défaut implicite (Docker Hub), Podman demande généralement de préciser le registre complet (
docker.io/library/nginx) sauf configuration de registres par défaut dans/etc/containers/registries.conf.
Conteneurs
# Créer et démarrer un conteneur
podman run nginx
# En arrière-plan, avec un nom explicite
podman run -d --name mon-nginx nginx
# Avec un port exposé (hôte:conteneur)
podman run -d -p 8080:80 --name mon-nginx nginx
# Avec un volume monté
podman run -d -v /data/nginx:/usr/share/nginx/html:Z nginx
# En mode interactif
podman run -it ubuntu bash
# Suppression automatique à l'arrêt
podman run --rm -it ubuntu bash
# Lister les conteneurs en cours d'exécution
podman ps
# Lister tous les conteneurs
podman ps -a
# Démarrer / arrêter / redémarrer
podman start mon-nginx
podman stop mon-nginx
podman restart mon-nginx
# Supprimer un conteneur arrêté
podman rm mon-nginx
# Forcer la suppression d'un conteneur en cours d'exécution
podman rm -f mon-nginx
# Supprimer tous les conteneurs arrêtés
podman container pruneLe suffixe
:Zsur un volume (-v host:container:Z) est spécifique aux systèmes avec SELinux activé (Fedora, RHEL, CentOS...) : il indique à Podman de relabelliser le contenu pour que le conteneur puisse y accéder. Sans ça, un conteneur rootless sur un système SELinux se heurte souvent à desPermission deniedmalgré des droits Unix corrects.
Exécuter des commandes dans un conteneur
# Ouvrir un shell dans un conteneur en cours d'exécution
podman exec -it mon-nginx bash
# Commande ponctuelle
podman exec mon-nginx nginx -tLogs et supervision
# Logs d'un conteneur
podman logs mon-nginx
# Suivre en direct
podman logs -f mon-nginx
# Statistiques d'utilisation des ressources
podman stats
# Sans rafraîchissement continu
podman stats --no-stream mon-nginx
# Processus en cours dans le conteneur
podman top mon-nginxPods
Un pod regroupe plusieurs conteneurs qui partagent le même namespace réseau (et donc localhost entre eux) et, en option, le même namespace IPC/PID utile pour des architectures type "sidecar" (une app + son agent de logs, par exemple) sans passer par un réseau Docker dédié.
# Créer un pod vide, avec un port exposé au niveau du pod
podman pod create --name mon-pod -p 8080:80
# Lancer un conteneur DANS ce pod
podman run -d --pod mon-pod --name web nginx
podman run -d --pod mon-pod --name sidecar mon-agent-logs
# Lister les pods
podman pod ps
# Voir le détail d'un pod et de ses conteneurs
podman pod inspect mon-pod
# Démarrer / arrêter tous les conteneurs d'un pod d'un coup
podman pod start mon-pod
podman pod stop mon-pod
# Supprimer un pod (et ses conteneurs si -f)
podman pod rm mon-pod
podman pod rm -f mon-podRéseaux
# Lister les réseaux
podman network ls
# Créer un réseau dédié
podman network create mon-reseau
# Démarrer un conteneur sur ce réseau
podman run -d --network mon-reseau --name app mon-app:latest
# Inspecter un réseau
podman network inspect mon-reseau
# Supprimer un réseau
podman network rm mon-reseauVolumes
# Lister les volumes
podman volume ls
# Créer un volume nommé
podman volume create mes-donnees
# Utiliser ce volume dans un conteneur
podman run -d -v mes-donnees:/var/lib/mysql mysql
# Inspecter un volume
podman volume inspect mes-donnees
# Supprimer un volume non utilisé
podman volume rm mes-donneesCopier des fichiers entre hôte et conteneur
podman cp fichier.txt mon-nginx:/tmp/fichier.txt
podman cp mon-nginx:/etc/nginx/nginx.conf ./nginx.confDéployer depuis un manifeste Kubernetes
Podman peut lire (et générer) des manifestes YAML Kubernetes pour créer des pods localement, pratique pour tester une définition avant de la pousser sur un vrai cluster.
# Démarrer les conteneurs/pods décrits dans un manifeste Kubernetes
podman play kube mon-manifeste.yaml
# Arrêter et supprimer ce qui a été créé par ce manifeste
podman play kube --down mon-manifeste.yaml
# Générer un manifeste Kubernetes à partir d'un pod existant
podman generate kube mon-pod > mon-manifeste.yamlIntégration systemd (services persistants)
# Générer les fichiers unit systemd pour un conteneur ou un pod existant
podman generate systemd --new --name mon-nginx > mon-nginx.service
# Déplacer le fichier généré et l'activer (exemple utilisateur rootless)
mkdir -p ~/.config/systemd/user
mv mon-nginx.service ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable --now mon-nginx.serviceDepuis Podman 4.4+, Quadlet (fichiers
.container,.pod,.volumedans~/.config/containers/systemd/) remplace progressivementgenerate systemdcomme méthode recommandée pour définir des conteneurs en tant que services systemd, avec une syntaxe déclarative plus proche d'un fichier compose.
Podman machine (macOS / Windows)
Podman ayant besoin d'un noyau Linux pour les namespaces, podman machine gère une VM Linux légère sur les systèmes qui n'en ont pas nativement.
# Initialiser la VM Podman
podman machine init
# Démarrer / arrêter la VM
podman machine start
podman machine stop
# Lister les machines et leur état
podman machine list
# Supprimer la VM
podman machine rmNettoyage global du système
# Aperçu de l'espace disque utilisé
podman system df
# Nettoyer conteneurs arrêtés, réseaux et images inutilisées
podman system prune
# Version plus agressive, incluant les images non utilisées par un conteneur
podman system prune -aInformations générales
# Informations sur l'installation (rootless/rootful, runtime OCI utilisé, stockage...)
podman info
# Version du client
podman version
# Rechercher une image sur les registres configurés
podman search nginx
# Se connecter / déconnecter d'un registre
podman login mon-registre.fr
podman logout mon-registre.frAide-mémoire rapide
| Situation | Commande |
|---|---|
| Démarrer un conteneur en arrière-plan avec un port exposé | podman run -d -p 8080:80 --name app image |
| Entrer dans un conteneur en cours d'exécution | podman exec -it nom_conteneur bash |
| Grouper plusieurs conteneurs sur le même réseau local | podman pod create --name mon-pod |
| Générer un service systemd pour un conteneur | podman generate systemd --new --name conteneur |
| Déployer depuis un manifeste Kubernetes | podman play kube manifeste.yaml |
| Démarrer la VM Podman (macOS/Windows) | podman machine start |
| Tout nettoyer (conteneurs, images, réseaux inutilisés) | podman system prune -a |
Source : documentation officielle Podman
