Aller au contenu
Conteneurs & Orchestration medium

Commandes essentielles Podman

12 min de lecture

logo podman

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.

  • 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é :

CommandeSpécialitéQuand l’utiliser
podmanExécuter et gérer les conteneursrun, ps, exec, logs, stop, rm
buildahConstruire des imagesBuild avancé, multi-stage, rootless
skopeoCopier des images entre registriesMirroring, air-gap, inspection
podman-composeOrchestrer plusieurs conteneursStack multi-conteneurs (comme docker-compose)

Combinaisons fréquentes :

Fenêtre de terminal
# buildah + podman : construire puis lancer
buildah build -t mon-app . && podman run mon-app
# skopeo + podman : copier puis exécuter
skopeo copy docker://nginx:alpine oci-archive:nginx.tar
podman load < nginx.tar && podman run nginx:alpine
# podman + grep : filtrer les logs
podman logs mon-app | grep ERROR

🧠 Modèle mental — Comment fonctionne Podman

podman = Image → Conteneur → Processus isolé (rootless par défaut)

Modèle mental Podman : Registry → Image → Conteneur → Processus isolé via conmon

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

1
Toujours nommer vos conteneurs Utilisez --name pour éviter les IDs aléatoires difficiles à retenir.
2
Utiliser --rm pour les conteneurs jetables --rm supprime le conteneur automatiquement à l'arrêt, évite l'accumulation.
3
Préférer les tags explicites aux :latest :latest change sans prévenir. Utilisez :3.20, :1.25 pour la reproductibilité.

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.

Fenêtre de terminal
podman <commande> [options] [arguments]

Commandes les plus utilisées :

CommandeDescriptionExemple
runCréer et démarrer un conteneurpodman run -d nginx
psLister les conteneurspodman ps -a
execExécuter une commande dans un conteneurpodman exec -it web sh
logsAfficher les logspodman logs -f web
stop / startArrêter / démarrer un conteneurpodman stop web
rmSupprimer un conteneurpodman rm web
imagesLister les imagespodman images
pullTélécharger une imagepodman pull alpine:3.20

Podman repose sur quelques concepts essentiels :

ConceptCe que c’estExemple
ImageModèle en lecture seulenginx:alpine, alpine:3.20
ConteneurInstance exécutable d’une imagepodman run nginx crée un conteneur
RegistryServeur de distribution d’imagesDocker Hub, Quay.io, GHCR
VolumeStockage persistantpodman run -v data:/app/data
Port mappingExposition réseaupodman run -p 8080:80

La commande podman run est la plus utilisée. Voici ses options principales :

OptionForme longueDescription
-d--detachExécuter en arrière-plan
-it--interactive --ttyMode interactif avec terminal
--rmSupprimer après arrêt
--nameNommer le conteneur
-p--publishMapper un port hôte:conteneur
-e--envDéfinir une variable d’environnement
-v--volumeMonter un volume

Formes courantes :

Fenêtre de terminal
# Conteneur jetable interactif
podman run -it --rm alpine:3.20 sh
# Service en arrière-plan
podman run -d --name web -p 8080:80 nginx:alpine
# Avec volume et variable d'environnement
podman run -d --name db -v pgdata:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret postgres:16

Un conteneur passe par plusieurs états :

Created → Running → Paused/Exited → Removed
ÉtatSignificationCommande pour y arriver
CreatedConteneur créé mais pas démarrépodman create
RunningEn cours d’exécutionpodman start ou podman run
PausedProcessus gelés (SIGSTOP)podman pause
ExitedArrêté (code de sortie)podman stop ou fin du processus
RemovedSupprimépodman rm
ErreurCauseSolution
name already in useConteneur existant avec ce nompodman rm -f nom ou --replace
image not knownImage non téléchargéepodman pull docker.io/library/image:tag
address already in usePort déjà utiliséChanger le port (-p 8081:80)
permission deniedProblème rootless/SELinux--userns=keep-id ou :Z sur volume
Conteneur s’arrête immédiatementCMD se termineUtiliser un processus persistant

Une image est un modèle en lecture seule contenant l’application et ses dépendances.

Fenêtre de terminal
# Rechercher une image
podman 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 locales
podman images

Résultat podman images :

REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/alpine 3.20 cc9071bd1610 2 weeks ago 8.1 MB
docker.io/library/nginx alpine b76de378d572 8 days ago 63.5 MB
Fenêtre de terminal
# Détails d'une image (format Go template)
podman image inspect alpine:3.20 --format 'ID: {{.Id}} | Size: {{.Size}}'
# Supprimer une image
podman rmi alpine:3.20
# Supprimer toutes les images non utilisées
podman image prune -a
Fenêtre de terminal
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.

Fenêtre de terminal
podman run -d --name mon-nginx -p 8080:80 docker.io/library/nginx:alpine
OptionDescription
-dDétaché (arrière-plan)
--name mon-nginxNom explicite pour référencer facilement
-p 8080:80Port 8080 sur l’hôte → port 80 du conteneur

Vérification :

Fenêtre de terminal
curl localhost:8080
Fenêtre de terminal
podman run -it --rm docker.io/library/alpine:3.20 sh

Vous obtenez un shell dans le conteneur. Tapez exit pour quitter. --rm supprime le conteneur à la sortie.

Fenêtre de terminal
# Conteneurs en cours d'exécution
podman ps
# Tous les conteneurs (y compris arrêtés)
podman ps -a
# Format personnalisé
podman ps --format "{{.Names}}: {{.Image}} ({{.Status}})"
Fenêtre de terminal
# Configuration complète (JSON)
podman inspect mon-nginx
# Extraire un champ spécifique
podman inspect --format '{{.NetworkSettings.IPAddress}}' mon-nginx
# Voir les processus
podman top mon-nginx
# Voir les ports exposés
podman port mon-nginx
Fenêtre de terminal
# Commande simple
podman exec mon-nginx cat /etc/nginx/nginx.conf
# Shell interactif
podman exec -it mon-nginx sh
# En tant que root (même en rootless)
podman exec -u root mon-nginx whoami
Fenêtre de terminal
# Tous les logs
podman logs mon-nginx
# Dernières 20 lignes
podman logs --tail 20 mon-nginx
# Suivre en temps réel (comme tail -f)
podman logs -f mon-nginx
# Avec timestamps
podman logs -t mon-nginx
Fenêtre de terminal
# Vers le conteneur
podman cp config.yml mon-nginx:/etc/nginx/
# Depuis le conteneur
podman cp mon-nginx:/etc/nginx/nginx.conf ./backup/
# Vérifier les modifications du filesystem
podman diff mon-nginx
Fenêtre de terminal
# Arrêter (SIGTERM puis SIGKILL après timeout)
podman stop mon-nginx
# Arrêter immédiatement (SIGKILL)
podman kill mon-nginx
# Redémarrer
podman restart mon-nginx
# Démarrer un conteneur arrêté
podman start mon-nginx
# Mettre en pause / reprendre
podman pause mon-nginx
podman unpause mon-nginx
Fenêtre de terminal
# Statistiques en temps réel
podman stats
# Snapshot (sans rafraîchissement)
podman stats --no-stream
# Espace disque utilisé
podman system df

Exemple de sortie podman stats :

ID NAME CPU % MEM USAGE / LIMIT MEM % NET IO PIDS
a79693ad4f28 mon-nginx 0.04% 10.89MB / 50.28GB 0.02% 110B / 430B 17
Fenêtre de terminal
# 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és
podman 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 -f
Fenêtre de terminal
# Exporter une image en archive tar
podman save docker.io/library/alpine:3.20 -o alpine.tar
# Importer une archive
podman load -i alpine.tar
# Taguer une image (créer un alias)
podman tag alpine:3.20 mon-registre/alpine:stable
# Exporter un conteneur en image
podman commit mon-nginx mon-nginx-custom:v1

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
Formule podman run -it --rm <image> <shell>
Exemple
podman run -it --rm alpine:3.20 sh
Paramètres
  • -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
Formule podman run -d --name <nom> <image>
Exemple
podman run -d --name mon-nginx nginx:alpine
Paramètres
  • -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
Formule podman run -d -p <hôte>:<conteneur> <image>
Exemple
podman run -d -p 8080:80 --name web nginx:alpine
Paramètres
  • -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
Formule podman run -v <chemin_hôte>:<chemin_conteneur> <image>
Exemple
podman run -v ~/data:/app/data:Z alpine ls /app/data
Paramètres
  • -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
