Docker e Podman eseguono le stesse immagini con gli stessi comandi. A separarli è l’architettura: Podman non ha un daemon in background e gira rootless di default, mentre Docker porta con sé strumenti più maturi, Docker Desktop e un supporto a Compose di prima classe. Qui sotto, le differenze che incidono davvero sul tuo lavoro: daemon, root, Compose e pod.

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

Docker vs Podman, punto per punto

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

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.

Docker vs Podman in sintesi

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.

Quale dovresti usare

Se parti da zero, o stai imparando: scegli Podman. Rootless di default, nessun daemon, e i pod fanno capire prima i concetti di Kubernetes. La compatibilità dei comandi rende quasi gratuito, più avanti, il passaggio a Docker se ti serve.

Se lavori in un team che usa già Docker, o ti appoggi a Docker Compose e Docker Desktop: resta su Docker. L’ecosistema è più maturo e ogni tutorial lo dà per scontato. Non c’è urgenza di migrare un setup consolidato.

Qualunque cosa impari con uno, si trasferisce all’altro quasi per intero.

Articoli correlati