
Quand vous travaillez avec des conteneurs, vous passez la majorité de votre temps à lancer des conteneurs, consulter leurs logs, exécuter des commandes dedans et nettoyer les ressources. Podman est un moteur de conteneurs rootless compatible Docker qui vous permet de gérer images et conteneurs sans privilèges root.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Rechercher, télécharger et gérer des images
- Lancer des conteneurs en avant-plan et arrière-plan
- Interagir avec des conteneurs en cours d’exécution (exec, logs, cp)
- Exposer des ports et monter des volumes
- Diagnostiquer et nettoyer vos ressources
La commande podman dans l’écosystème conteneurs
Section intitulée « La commande podman dans l’écosystème conteneurs »Podman fait partie d’un écosystème d’outils complémentaires. Chaque outil a sa spécialité :
| Commande | Spécialité | Quand l’utiliser |
|---|---|---|
podman | Exécuter et gérer les conteneurs | run, ps, exec, logs, stop, rm |
buildah | Construire des images | Build avancé, multi-stage, rootless |
skopeo | Copier des images entre registries | Mirroring, air-gap, inspection |
podman-compose | Orchestrer plusieurs conteneurs | Stack multi-conteneurs (comme docker-compose) |
Combinaisons fréquentes :
# buildah + podman : construire puis lancerbuildah build -t mon-app . && podman run mon-app
# skopeo + podman : copier puis exécuterskopeo copy docker://nginx:alpine oci-archive:nginx.tarpodman load < nginx.tar && podman run nginx:alpine
# podman + grep : filtrer les logspodman logs mon-app | grep ERRORComprendre Podman en 2 min
Section intitulée « Comprendre Podman en 2 min »🧠 Modèle mental — Comment fonctionne Podman
podman = Image → Conteneur → Processus isolé (rootless par défaut)
Points clés
- Une image est un modèle en lecture seule (template)
- Un conteneur est une instance exécutable d'une image
- Chaque conteneur est un processus isolé supervisé par conmon
- Mode rootless par défaut = pas de privilèges root nécessaires
- Les données sont perdues à la suppression du conteneur (sauf volumes)
- Les commandes sont compatibles Docker (alias docker=podman)
Règles d'or
Vocabulaire essentiel
- image
- Modèle en lecture seule contenant l'application et ses dépendances
- conteneur
- Instance exécutable d'une image (processus isolé)
- registry
- Serveur qui stocke et distribue les images (Docker Hub, Quay.io)
- tag
- Version ou variante d'une image (alpine:3.20, nginx:1.25)
- volume
- Stockage persistant indépendant du cycle de vie du conteneur
- port mapping
- Liaison port hôte → port conteneur (-p 8080:80)
📚 Pour aller plus loin — 8 options avancées
- rootless
- Exécution sans privilèges root (user namespaces)
- conmon
- Superviseur léger qui maintient le conteneur
- pod
- Groupe de conteneurs partageant le même namespace réseau
- bind mount
- Montage direct d'un dossier hôte dans le conteneur
- overlay
- Système de fichiers en couches pour les images
- entrypoint
- Commande par défaut exécutée au démarrage du conteneur
- CMD
- Arguments par défaut passés à l'entrypoint
- namespace
- Isolation des ressources (PID, network, mount, user)
Contrairement à Docker qui nécessite un daemon root, Podman exécute chaque conteneur comme un processus indépendant supervisé par conmon. C’est rootless par défaut.
Syntaxe complète
Section intitulée « Syntaxe complète »podman <commande> [options] [arguments]Commandes les plus utilisées :
| Commande | Description | Exemple |
|---|---|---|
run | Créer et démarrer un conteneur | podman run -d nginx |
ps | Lister les conteneurs | podman ps -a |
exec | Exécuter une commande dans un conteneur | podman exec -it web sh |
logs | Afficher les logs | podman logs -f web |
stop / start | Arrêter / démarrer un conteneur | podman stop web |
rm | Supprimer un conteneur | podman rm web |
images | Lister les images | podman images |
pull | Télécharger une image | podman pull alpine:3.20 |
Les concepts clés
Section intitulée « Les concepts clés »Podman repose sur quelques concepts essentiels :
| Concept | Ce que c’est | Exemple |
|---|---|---|
| Image | Modèle en lecture seule | nginx:alpine, alpine:3.20 |
| Conteneur | Instance exécutable d’une image | podman run nginx crée un conteneur |
| Registry | Serveur de distribution d’images | Docker Hub, Quay.io, GHCR |
| Volume | Stockage persistant | podman run -v data:/app/data |
| Port mapping | Exposition réseau | podman run -p 8080:80 |
Les options essentielles de run
Section intitulée « Les options essentielles de run »La commande podman run est la plus utilisée. Voici ses options principales :
| Option | Forme longue | Description |
|---|---|---|
-d | --detach | Exécuter en arrière-plan |
-it | --interactive --tty | Mode interactif avec terminal |
--rm | Supprimer après arrêt | |
--name | Nommer le conteneur | |
-p | --publish | Mapper un port hôte:conteneur |
-e | --env | Définir une variable d’environnement |
-v | --volume | Monter un volume |
Formes courantes :
# Conteneur jetable interactifpodman run -it --rm alpine:3.20 sh
# Service en arrière-planpodman run -d --name web -p 8080:80 nginx:alpine
# Avec volume et variable d'environnementpodman run -d --name db -v pgdata:/var/lib/postgresql/data \ -e POSTGRES_PASSWORD=secret postgres:16Cycle de vie d’un conteneur
Section intitulée « Cycle de vie d’un conteneur »Un conteneur passe par plusieurs états :
Created → Running → Paused/Exited → Removed| État | Signification | Commande pour y arriver |
|---|---|---|
| Created | Conteneur créé mais pas démarré | podman create |
| Running | En cours d’exécution | podman start ou podman run |
| Paused | Processus gelés (SIGSTOP) | podman pause |
| Exited | Arrêté (code de sortie) | podman stop ou fin du processus |
| Removed | Supprimé | podman rm |
Erreurs typiques (et solutions)
Section intitulée « Erreurs typiques (et solutions) »| Erreur | Cause | Solution |
|---|---|---|
name already in use | Conteneur existant avec ce nom | podman rm -f nom ou --replace |
image not known | Image non téléchargée | podman pull docker.io/library/image:tag |
address already in use | Port déjà utilisé | Changer le port (-p 8081:80) |
permission denied | Problème rootless/SELinux | --userns=keep-id ou :Z sur volume |
| Conteneur s’arrête immédiatement | CMD se termine | Utiliser un processus persistant |
Gestion des images
Section intitulée « Gestion des images »Une image est un modèle en lecture seule contenant l’application et ses dépendances.
Rechercher et télécharger
Section intitulée « Rechercher et télécharger »# Rechercher une imagepodman search docker.io/alpine --limit 3
# Télécharger une image (avec tag explicite)podman pull docker.io/library/alpine:3.20
# Lister les images localespodman imagesRésultat podman images :
REPOSITORY TAG IMAGE ID CREATED SIZEdocker.io/library/alpine 3.20 cc9071bd1610 2 weeks ago 8.1 MBdocker.io/library/nginx alpine b76de378d572 8 days ago 63.5 MBInspecter et supprimer
Section intitulée « Inspecter et supprimer »# Détails d'une image (format Go template)podman image inspect alpine:3.20 --format 'ID: {{.Id}} | Size: {{.Size}}'
# Supprimer une imagepodman rmi alpine:3.20
# Supprimer toutes les images non utiliséespodman image prune -aExécution de conteneurs
Section intitulée « Exécution de conteneurs »Conteneur simple (avant-plan)
Section intitulée « Conteneur simple (avant-plan) »podman run docker.io/library/alpine:3.20 echo "Hello Podman"Le conteneur exécute la commande, affiche le résultat, puis s’arrête.
Conteneur en arrière-plan
Section intitulée « Conteneur en arrière-plan »podman run -d --name mon-nginx -p 8080:80 docker.io/library/nginx:alpine| Option | Description |
|---|---|
-d | Détaché (arrière-plan) |
--name mon-nginx | Nom explicite pour référencer facilement |
-p 8080:80 | Port 8080 sur l’hôte → port 80 du conteneur |
Vérification :
curl localhost:8080Conteneur interactif
Section intitulée « Conteneur interactif »podman run -it --rm docker.io/library/alpine:3.20 shVous obtenez un shell dans le conteneur. Tapez exit pour quitter. --rm supprime le conteneur à la sortie.
Lister et inspecter
Section intitulée « Lister et inspecter »Lister les conteneurs
Section intitulée « Lister les conteneurs »# Conteneurs en cours d'exécutionpodman ps
# Tous les conteneurs (y compris arrêtés)podman ps -a
# Format personnalisépodman ps --format "{{.Names}}: {{.Image}} ({{.Status}})"Inspecter un conteneur
Section intitulée « Inspecter un conteneur »# Configuration complète (JSON)podman inspect mon-nginx
# Extraire un champ spécifiquepodman inspect --format '{{.NetworkSettings.IPAddress}}' mon-nginx
# Voir les processuspodman top mon-nginx
# Voir les ports exposéspodman port mon-nginxInteragir avec un conteneur
Section intitulée « Interagir avec un conteneur »Exécuter une commande
Section intitulée « Exécuter une commande »# Commande simplepodman exec mon-nginx cat /etc/nginx/nginx.conf
# Shell interactifpodman exec -it mon-nginx sh
# En tant que root (même en rootless)podman exec -u root mon-nginx whoamiConsulter les logs
Section intitulée « Consulter les logs »# Tous les logspodman logs mon-nginx
# Dernières 20 lignespodman logs --tail 20 mon-nginx
# Suivre en temps réel (comme tail -f)podman logs -f mon-nginx
# Avec timestampspodman logs -t mon-nginxCopier des fichiers
Section intitulée « Copier des fichiers »# Vers le conteneurpodman cp config.yml mon-nginx:/etc/nginx/
# Depuis le conteneurpodman cp mon-nginx:/etc/nginx/nginx.conf ./backup/
# Vérifier les modifications du filesystempodman diff mon-nginxContrôler le cycle de vie
Section intitulée « Contrôler le cycle de vie »# Arrêter (SIGTERM puis SIGKILL après timeout)podman stop mon-nginx
# Arrêter immédiatement (SIGKILL)podman kill mon-nginx
# Redémarrerpodman restart mon-nginx
# Démarrer un conteneur arrêtépodman start mon-nginx
# Mettre en pause / reprendrepodman pause mon-nginxpodman unpause mon-nginxSurveillance et statistiques
Section intitulée « Surveillance et statistiques »# Statistiques en temps réelpodman stats
# Snapshot (sans rafraîchissement)podman stats --no-stream
# Espace disque utilisépodman system dfExemple de sortie podman stats :
ID NAME CPU % MEM USAGE / LIMIT MEM % NET IO PIDSa79693ad4f28 mon-nginx 0.04% 10.89MB / 50.28GB 0.02% 110B / 430B 17Nettoyage des ressources
Section intitulée « Nettoyage des ressources »# Supprimer un conteneur arrêtépodman rm mon-nginx
# Forcer la suppression (même si running)podman rm -f mon-nginx
# Supprimer tous les conteneurs arrêtéspodman rm $(podman ps -aq --filter status=exited)
# Nettoyage automatique (conteneurs + images non utilisées)podman system prune
# Nettoyage complet (inclut volumes orphelins)podman system prune -a --volumes -fSauvegarder et transférer
Section intitulée « Sauvegarder et transférer »# Exporter une image en archive tarpodman save docker.io/library/alpine:3.20 -o alpine.tar
# Importer une archivepodman load -i alpine.tar
# Taguer une image (créer un alias)podman tag alpine:3.20 mon-registre/alpine:stable
# Exporter un conteneur en imagepodman commit mon-nginx mon-nginx-custom:v1Les patterns de commandes courants
Section intitulée « Les patterns de commandes courants »Maintenant que vous comprenez les commandes de base, voici des patterns prêts à l’emploi.
Ces recettes couvrent les cas d'usage les plus fréquents. Cliquez sur un pattern pour voir la formule complète et un exemple prêt à copier.
Conteneur interactif jetable Base Tester une commande ou explorer une image.
podman run -it --rm alpine:3.20 sh
podman run -it --rm <image> <shell> podman run -it --rm alpine:3.20 sh -
-it— Interactif + TTY -
--rm— Supprime après arrêt
Service en arrière-plan Base Lancer un service qui tourne en continu.
podman run -d --name mon-nginx nginx:alpine
podman run -d --name <nom> <image> podman run -d --name mon-nginx nginx:alpine -
-d— Detached (arrière-plan) -
--name— Nommer le conteneur
Exposer un port Base Rendre un service accessible depuis l'hôte.
podman run -d -p 8080:80 --name web nginx:alpine
podman run -d -p <hôte>:<conteneur> <image> podman run -d -p 8080:80 --name web nginx:alpine -
-p 8080:80— Port hôte 8080 → port conteneur 80 -
-p 80— Port aléatoire hôte → 80 conteneur
Monter un dossier Base Partager des fichiers entre l'hôte et le conteneur.
podman run -v ~/data:/app/data:Z alpine ls /app/data
podman run -v <chemin_hôte>:<chemin_conteneur> <image> podman run -v ~/data:/app/data:Z alpine ls /app/data -
-v src:dest— Bind mount source → destination -
:Z— SELinux relabeling (si applicable) -
:ro— Lecture seule
Variables d'environnement Base Configurer l'application via l'environnement.
podman run -e POSTGRES_PASSWORD=secret -e POSTGRES_DB=app postgres:16
podman run -e VAR=valeur <image> podman run -e POSTGRES_PASSWORD=secret -e POSTGRES_DB=app postgres:16 -
-e VAR=val— Définit une variable -
--env-file— Charge depuis un fichier
Debug dans un conteneur Base Inspecter un conteneur en cours d'exécution.
podman exec -it mon-nginx sh
podman exec -it <conteneur> <shell> podman exec -it mon-nginx sh -
-it— Interactif + TTY -
-u root— Exécuter en tant que root
Suivre les logs en temps réel Base Monitorer l'activité d'un conteneur.
podman logs -f --tail 50 mon-nginx
podman logs -f <conteneur> podman logs -f --tail 50 mon-nginx -
-f— Suivre en temps réel (follow) -
--tail N— Dernières N lignes -
-t— Afficher les timestamps
Nettoyage complet Inter. Supprimer toutes les ressources inutilisées.
podman system prune -a --volumes -f
podman system prune -a podman system prune -a --volumes -f -
-a— Inclut les images non utilisées -
--volumes— Inclut les volumes orphelins -
-f— Sans confirmation
Extraire des infos avec format Inter. Obtenir une information précise d'un conteneur.
podman inspect --format '{{.NetworkSettings.IPAddress}}' mon-nginx
podman inspect --format '{{.Field}}' <conteneur> podman inspect --format '{{.NetworkSettings.IPAddress}}' mon-nginx -
--format— Template Go pour extraire des champs -
{{.Id}}— ID complet -
{{.State.Status}}— État du conteneur
Limiter les ressources Inter. Contrôler CPU et mémoire d'un conteneur.
podman run -d --memory=512m --cpus=1 --name limited nginx:alpine
podman run --memory=<limit> --cpus=<N> <image> podman run -d --memory=512m --cpus=1 --name limited nginx:alpine -
--memory— Limite mémoire (512m, 1g) -
--cpus— Nombre de CPUs (0.5, 1, 2) -
--pids-limit— Limite de processus
Vérification de santé Inter. Surveiller automatiquement la santé d'un service.
podman run -d --health-cmd="curl -f http://localhost/" --health-interval=30s nginx:alpine
podman run --health-cmd="<cmd>" --health-interval=<durée> <image> podman run -d --health-cmd="curl -f http://localhost/" --health-interval=30s nginx:alpine -
--health-cmd— Commande de vérification -
--health-interval— Intervalle entre checks -
--health-retries— Échecs avant unhealthy
Copier des fichiers Base Transférer des fichiers depuis/vers un conteneur.
podman cp mon-nginx:/etc/nginx/nginx.conf ./backup/
podman cp <src> <dest> podman cp mon-nginx:/etc/nginx/nginx.conf ./backup/ -
conteneur:chemin— Chemin dans le conteneur -
chemin_local— Chemin sur l'hôte
Aucune recette ne correspond à votre recherche.
Les pièges à éviter
Section intitulée « Les pièges à éviter »Ces erreurs courantes peuvent faire perdre du temps ou causer des dégâts. Les pièges les plus critiques sont affichés en premier.
Permission denied sur volume podman run -v ~/data:/app/data image → Permission denied
Danger
podman run -v ~/data:/app/data image → Permission denied
podman run --userns=keep-id -v ~/data:/app/data image
# ou avec SELinux
podman run -v ~/data:/app/data:Z image Perte de données sans volume podman run postgres... puis podman rm → données perdues
Danger
podman run postgres... puis podman rm → données perdues
podman run -v postgres_data:/var/lib/postgresql/data postgres:16 Nom de conteneur déjà utilisé podman run --name mon-app image → Error: name already in use
Attention
podman run --name mon-app image → Error: name already in use
podman rm -f mon-app && podman run --name mon-app image
# ou
podman run --replace --name mon-app image Image non trouvée podman run alpine → Error: image not known
Attention
podman run alpine → Error: image not known
podman pull docker.io/library/alpine:3.20
podman run docker.io/library/alpine:3.20 Port déjà utilisé podman run -p 8080:80 nginx → Error: address already in use
Attention
podman run -p 8080:80 nginx → Error: address already in use
# Trouver qui utilise le port
ss -tlnp | grep 8080
# Utiliser un autre port
podman run -p 8081:80 nginx Ports privilégiés en rootless podman run -p 80:80 nginx → Error: permission denied
Attention
podman run -p 80:80 nginx → Error: permission denied
# Utiliser un port haut
podman run -p 8080:80 nginx
# Ou autoriser les ports bas
sudo sysctl net.ipv4.ip_unprivileged_port_start=80 Utilisation de :latest podman run nginx → utilise :latest qui peut changer
Info
podman run nginx → utilise :latest qui peut changer
podman run nginx:1.25-alpine Conteneur arrêté immédiatement podman run -d alpine → conteneur Exit(0) aussitôt
Info
podman run -d alpine → conteneur Exit(0) aussitôt
# Garder actif avec sleep
podman run -d alpine sleep infinity
# Ou un service qui reste actif
podman run -d nginx Cheatsheet
Section intitulée « Cheatsheet » 📋
Cheatsheet podman
📝 Syntaxe :
podman run image Créer et démarrer un conteneur 🚀 Commandes types :
podman run -it --rm alpine:3.20 sh podman run -d --name mon-nginx nginx:alpine podman run -d -p 8080:80 --name web nginx:alpine podman run -v ~/data:/app/data:Z alpine ls /app/data podman run -e POSTGRES_PASSWORD=secret -e POSTGRES_DB=app postgres:16 ⚙️ Options
-d | Mode détaché (arrière-plan) | podman run -d nginx |
-it | Mode interactif avec TTY | podman run -it alpine sh |
--rm | Supprimer après arrêt | podman run --rm alpine echo test |
--name NAME | Nommer le conteneur | podman run --name web nginx |
-p HOST:CONT | Mapper un port | podman run -p 8080:80 nginx |
-v SRC:DEST | Monter un volume | podman run -v ./html:/usr/share/nginx/html nginx |
-e VAR=val | Définir une variable | podman run -e MYSQL_ROOT_PASSWORD=secret mysql |
Conclusion
Section intitulée « Conclusion »Les commandes podman run, ps, exec, logs et rm constituent le cœur de votre travail quotidien avec les conteneurs. La compatibilité avec Docker facilite la transition, et le mode rootless par défaut renforce la sécurité sans effort supplémentaire.