Formule podman run -e VAR=valeur <image>
Exemple
podman run -e POSTGRES_PASSWORD=secret -e POSTGRES_DB=app postgres:16
Paramètres
  • -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
Formule podman exec -it <conteneur> <shell>
Exemple
podman exec -it mon-nginx sh
Paramètres
  • -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
Formule podman logs -f <conteneur>
Exemple
podman logs -f --tail 50 mon-nginx
Paramètres
  • -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
Formule podman system prune -a
Exemple
podman system prune -a --volumes -f
Paramètres
  • -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
Formule podman inspect --format '{{.Field}}' <conteneur>
Exemple
podman inspect --format '{{.NetworkSettings.IPAddress}}' mon-nginx
Paramètres
  • --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
Formule podman run --memory=<limit> --cpus=<N> <image>
Exemple
podman run -d --memory=512m --cpus=1 --name limited nginx:alpine
Paramètres
  • --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
Formule podman run --health-cmd="<cmd>" --health-interval=<durée> <image>
Exemple
podman run -d --health-cmd="curl -f http://localhost/" --health-interval=30s nginx:alpine
Paramètres
  • --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/
Formule podman cp <src> <dest>
Exemple
podman cp mon-nginx:/etc/nginx/nginx.conf ./backup/
Paramètres
  • conteneur:chemin — Chemin dans le conteneur
  • chemin_local — Chemin sur l'hôte

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
Le piège : podman run -v ~/data:/app/data image → Permission denied
Symptôme : Erreur de permission sur les fichiers montés
Cause : Le mapping UID rootless ou SELinux bloque l'accès
Correction : Utiliser --userns=keep-id ou :Z pour SELinux
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
Le piège : podman run postgres... puis podman rm → données perdues
Symptôme : Les données disparaissent après suppression du conteneur
Cause : Les données dans le conteneur sont éphémères
Correction : Utiliser un volume pour la persistance
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
Le piège : podman run --name mon-app image → Error: name already in use
Symptôme : Erreur "container name is already in use"
Cause : Un conteneur (même arrêté) existe déjà avec ce nom
Correction : Supprimer l'ancien ou utiliser --replace
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
Le piège : podman run alpine → Error: image not known
Symptôme : Erreur "image not known" ou "manifest unknown"
Cause : Podman ne trouve pas l'image dans ses registres configurés
Correction : Spécifier le registre complet ou pull explicitement
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
Le piège : podman run -p 8080:80 nginx → Error: address already in use
Symptôme : Erreur "bind: address already in use"
Cause : Un autre processus ou conteneur utilise déjà ce port
Correction : Utiliser un autre port ou libérer le port occupé
# 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
Le piège : podman run -p 80:80 nginx → Error: permission denied
Symptôme : Cannot bind to privileged port sans root
Cause : Les ports < 1024 sont réservés à root par défaut
Correction : Utiliser un port > 1024 ou configurer sysctl
# 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
Le piège : podman run nginx → utilise :latest qui peut changer
Symptôme : Comportement différent après un pull
Cause : :latest n'est pas une version fixe, elle évolue
Correction : Toujours spécifier un tag de version explicite
podman run nginx:1.25-alpine
Conteneur arrêté immédiatement

podman run -d alpine → conteneur Exit(0) aussitôt

Info
Le piège : podman run -d alpine → conteneur Exit(0) aussitôt
Symptôme : Le conteneur s'arrête immédiatement après le démarrage
Cause : Le processus principal (CMD) se termine instantanément
Correction : Le conteneur vit tant que son processus principal tourne
# Garder actif avec sleep
podman run -d alpine sleep infinity
# Ou un service qui reste actif
podman run -d nginx

📋 Cheatsheet podman

📝 Syntaxe :

podman run image Créer et démarrer un conteneur

🚀 Commandes types :

Conteneur interactif jetable Tester une commande ou explorer une image.
podman run -it --rm alpine:3.20 sh
Service en arrière-plan Lancer un service qui tourne en continu.
podman run -d --name mon-nginx nginx:alpine
Exposer un port Rendre un service accessible depuis l'hôte.
podman run -d -p 8080:80 --name web nginx:alpine
Monter un dossier Partager des fichiers entre l'hôte et le conteneur.
podman run -v ~/data:/app/data:Z alpine ls /app/data
Variables d'environnement Configurer l'application via l'environnement.
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

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.

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.