Introduzione

Se lavori con i container, probabilmente conosci Docker. Ma negli ultimi anni è emerso un concorrente interessante: Podman. Sviluppato da Red Hat, Podman promette di fare tutto ciò che fa Docker, ma in modo diverso e, secondo alcuni, migliore.

In questo articolo analizzeremo le differenze reali tra i due, senza fanatismi, per aiutarti a capire quale strumento fa al caso tuo.

Cos’è Podman?

Podman (Pod Manager) è uno strumento per gestire container e pod, sviluppato da Red Hat come alternativa open source a Docker. La sua caratteristica principale? Non ha bisogno di un daemon in esecuzione.

Il nome “Podman” deriva dal concetto di “pod”, lo stesso usato in Kubernetes: un gruppo di container che condividono risorse.

La Differenza Fondamentale: Daemon vs Daemonless

Docker: Architettura Client-Server

Docker funziona con un daemon (dockerd) sempre in esecuzione in background:

1
2
3
4
┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│ Docker CLI   │ ──► │ Docker Daemon│ ──► │  Container   │
│ (client)     │     │ (dockerd)    │     │              │
└──────────────┘     └──────────────┘     └──────────────┘
  • Il daemon gira come root
  • Tutti i comandi passano attraverso il daemon
  • Se il daemon crasha, perdi l’accesso ai container

Podman: Architettura Fork-Exec

Podman non ha daemon. Ogni comando crea direttamente il processo del container:

1
2
3
4
┌──────────────┐     ┌──────────────┐
│ Podman CLI   │ ──► │  Container   │
│              │     │              │
└──────────────┘     └──────────────┘
  • Nessun processo in background
  • I container sono figli diretti del comando Podman
  • Ogni utente gestisce i propri container

Confronto Dettagliato

1. Sicurezza: Rootless by Default

Docker:

  • Il daemon gira tradizionalmente come root
  • Modalità rootless disponibile ma non di default
  • Un exploit nel daemon = accesso root al sistema

Podman:

  • Rootless di default
  • Ogni utente ha i propri container isolati
  • Nessun daemon privilegiato da attaccare
1
2
3
4
5
# Podman: container senza privilegi root
podman run -it alpine sh

# Docker: richiede gruppo docker o sudo (tradizionalmente)
sudo docker run -it alpine sh

Vincitore sicurezza: Podman

2. Compatibilità dei Comandi

Buone notizie: la sintassi è quasi identica.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Docker
docker run -d -p 8080:80 nginx
docker ps
docker images
docker build -t mia-app .

# Podman (stessi comandi!)
podman run -d -p 8080:80 nginx
podman ps
podman images
podman build -t mia-app .

Puoi creare un alias per una transizione indolore:

1
alias docker=podman

Compatibilità: Quasi totale per l’uso quotidiano

3. Docker Compose vs Podman Compose

Docker Compose è lo standard de facto per orchestrare più container in sviluppo.

Podman offre due opzioni:

  1. podman-compose: reimplementazione Python
  2. podman compose: integrato nelle versioni recenti (usa Compose spec)
1
2
3
4
5
# Con Podman recente
podman compose up -d

# Con podman-compose (installazione separata)
podman-compose up -d

Nota: La compatibilità è buona ma non perfetta. Alcuni file docker-compose.yml potrebbero richiedere piccoli aggiustamenti.

4. Gestione delle Immagini

Entrambi usano lo stesso formato di immagini (OCI), quindi puoi:

  • Usare le stesse immagini da Docker Hub
  • Costruire immagini con lo stesso Dockerfile
  • Trasferire immagini tra Docker e Podman
1
2
3
4
5
6
7
8
# Podman può usare immagini Docker Hub
podman pull docker.io/library/nginx

# Salvare un'immagine
podman save -o nginx.tar nginx

# Caricarla in Docker
docker load -i nginx.tar

5. Pod: Una Feature Esclusiva di Podman

Podman supporta nativamente i pod, gruppi di container che condividono namespace di rete:

1
2
3
4
5
6
7
8
# Creare un pod
podman pod create --name mio-pod -p 8080:80

# Aggiungere container al pod
podman run -d --pod mio-pod nginx
podman run -d --pod mio-pod redis

