Vai al contenuto principale

Podman Compose: un'alternativa rootless a Docker Compose

Podman Compose è uno strumento basato su Python che legge i file Docker Compose ed esegue applicazioni multi-container usando l'architettura rootless e senza demone di Podman per ambienti di sviluppo orientati alla sicurezza.
· 12 min leggi

Scopri con l'IA

Poniamo che tu abbia un file docker-compose.yml che funziona da mesi. Ma ora dovresti usare Podman al posto di Docker e non sai se devi modificare il file o ripartire da zero. Il tuo ambiente di sviluppo locale dipende da quel file Compose e rifare tutto da capo non è esattamente qualcosa per cui hai tempo.

La buona notizia è che Podman Compose ti permette di eseguire i file Compose esistenti con Podman invece di Docker. È un livello di compatibilità basato su Python che traduce le definizioni Compose in comandi Podman, così puoi continuare a usare il flusso di lavoro multi-container a cui sei abituato.

In questo articolo ti mostro cos'è Podman Compose, come installarlo e come avviare la tua prima applicazione multi-container. Se sei alle prime armi con alcuni dei concetti trattati qui, iscriviti al nostro corso Containerization and Virtualization Concepts per apprendere le basi.

Che cos'è Podman Compose?

Podman Compose è uno strumento basato su Python che legge i tuoi file docker-compose.yml e li traduce in comandi Podman.

Continui a scrivere un normale file Docker Compose con servizi, reti e volumi. Podman Compose analizza quel file ed esegue i comandi podman equivalenti per avviare i container. Fa il lavoro di traduzione al posto tuo, così non devi convertire manualmente la sintassi Compose in comandi della CLI Podman.

È importante notare che Podman Compose non è un sostituto drop-in di Docker Compose.

È un livello di compatibilità. Alcune funzionalità di Docker Compose funzionano subito, altre richiedono aggiustamenti e alcune non funzionano affatto. L'obiettivo è la compatibilità, ma non replica ogni singolo comportamento di Docker Compose.

Un altro modo per pensarci: Docker Compose parla direttamente con il demone Docker. Podman Compose parla con la CLI di Podman, che poi gestisce i container senza un demone. Il risultato sembra simile, ma la meccanica sottostante è diversa.

Questo significa che puoi riutilizzare la maggior parte dei file Compose esistenti, ma devi capire dove emergono le differenze.

Perché usare Podman Compose?

Podman Compose ti permette di eseguire applicazioni multi-container senza installare Docker.

Rispetto a Docker, ottieni container rootless di default. Podman esegue i container senza richiedere privilegi di root. In parole povere, c'è meno rischio se un container viene compromesso. Docker richiede che il demone giri come root, anche se sopra stai eseguendo container rootless.

Questo rende Podman Compose più adatto ad ambienti orientati alla sicurezza. Se lavori su server Linux blindati o in contesti dove non è consentito eseguire un demone a livello root, Podman Compose ti offre il flusso di lavoro multi-container di cui hai bisogno.

È utile anche per sviluppo e test. Puoi avviare ambienti locali, testare configurazioni dei container e convalidare i file Compose senza avere Docker installato. È ideale per deployment leggeri dove non ti serve un orchestratore completo.

Detto ciò, Podman Compose non è ideale in ogni situazione.

Se esegui carichi produttivi su larga scala, vorrai usare Kubernetes o Docker Swarm. Podman Compose ha anche un supporto più debole su macOS e Windows rispetto a Linux, quindi l'esperienza cross-platform non sarà altrettanto fluida. E se il tuo team è già investito nell'ecosistema Docker con plugin e tool personalizzati, passare a Podman Compose significa ricostruire parte di quel flusso di lavoro.

In conclusione, usa Podman Compose quando ti servono container rootless, ambienti security-first o un setup di sviluppo senza Docker.

Installare Podman Compose

Podman Compose dà il meglio su Linux, dove Podman gira nativamente.

Puoi installarlo su macOS e Windows, ma dovrai prima eseguire Podman dentro una macchina virtuale. Questo aggiunge complessità e non è fluido come su Linux. Su macOS o Windows, aspettati passaggi extra di setup e possibili stranezze di rete.

Installazione su Linux

Il modo più semplice per installare Podman Compose è tramite pip.

pip install podman-compose

Installazione di Podman compose su Linux

Installazione di Podman compose su Linux

Questo installa l'ultima versione da PyPI. Non devi preoccuparti della gestione della versione di Python: se hai Python 3 installato, sei a posto.

Alcune distribuzioni Linux includono anche Podman Compose nei propri repository. Su Fedora, RHEL e CentOS puoi usare:

sudo dnf install podman-compose

Su sistemi Ubuntu e Debian, esegui quanto segue:

sudo apt install podman-compose

