Cos’è Podman e perché considerarlo
Docker è stato per anni il punto di riferimento per la containerizzazione su Linux. Funziona, è ben documentato e ha un ecosistema enorme. Eppure, man mano che i requisiti di sicurezza sono aumentati e l’integrazione con systemd è diventata più importante, le sue limitazioni strutturali hanno iniziato a pesare. Podman nasce per affrontare esattamente questi problemi.
Podman (Pod Manager) è un container engine open source, daemonless: a differenza di Docker, non ha un demone centralizzato (dockerd) che gira in background con privilegi root. I container vengono avviati direttamente come processi figli dell’utente, il che significa che è possibile eseguirli in modalità rootless, senza mai richiedere sudo. Supporta gli stessi formati OCI di Docker (le immagini Docker funzionano senza modifiche), parla la stessa sintassi CLI e comprende nativamente il concetto di pod, gruppo di container che condividono rete e storage, esattamente come in Kubernetes.
Installazione su Linux
Podman è disponibile nei repository ufficiali di tutte le principali distribuzioni. Non servono PPA esterni o script di terze parti.
Debian / Ubuntu (20.10+) e Linux Mint:
sudo apt-get update
sudo apt-get install -y podman
Fedora / CentOS Stream / RHEL 8+:
sudo dnf install -y podman
openSUSE:
sudo zypper install podman
Arch / Manjaro:
sudo pacman -S podman
Dopo l’installazione, verificare con:
podman --version
podman info
Un rapido smoke test per assicurarsi che tutto funzioni:
podman run hello-world
Se si ottiene il messaggio di conferma, Podman è operativo.
Comandi di base: la compatibilità con Docker è quasi totale
La CLI di Podman rispecchia quella di Docker comando per comando. Chi conosce Docker si trova subito a proprio agio. Ecco i comandi più usati:
# Shell interattiva in un container Ubuntu
podman run -it ubuntu bash
# Container in background (Nginx su porta 8080)
podman run -d --name web -p 8080:80 nginx
# Elenco container in esecuzione
podman ps
# Elenco di tutte le immagini locali
podman images
# Stop e rimozione
podman stop web
podman rm web
Per chi vuole una transizione trasparente, è possibile creare un alias:
alias docker=podman
Oppure installare il pacchetto podman-docker, che fornisce uno shim che reindirizza automaticamente i comandi docker a Podman.
Le differenze che contano davvero
La maggior parte dei comandi funziona identica, ma ci sono differenze che emergono quando si lavora con volumi e SELinux. La più comune riguarda i bind mount in modalità rootless: i namespace utente e il mapping subuid/subgid possono causare problemi di ownership. Sui sistemi con SELinux attivo è necessario aggiungere il suffisso :Z ai volumi:
podman run -v /host/path:/container/path:Z myimage
La z minuscola condivide il volume tra più container; la Z maiuscola lo etichetta come privato per un singolo container. Altre differenze da tenere a mente:
- L’accesso GPU rootless per NVIDIA richiede nvidia-container-toolkit e la configurazione CDI.
- Docker Secrets e alcune configurazioni di rete non hanno un mapping diretto.
- I container rootless usano porte superiori a 1024 per default (limite del kernel per utenti non root).
Nessuna di queste differenze è un blocco, ma richiedono un test esplicito prima di assumere che la migrazione sia trasparente.
Integrazione con systemd: i Quadlet
Questo è forse il punto di forza più significativo di Podman per un amministratore di sistema. Invece di lasciare un demone attivo, è possibile affidare i container a systemd tramite i Quadlet: file dichiarativi con estensione .container che Podman trasforma automaticamente in unit systemd.
Per un servizio utente rootless, creare il file in ~/.config/containers/systemd/. Esempio minimale per Nginx:
[Container]
ContainerName=web
Image=docker.io/library/nginx:latest
PublishPort=8080:80
[Install]
WantedBy=default.target
Ricaricare systemd e avviare il servizio:
systemctl --user daemon-reload
systemctl --user start web
Aggiungendo l’etichetta AutoUpdate=registry, Podman scaricherà automaticamente le immagini aggiornate e riavvierà il servizio tramite timer, senza alcun tool esterno:
podman auto-update
Migrazione da Docker Compose
Chi ha ambienti basati su Docker Compose ha due strade. La prima è continuare a usare Compose puntando al socket di Podman, abilitandolo con:
systemctl --user enable --now podman.socket
I file docker-compose.yml esistenti funzionano senza modifiche. La seconda opzione è convertire i Compose in Quadlet usando podlet, uno strumento che legge un docker-compose.yml e genera i corrispondenti file Quadlet. La curva di apprendimento c’è, ma il risultato è un’integrazione più pulita con il sistema.
Quando Docker rimane la scelta migliore
Podman offre sicurezza migliore e un’integrazione più nativa con Linux. Ma Docker ha un ecosistema più maturo: Docker Swarm, strumenti CI/CD che assumono la presenza del comando docker, e team già standardizzati su determinati workflow. Se si parte da zero su un server Linux, Podman è la scelta più pulita. Se si ha già un’infrastruttura Docker consolidata, la migrazione va pianificata e testata con attenzione.
Podman è un’alternativa concreta e matura a Docker, non un esperimento di nicchia. L’assenza del demone root, l’integrazione nativa con systemd tramite Quadlet e la compatibilità quasi totale con la CLI Docker lo rendono una scelta solida per chiunque gestisca container su Linux. L’installazione richiede un singolo comando, i comandi quotidiani sono identici a Docker, e i vantaggi in termini di sicurezza arrivano senza configurazioni complesse. Vale la pena provarlo.