# I container nel pod comunicano via localhost

Questo è utile per:

  • Simulare pod Kubernetes in locale
  • Raggruppare container correlati
  • Semplificare la comunicazione tra servizi

Docker non ha un equivalente diretto (usa le network).

6. Integrazione con Systemd

Podman si integra nativamente con systemd, il sistema init di Linux:

1
2
3
4
5
# Generare un file service systemd da un container
podman generate systemd --name mio-container > mio-container.service

# Abilitare il container all'avvio del sistema
systemctl --user enable mio-container.service

Questo permette di gestire i container come normali servizi di sistema, senza bisogno di un daemon separato.

7. Prestazioni

Le prestazioni sono comparabili nella maggior parte dei casi:

AspettoDockerPodman
Avvio containerLeggermente più veloceLeggermente più lento
Memoria base~50-100 MB (daemon)~0 MB (no daemon)
Build immaginiVeloce (BuildKit)Comparabile
I/O discoOttimoOttimo

La differenza è trascurabile per la maggior parte degli usi.

Tabella Riassuntiva

CaratteristicaDockerPodman
DaemonNo
Rootless defaultNo
Compatibilità comandi-99%
Docker ComposeNativoVia podman-compose
Pod nativiNo
Integrazione systemdLimitataNativa
Supporto KubernetesDocker DesktopNativo
GUI DesktopDocker DesktopPodman Desktop
PiattaformeLinux, Win, MacLinux, Win, Mac
LicenzaApache 2.0Apache 2.0

Quando Scegliere Docker

Docker rimane la scelta migliore se:

  • Lavori in team che già usa Docker
  • Hai bisogno di Docker Compose con compatibilità perfetta
  • Usi Docker Desktop e le sue funzionalità (Kubernetes integrato, estensioni)
  • Segui tutorial e documentazione (quasi tutti usano Docker)
  • Hai bisogno di supporto commerciale

Quando Scegliere Podman

Podman è preferibile se:

  • La sicurezza è prioritaria (ambienti enterprise, produzione)
  • Lavori su RHEL, CentOS, Fedora (integrazione nativa)
  • Vuoi container rootless senza configurazioni extra
  • Devi gestire container come servizi systemd
  • Stai imparando Kubernetes (i pod sono un vantaggio)
  • Non vuoi un daemon sempre in esecuzione

Migrazione da Docker a Podman

Se vuoi provare Podman mantenendo la compatibilità:

1. Installa Podman

1
2
3
4
5
6
7
8
# Fedora/RHEL
sudo dnf install podman

# Ubuntu/Debian
sudo apt install podman

# Mac (con Homebrew)
brew install podman

2. Crea l’Alias

1
2
# Nel tuo .bashrc o .zshrc
alias docker=podman

3. Testa i Tuoi Workflow

La maggior parte dei comandi funzionerà identicamente. Verifica:

  • Build delle immagini
  • Docker Compose (usa podman compose o podman-compose)
  • Volumi e network

4. Risolvi le Incompatibilità

Le più comuni:

  • Alcuni flag specifici di Docker non esistono
  • La socket Docker (/var/run/docker.sock) non esiste di default
  • Alcune integrazioni CI/CD potrebbero richiedere aggiustamenti

Possono Coesistere?

Sì! Docker e Podman possono convivere sullo stesso sistema. Usano storage separati, quindi i container e le immagini non sono condivisi, ma puoi usare entrambi per scopi diversi.

Conclusioni

Non esiste un vincitore assoluto. La scelta dipende dal contesto:

  • Docker rimane lo standard de facto, con l’ecosistema più maturo e la documentazione più abbondante
  • Podman offre vantaggi concreti in termini di sicurezza e architettura, specialmente in ambienti enterprise

Il mio consiglio? Se parti da zero, prova entrambi. La compatibilità dei comandi rende il passaggio indolore. Se sei già in un ecosistema Docker consolidato, non c’è urgenza di migrare, ma vale la pena tenere d’occhio Podman per progetti futuri.

La cosa bella? Qualunque cosa impari con uno, si applica quasi completamente all’altro.


Hai esperienza con entrambi? Condividi la tua opinione nei commenti!