Le versioni dei gestori pacchetti tendono a essere in ritardo rispetto a PyPI, quindi potresti non ottenere subito le funzionalità più recenti.

Installazione su macOS e Windows

Su macOS e Windows, prima devi configurare Podman Desktop o usare podman machine per creare una VM Linux. Una volta avviata, installa Podman Compose con pip all'interno di quell'ambiente.

Quindi il primo passaggio è connettersi alla macchina:

podman machine ssh

Accesso via SSH alla VM Podman

Accesso via SSH alla VM Podman

Poiché la VM è basata su Fedora, puoi eseguire questo comando per installare Podman Compose:

sudo dnf install podman-compose

Installazione di Podman Compose

Installazione di Podman Compose

Questo processo in due passaggi significa che non stai eseguendo Podman Compose direttamente sul tuo OS host: lo stai eseguendo dentro la VM Linux creata da Podman.

Verifica dell'installazione

Esegui questo comando per verificare che Podman Compose sia stato installato correttamente:

podman-compose --version

Verifica dell'installazione di Podman Compose

Verifica dell'installazione di Podman Compose

Dovresti vedere il numero di versione stampato nel terminale. Se ottieni un errore "command not found", assicurati che la directory bin di Python sia nel tuo PATH.

Questo è tutto ciò che ti serve per iniziare a usare Podman Compose.

Eseguire un file Compose con Podman Compose

Hai installato Podman Compose: ora ti mostro come eseguire un'applicazione reale.

Usare un file Docker Compose esistente

Podman Compose legge i file standard docker-compose.yml. Non devi rinominare nulla o cambiare formato.

Ecco una semplice applicazione FastAPI definita in un file Compose:

services:
  web:
    image: python:3.14-slim
    container_name: fastapi-app
    working_dir: /src
    volumes:
      - ./src:/src
    ports:
      - "8000:8000"
    command: bash -c "pip install fastapi uvicorn && uvicorn main:app --host 0.0.0.0 --port 8000"

Con il codice dell'applicazione in src/main.py:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello from FastAPI"}

@app.get("/health")
def health_check():
    return {"status": "healthy"}

La maggior parte delle funzionalità di Docker Compose funziona subito con Podman Compose. Questo include:

  • Pull delle immagini e creazione dei container
  • Mapping delle porte
  • Mount dei volumi (sia volumi nominati che bind mount)
  • Variabili d'ambiente
  • Networking di base tra servizi

Ma alcune funzionalità richiedono aggiustamenti. Se il tuo file Compose usa plugin specifici di Docker, driver di rete personalizzati o argomenti di build avanzati, probabilmente dovrai modificare quelle sezioni.

Anche il networking di Podman Compose è diverso: i servizi non si risolvono automaticamente per nome nello stesso modo di Docker Compose.

Comandi di base di Podman Compose

Ora puoi avviare i servizi con questo comando:

podman-compose up

Questo esegue il pull delle immagini, crea i container e avvia tutto ciò che è definito nel file Compose. Aggiungi -d per eseguire in modalità detached se non vuoi i log in streaming nel terminale.

Output di Podman

Output di Podman

Ora puoi aprire l'app sulla porta 8000 della tua macchina (o su un'istanza Ubuntu remota come sto usando io). Vedrai quanto segue:

Applicazione FastAPI in esecuzione tramite Podman

Applicazione FastAPI in esecuzione tramite Podman

Per interrompere i servizi in esecuzione, esegui:

podman-compose down

Questo arresta e rimuove i container. I volumi restano a meno che tu non aggiunga --volumes per rimuoverli.

Per controllare i log dei servizi, esegui questo comando:

podman-compose logs

Aggiungi -f per seguirli in tempo reale o specifica un nome di servizio per vedere i log solo di quel container.

Per pulire tutto, inclusi container, reti e volumi, esegui:

podman-compose down --volumes

I comandi rispecchiano la sintassi di Docker Compose, quindi se conosci già docker-compose, ti sentirai a casa.

Podman Compose vs Docker Compose e altri

Podman Compose e Docker Compose puntano allo stesso obiettivo, ma funzionano in modo diverso sotto il cofano. Ti spiego come.

Esecuzione rootless

Docker Compose richiede che il demone Docker giri come root. Anche quando configuri container rootless, il demone stesso ha bisogno di privilegi elevati. Podman Compose gira interamente senza accesso root di default. I container partono come tuo utente, non come servizio di sistema, riducendo le superfici d'attacco e rendendo Podman Compose più sicuro in ambienti multiutente.

Comportamento del networking

Docker Compose crea una rete bridge predefinita per i servizi. I container possono raggiungersi per nome del servizio in automatico.

Podman Compose usa invece il networking basato su pod. Tutti i container del file Compose vengono raggruppati in un singolo pod di Podman e condividono lo stesso namespace di rete. Questo significa che i container comunicano su localhost anziché per nomi di servizio, cosa che può sorprendere gli utenti Docker.

Se la tua app si aspetta di raggiungere un database a db:5432, dovrai cambiarlo in localhost:5432 quando esegui con Podman Compose.

Raggruppamento basato su pod

Docker Compose gestisce container individuali. Podman Compose crea un pod, un raggruppamento ispirato a Kubernetes in cui i container condividono la rete e possono condividere lo storage. Questo modello allinea Podman Compose ai pattern di Kubernetes, semplificando una futura migrazione se ti serve l'orchestrazione.

Integrazione con systemd

Podman si integra con systemd per gestire i container come servizi di sistema. Puoi generare unit file systemd dai container in esecuzione e gestirli come qualsiasi altro servizio Linux. Docker non offre un'integrazione nativa con systemd a livello di container.

Altre opzioni

Se Podman Compose non fa al caso tuo, hai queste alternative:

  • Podman nativo con systemd ti consente di gestire i container come servizi senza file Compose
  • Kubernetes ti offre un'orchestrazione completa se esegui carichi produttivi su larga scala, anche se è molto più pesante degli strumenti in stile Compose

Podman Compose si colloca tra comandi container semplici e orchestrazione completa. Ti offre workflow multi-container senza il requisito del demone di Docker.

Reti e volumi in Podman Compose (cosa cambia)

Gli utenti Docker che passano a Podman Compose di solito si lamentano di due cose: networking e volumi. In questa sezione passo in rassegna le differenze.

Comunicazione tra servizi

In Docker Compose ti connetti ad altri servizi per nome del servizio. Se hai un servizio web e un database chiamato db, la tua app si connette a db:5432.

Podman Compose mette tutti i servizi in un singolo pod. I container nello stesso pod condividono un namespace di rete, il che significa che usano tutti localhost. La stringa di connessione al database cambia da db:5432 a localhost:5432.

Questo coglie molti di sorpresa. La tua app parte, prova a connettersi a db:5432 e fallisce perché quell'hostname non si risolve. Dovrai aggiornare le stringhe di connessione o le variabili d'ambiente per usare localhost.

Reti predefinite

Docker Compose crea una rete bridge per i servizi. Ogni container ottiene il proprio indirizzo IP su quella rete e il resolver DNS di Docker gestisce la risoluzione dei nomi dei servizi.

Podman Compose non crea reti separate di default. Il modello a pod fa sì che i container condividano la rete a un livello più basso. Se definisci reti personalizzate nel file Compose, Podman Compose proverà a crearle, ma il comportamento potrebbe non coincidere esattamente con Docker.

Comportamento di volumi e bind mount

Volumi e bind mount funzionano per lo più allo stesso modo tra Docker Compose e Podman Compose. Li definisci nel file Compose e Podman li crea.

Ma c'è un aspetto legato ai permessi.

Podman gira rootless di default, quindi proprietà dei file e permessi possono comportarsi in modo diverso. Un bind mount che in Docker funziona senza problemi potrebbe darti errori di permesso in Podman perché l'utente nel container non corrisponde all'UID del tuo utente host.

Noterai anche posizioni dei volumi differenti. Docker conserva i volumi in /var/lib/docker/volumes/ mentre Podman li conserva in ~/.local/share/containers/storage/volumes/ per i container rootless.

Le correzioni sono semplici se sai cosa succede. Quindi adegua le stringhe di connessione per il networking e verifica i permessi dei file per problemi con i volumi.

Limitazioni comuni e insidie

Podman Compose funziona bene per setup multi-container di base, ma ha limitazioni che dovresti conoscere prima di adottarlo.

Funzionalità Compose non supportate

Non tutte le funzionalità di Docker Compose si traducono in Podman Compose. Le build con contesti e argomenti complessi spesso falliscono o si comportano diversamente. I plugin ed estensioni di Docker Compose non funzionano affatto. Funzionalità come il passthrough GPU, health check avanzati e alcune modalità di rete non funzionano o richiedono workaround.

Se il tuo file Compose fa ampio uso delle funzionalità della versione 3.x di docker-compose.yml, aspettati un po' di tentativi ed errori.

Aspettative di rete diverse da Docker

I servizi non comunicano per nome del servizio: usano invece localhost. Questo rompe le app che codificano in duro i nomi dei servizi nelle stringhe di connessione.

Le reti bridge personalizzate non si comportano come in Docker. La risoluzione DNS funziona diversamente a causa del modello a pod.

Aspettati di dedicare un po' di tempo ad aggiornare configurazioni e variabili d'ambiente per allinearti al modello di rete di Podman, ma è un'operazione una tantum.

Limitazioni di piattaforma su macOS/Windows

Podman Compose funziona al meglio su Linux. Su macOS e Windows, esegui tutto dentro una VM Linux, aggiungendo livelli di complessità. La sincronizzazione dei file tra host e VM può essere più lenta. Il networking tra host e container richiede configurazioni extra.

Se il tuo team usa macOS o Windows per lo sviluppo, Docker Compose è di solito l'opzione più fluida.

Maturità dello strumento e lacune nell'ecosistema

Podman Compose è più giovane di Docker Compose. La community è più piccola, quindi trovare risposte a problemi specifici richiede più ricerca. Gli strumenti di terze parti e le integrazioni sono costruiti prima per Docker, poi per Podman (se mai). Il supporto negli IDE e gli strumenti GUI sono indietro rispetto all'ecosistema Docker.

Non troverai così tante risposte su Stack Overflow o issue su GitHub per problemi di Podman Compose.

Queste limitazioni non rendono Podman Compose inutilizzabile, ma sono aspetti da considerare prima di adottarlo. Gli utenti di Docker Compose non incontrano affatto queste frizioni.

Best practice per usare Podman Compose

Ecco come evitare i problemi più comuni con Podman Compose.

  • Parti da file Compose semplici. Non migrare per primo il setup Docker più complesso. Inizia con un'app a singolo servizio, verifica che funzioni, poi aggiungi altro. Così isoli i problemi man mano che emergono.

  • Testa presto il networking rootless. Avvia un'app multi-servizio e verifica che i container comunichino su localhost. Cambia le stringhe di connessione dai nomi dei servizi a localhost. Se la rete non funziona come ti aspetti, lo scoprirai subito.

  • Sii esplicito con volumi e porte. Non affidarti ai default. Specifica i percorsi completi per i bind mount. Definisci i mapping delle porte. Imposta esplicitamente i permessi dei file se monti directory dell'host. Il modello rootless di Podman significa che assunzioni valide in Docker qui possono fallire.

  • Usa Podman Compose soprattutto per sviluppo e produzione leggera. Gestisce bene ambienti di sviluppo locali e piccoli deployment. Per la produzione su larga scala, ti servirà Kubernetes o un'altra piattaforma di orchestrazione. Podman Compose non è pensato per cluster ad alta disponibilità o service mesh complessi.

Conclusione

Podman Compose ti offre un modo pratico per eseguire applicazioni multi-container con Podman invece di Docker. Legge i file Compose esistenti e li traduce in comandi Podman, così non devi imparare un flusso di lavoro completamente nuovo. Ma non è un clone perfetto di Docker Compose. Il networking funziona in modo diverso, alcune funzionalità non sono supportate e dovrai adeguare stringhe di connessione e configurazioni al modello basato su pod di Podman.

Infine, ti consiglio di approfondire le differenze tra Docker e Podman per saperne di più sui rispettivi approcci architetturali e sulla compatibilità.

Dario Radečić

Autore

Dario Radečić

Senior Data Scientist con base in Croazia. Top Tech Writer con oltre 700 articoli pubblicati, per più di 10 milioni di visualizzazioni. Autore del libro Machine Learning Automation with TPOT.

Docker Compose: domande frequenti

Che cos'è Podman Compose?

Podman Compose è uno strumento basato su Python che legge i file Docker Compose e li traduce in comandi Podman. Ti permette di eseguire applicazioni multi-container usando Podman invece di Docker, offrendoti lo stesso workflow di Compose senza richiedere un demone o privilegi di root.

Posso usare i file Docker Compose con Podman Compose?

Sì, Podman Compose legge i file standard docker-compose.yml. La maggior parte delle funzionalità di base di Docker Compose funziona subito, anche se dovrai cambiare le stringhe di connessione dai nomi dei servizi a localhost a causa del modello di rete basato su pod di Podman.

Qual è la principale differenza tra Podman Compose e Docker Compose?

Podman Compose gira rootless di default e non richiede un demone, mentre Docker Compose ha bisogno del demone Docker in esecuzione come root. Podman Compose usa anche il networking basato su pod, dove i container condividono localhost, mentre Docker Compose assegna a ogni servizio il proprio hostname.

Perché i miei servizi non riescono a connettersi quando uso Podman Compose?

Podman Compose mette tutti i servizi in un singolo pod che condivide un namespace di rete, quindi i container comunicano su localhost invece che per nomi di servizio. Dovrai cambiare le stringhe di connessione come db:5432 in localhost:5432 nelle configurazioni della tua applicazione.

Podman Compose funziona su macOS e Windows?

Sì, ma prima dovrai eseguire Podman dentro una VM Linux usando Podman Desktop o podman machine. Questo aggiunge complessità rispetto a Linux, dove Podman gira nativamente, e potresti incontrare sincronizzazione file più lenta e stranezze di rete.

Argomenti

Correlato