- Podman gestisce contenitori e pod senza un demone centrale, con una compatibilità quasi completa con comandi Docker e supporto nativo per container rootless.
- I pod raggruppano diversi contenitori che condividono una rete, un indirizzo IP e, facoltativamente, volumi, facilitando modelli quali sidecar e applicazioni multi-contenitore.
- Podman consente di creare reti, volumi e pod complessi, integrare podman-compose e generare manifesti Kubernetes per una facile migrazione ai cluster.
- Strumenti come Podman Desktop e buone pratiche di sicurezza, pulizia delle risorse e automazione CI/CD completano un ecosistema adatto allo sviluppo e alla produzione.

Se lavori con i container e provieni dal mondo Docker, probabilmente ultimamente hai sentito parlare di Podman e delle sue funzionalità. Contenitori e capsule come alternativa modernaNon si tratta semplicemente di "un altro Docker", ma di uno strumento progettato per essere più leggero, più sicuro e molto meglio integrato con l'ecosistema. Linux e Kubernetes, sia sui server che nei team di sviluppo.
In questa guida analizzeremo passo dopo passo cosa sono i contenitori Podman, come sono organizzati in pod, cosa differenzia Podman da Docker, come gestirli dalla riga di comando e anche quale ruolo svolgono strumenti come [inserisci qui i nomi degli strumenti]. podman-compose e Podman Desktop nel ciclo di vita di applicazioni nel mondo reale. L'idea è che alla fine avrai una comprensione chiara e pratica di come utilizzare Podman nella tua vita quotidiana.
Cos'è Podman e in cosa si differenzia da Docker?
Podman è uno strumento open source per la creazione e la gestione di container e pod. su sistemi Linux, gestito principalmente da Red Hat e distribuito con licenza Apache, il che significa che tutti i suoi componenti possono essere utilizzati senza problemi in ambienti commerciali. Sebbene sia nato su Linux, può essere utilizzato anche su macOS e Windows (tramite WSL2 o Podman Desktop).
A livello funzionale, Podman soddisfa lo stesso obiettivo di Docker: eseguire facilmente i contenitori OCIUtilizza un'interfaccia a riga di comando quasi identica a quella di Docker, al punto che è comune definire l'alias alias docker=podman riutilizzare gli script senza modificarli. Tuttavia, internamente l'architettura è diversa, ed è qui che entrano in gioco i vantaggi più importanti.
La prima differenza fondamentale è che Podman è "senza demone"Ciò significa che non dipende da un demone centrale che controlla tutti i contenitori. Ogni comando eseguito crea i propri processi e non esiste un servizio persistente come dockerdCiò si traduce in genere in un minore consumo di risorse, un modello di sicurezza più semplice e un'integrazione più fluida con strumenti di sistema come systemd.
Un altro aspetto molto rilevante è che Podman supporta nativamente i contenitori rootlessconsentire agli utenti senza privilegi di amministratore di eseguire contenitori senza dover concedere l'accesso a un socket radiceCiò riduce la superficie di attacco e lo rende particolarmente interessante nei server multiutente o negli ambienti aziendali con un controllo rigoroso delle autorizzazioni.
Infine, Podman incorpora il concetto di pod fin dall'inizio, ispirandosi direttamente a Kubernetes. Ciò significa che puoi raggruppare più contenitori che condividono una rete e immagazzinamento senza dover ricorrere a un orchestratore esterno o a strumenti come docker-composesebbene ci sia anche podman-compose per coloro che preferiscono l'approccio dichiarativo.
Cos'è un pod e come funziona in Podman?
Il termine Il termine "pod" deriva dal mondo Kubernetes e si riferisce a un "pod" di container. che condividono determinate risorse. In Kubernetes e anche in Podman, un pod può essere inteso come un'unità logica che raggruppa uno o più container che lavorano a stretto contatto.
All'interno di un baccello, Tutti i contenitori condividono un unico indirizzo IP. e un insieme di namespace di rete e, facoltativamente, volumi di archiviazione. Ciò significa che possono comunicare tra loro utilizzando localhost o 127.0.0.1come se fossero processi diversi all'interno della stessa macchina, anche se dall'esterno il pod è visto come un'unica entità accessibile tramite un IP e porte specifici.
In pratica, questo è molto utile per implementare modelli come contenitori sidecar o applicazioni in cui diversi servizi sono strettamente accoppiati. Ad esempio, un server web nginx in un contenitore e un PHP-FPM in un altro Possono vivere nello stesso pod, condividendo IP e comunicando tramite localhostma mantenendo separati i loro processi e cicli di vita.
Quando si crea un pod con Podman, viene introdotto un contenitore speciale chiamato contenitore infraQuesto contenitore, basato di default sull'immagine localhost/podman-pause (o simili come) k8s.gcr.io/pause), non fa altro che "dormire", ma la sua funzione è fondamentale: è responsabile della manutenzione degli spazi dei nomi del pod e funge da ancora per il resto dei contenitori che si connettono a quel pod.
Ogni contenitore, sia all'interno di un pod o meno, ha un processo di monitoraggio chiamato conmonQuesto piccolo programma C è responsabile del monitoraggio del contenitore, della gestione dei suoi input/output e dell'abilitazione di strumenti come Podman. collegare, allegare o raccogliere lo stato dal contenitore in qualsiasi momento.
Gestione dei pod con il comando podman pod
In Podman, tutto ciò che riguarda i pod viene gestito tramite il sottocomando podman podDa qui puoi creare pod, elencarne lo stato, aggiungere contenitori, controllarne il ciclo di vita o eliminarli quando non ti servono più.
podman pod create --name pod1
podman pod ps
ID, nome, stato Queste sono le colonne di base che vedrai quando elenchi i pod; sono accompagnate dall'identificatore del contenitore infrastrutturale associato.
Per aggiungere un nuovo contenitore a un pod esistente, è sufficiente aggiungere un nuovo contenitore Per connettere un pod, è necessario specificare il pod a cui si desidera connetterlo al momento della creazione. Un esempio tipico potrebbe essere:
podman run -dt --pod pod1 --name web nginx
Con questo comando, Abbiamo creato un contenitore basato sull'immagine nginx e lo abbiamo associato al pod pod1Quando questo contenitore principale si avvia, il pod passa allo stato "In esecuzione", poiché al suo interno sono presenti processi attivi.
podman ps -a --pod
All'uscita vedremo colonne come ID CONTENITORE, IMMAGINE, STATO e una colonna POD che indica l'ID o il nome del pod. Gli ID dei pod mostrati qui corrispondono a quelli visti in podman pod psche semplifica il confronto incrociato delle informazioni tra le due visualizzazioni.
Ciclo di vita del pod, registri e informazioni dettagliate
Una delle cose più belle dei baccelli è che Possiamo gestire tutti i tuoi container contemporaneamente.Sebbene sia ancora possibile arrestare, avviare o riavviare i contenitori singolarmente, operare sull'intero pod semplifica notevolmente la gestione delle applicazioni composite.
podman pod pause NOMBRE_O_ID_DEL_POD
podman pod unpause NOMBRE_O_ID_DEL_POD
podman pod stop NOMBRE_O_ID_DEL_POD
podman pod start NOMBRE_O_ID_DEL_POD
E se dobbiamo riavviarli direttamente, c'è anche podman pod restart per riavviare il set contenitore per cialde in un unico passaggio.
podman pod inspect NOMBRE_O_ID_DEL_POD
Quanto a i registriQuando nel pod è presente un solo contenitore principale, è semplice: possiamo ottenere l'output con un semplice podman logs riguardo a quel contenitoreTuttavia, se il pod contiene più contenitori, dobbiamo specificare da quale vogliamo i log utilizzando il parametro -c:
podman pod logs -c NOMBRE_DEL_CONTENEDOR NOMBRE_O_ID_DEL_POD
Per visualizzare i processi in esecuzione all'interno di tutti i contenitori di un pod, abbiamo anche comandi che raggruppano tali informazioni, consentendoci di eseguire una sorta di "ps distribuiti su tutti i contenitori dello stesso podQuesta funzionalità è molto utile quando si esegue il debug degli errori nelle applicazioni multi-contenitore.
Rimozione dei pod e della loro relazione con i contenitori
Quando si eliminano i pod, è fondamentale ricordare che L'eliminazione di un pod comporta l'eliminazione di tutti i contenitori in esso contenuti.Pertanto, Podman richiede che il pod venga arrestato prima di poter essere eliminato in modo sicuro, impedendo l'eliminazione accidentale dei container in esecuzione.
podman pod rm NOMBRE_O_ID_DEL_POD
podman pod rm -f NOMBRE_O_ID_DEL_POD
Quando accumuliamo molti pod, può essere utile eliminarli tutti in una volta. Esistono comandi pensati per rimuoverli. tutti i pod arrestati o addirittura tutti i pod nel sistema, sia detenuti che attivi, solitamente combinando opzioni come -a oppure utilizzando specifici sottocomandi "prune" a seconda della versione di Podman.
Rete e porte nei contenitori di un pod
Nel piano di rete, un pod si comporta come un'unità: Tutti i contenitori nel pod condividono lo stesso indirizzo IPQuesto indirizzo IP è quello assegnato al pod nel suo complesso e si connette alla rete che specifichiamo al momento della sua creazione.
Negli ambienti rootful, se non specifichiamo nulla, il pod si connette a ponte rosso predefinito da Podman. Al contrario, negli ambienti rootless l'opzione standard è la rete slirp4netns, che consente di esporre i servizi all'host senza richiedere privilegi elevati.
Quando vogliamo presentare un servizio al mondo esterno, dobbiamo effettuare la mappatura delle porte durante la creazione del podQuesto viene fatto utilizzando le opzioni -p o --publish, che indica la porta host e la porta pod interna:
podman pod create --name webpod -p 8080:80
podman run -dt --pod webpod --name nginx docker.io/library/nginx
In questo modo, qualsiasi richiesta all'indirizzo IP dell'host sulla porta 8080 raggiungerà la porta 80 del pod e da lì al container nginx. È importante notare che Può esserci un solo servizio in ascolto su ogni porta che mappiamoPertanto, non saremo in grado di avere due container nello stesso pod che offrono servizi sulla stessa porta interna mappata in uscita.
La comunicazione tra i contenitori all'interno dello stesso pod avviene semplicemente utilizzando localhost o 127.0.0.1Ciò significa che se un contenitore all'interno del pod offre un servizio HTTP sulla porta 80, un altro contenitore può accedervi tramite un URL come questo: http://127.0.0.1:80 senza preoccuparsi di IP o nomi host.
Archiviazione e volumi condivisi nei pod
Sebbene ogni contenitore possa avere il proprio spazio di stoccaggio, è molto comune che I contenitori all'interno dello stesso pod condividono parte del file systemsoprattutto quando un contenitore genera dati che un altro deve servire o elaborare.
Quando creiamo il pod, possiamo definire punti di montaggio che saranno visibili da tutti i contenitori al suo interno. Questi montaggi possono essere volumi gestiti da Podman o montaggi diretti delle directory host (montaggi bind), a seconda che preferiamo delegare il percorso fisico a Podman o controllarlo noi stessi.
Un esempio molto istruttivo è quello di un baccello chiamato pod5 che espone un server web sulla porta 8082 dell'host. In quel pod abbiamo due container:
- Un contenitore principale
webbasato su nginx, che crea un volume condiviso in/usr/share/nginx/html, il suo DocumentRoot. Questo contenitore è responsabile della distribuzione del web. - Un contenitore ausiliario
sidecarla cui missione è quella di modificare periodicamente il fileindex.htmlall'interno dello stesso volume, ad esempio ogni secondo, generando contenuti dinamici o messaggi che cambiano.
Per fare ciò, creiamo il pod specificando sia la porta che il volume, quindi aggiungiamo entrambi i contenitori, montando lo stesso volume sui percorsi appropriati. podman volume possiamo gestire questi volumi, e con podman volume inspect vedere dove si trova fisicamente il percorso sull'host (ad esempio, qualcosa come ~/.local/share/containers/storage/volumes/NOMBRE/_data in ambienti senza radici).
Se preferiamo utilizzare i mount bind invece dei volumi, quando creiamo il contenitore possiamo montare direttamente una directory sull'host, aggiungendo l'opzione :z quando lavoriamo con SELinux in modo che i contesti di sicurezza vengano regolati automaticamente e non si verifichino problemi di accesso dal contenitore.
Contenitori con Podman: comandi base di tutti i giorni
Se non hai mai lavorato con Podman (o Docker), la prima cosa da capire è che I container sono una forma di virtualizzazione leggeraNon ricreano hardware non è un nuovo kernel, ma applica namespace, cgroup e altre tecniche del kernel per isolare i processi, condividendo lo stesso kernel del sistema host.
Di fronte a Macchine virtuali A differenza dei container tradizionali, i container in genere consumano meno risorse, si avviano molto più velocemente e consentono densità più elevate, con conseguenti distribuzioni più efficienti. Strumenti come LXC/LXD si concentrano su container di sistema "completi", mentre Podman (e Docker) si concentrano su contenitori minimalisti per l'esecuzione di servizi specifici come databaseserver web o applicazioni di posta elettronica.
podman run -dt -p 8080:80/tcp docker.io/library/httpd
In questo caso, Podman tenta di scaricare l'immagine. docker.io/library/httpd se non esiste localmente (salvandolo in percorsi come ~/.local/share/containers/storage (per gli utenti senza root), crea il contenitore e lo avvia in background (-dt (indica la modalità di distacco e pseudo-TTY). La porta 8080 dall'host a cui reindirizza 80/tcp dal contenitore, così possiamo aprire il browser in 127.0.0.1:8080 e vedremo la pagina Apache predefinita.
podman ps
E se vogliamo vedere anche chi è detenuto, aggiungiamo l'opzione -aNell'output vedremo colonne come ID CONTENITORE, IMMAGINE, COMANDO, STATO, PORTE e NOME, dove il nome è solitamente un alias leggibile dall'uomo (ad esempio xenodochial_newton o uno che abbiamo inserito).
podman stop NOMBRE_O_ID
podman start NOMBRE_O_ID
E liberatene quando non vi servono più con:
podman rm NOMBRE_O_ID
Per gestire le immagini locali, abbiamo comandi come:
podman image list
che ci mostra repository, tag, ID, dimensione e data di creazione, e con altri come podman image prune per ripulire le immagini che non sono più in uso.
Volumi di dati e persistenza in Podman
Le immagini sono progettate per essere immutabili e contenere solo quanto basta per il servizio Boot, Ma dati di lavoro (siti web, database, file utente) Devono essere conservati in un luogo in cui possano sopravvivere allo smaltimento dei contenitori.
È qui che entrano in gioco i volumi, consentendo di montare una directory host all'interno del contenitore. Immaginiamo di voler archiviare il contenuto di un sito web servito da Apache; l'immagine si aspetta di trovarlo in /usr/local/apache2/htdocsPossiamo creare un volume chiamato www con:
podman volume create www
e poi lancia il contenitore in questo modo:
podman run -dt --name apache -p 8080:80 -v www:/usr/local/apache2/htdocs docker.io/library/httpd
In questo modo, tutti i file presenti su quel volume verranno serviti esternamente da Apache. Utilizzando:
podman volume inspect www
Possiamo vedere che il volume è salvato in un percorso come /home/USUARIO/.local/share/containers/storage/volumes/www/_dataBasta copiare lì il nostro sito web per renderlo accessibile dal contenitore.
Set di contenitori con podman-compose
Quando un'applicazione necessita di più servizi (ad esempio, un sito WordPress con il suo database MariaDB), definire e avviare manualmente ogni contenitore con podman run e i suoi molteplici parametri Può essere piuttosto macchinoso e soggetto a errori.
Ecco a cosa serve. podman-composeuno strumento che replica il comportamento di docker-compose utilizzando i file docker-compose.yamlLì dichiariamo servizi, reti e volumi e poi lasciamo che Podman si occupi di configurare il tutto.
Un esempio tipico è un file in cui definiamo due servizi:
- servizio
webcon immaginidocker.io/library/wordpress, che espone la porta 8080 dell'host alla porta interna 80, monta un volume per i file Web e ottiene variabili di ambiente per connettersi al database. - servizio
dbcon immaginidocker.io/library/mariadb:10.5, che espone la porta 6603, monta un volume per i dati del database e definisce le credenziali e il database iniziale.
Entrambi i servizi si connettono alla stessa rete chiamata wpnet e condividere i volumi dichiarati nella sezione volumesDurante l'esecuzione:
podman-compose up
Vengono creati i contenitori, la rete, i volumi e inoltre, un pod che raggruppa quei contenitoriUn comando podman ps più tardi mostrerà qualcosa di simile a un contenitore infra (ad esempio 663f84f58792-infra) accanto ai contenitori wordpress_db_1 y wordpress_web_1.
Se elenchiamo i baccelli con:
podman pod ls
Vedremo una voce per quel pod (ad esempio, chiamata wordpress) con il suo ID POD, stato e numero di contenitori. Da lì possiamo per interrompere o avviare improvvisamente l'intero montaggio con podman pod stop y podman pod start, senza preoccuparsi se iniziano nell'ordine corretto.
Vedremo i volumi associati a questo stack con podman volume ls (per esempio wordpress_wordpress y wordpress_wpdbvol), e le immagini coinvolte appariranno in podman image ls (WordPress, MariaDB e l'immagine infra/pause utilizzata per il pod).
Installazione di Podman su Linux, macOS e Windows
Installare Podman oggigiorno è abbastanza semplice perché Le distribuzioni moderne lo includono già nei loro repositoryNei sistemi basati su Debian o Ubuntu, la sequenza tipica sarebbe:
sudo apt update
sudo apt install -y podman
Altre distribuzioni come Fedora, CentOS Stream o openSUSE utilizzano i propri gestori di pacchetti (DNF, Zypper, ecc.), ma l'idea è la stessa: installare il pacchetto podman direttamente dai repository ufficiali.
Su macOS, essendo un sistema di UnixAnche l'integrazione è comoda. Il metodo più comune è usare Homebrew, eseguendo:
brew install podman
Parallelamente c'è Podman Desktop per chi preferisce un'interfaccia graficaQuesta applicazione installa e configura Podman in modo autonomo e fornisce un'interfaccia grafica utente (GUI) per la gestione di container, immagini e pod senza dover fare troppo affidamento su altri strumenti. terminale.
In Windows, il percorso passa quasi sempre attraverso WSL2 e una distribuzione Linux all'interno di quell'ambiente (come Ubuntu). Una volta installati WSL2 e la distribuzione, si accede alla shell Linux e si seguono gli stessi passaggi di installazione di una distribuzione classica. Podman Desktop può essere utilizzato anche su Windows, ma richiederà comunque il sottosistema WSL2 sottostante affinché tutto funzioni correttamente.
Per verificare che l'installazione sia avvenuta correttamente, è sufficiente eseguire:
podman --version
e confermare che restituisce un numero di versione e non un errore di comando non trovato.
Gestione di rete e pod dalla CLI
Oltre ai sottocomandi incentrati sui container, Podman ha un'API di rete molto simile a quella di Docker. podman network ls Possiamo vedere le reti disponibili (bridge predefinito, slirp4netns in modalità rootless, reti personalizzate, ecc.).
podman network create mi_red
podman run -d --network mi_red nginx
Ciò consente a diversi gruppi di container di avere reti indipendenti, con diverse regole e policy di isolamento, il che è utile in ambienti di sviluppo avanzati o in distribuzioni con più applicazioni sulla stessa macchina.
La relazione tra reti e pod è molto flessibile: quando creiamo un pod possiamo specificare a quale rete si connette, come vengono pubblicizzate le sue porte e quali policy di accesso si applicanoche si adatta molto bene al modo in cui verrà successivamente effettuata la migrazione verso scenari Kubernetes.
Integrazione con Kubernetes e generazione YAML
Uno dei punti di forza di Podman è che Il mondo dello sviluppo locale avvicina molto di più il mondo di Kubernetes a quello dello sviluppo locale.Sebbene non sia necessario un cluster per lavorare con i pod sulla tua macchina, se un giorno deciderai di effettuare il passaggio, potrai riutilizzare gran parte di ciò che già possiedi.
podman generate kube MI_POD > mi_pod.yaml
Quel file mi_pod.yaml Può servire direttamente come base per distribuire la stessa applicazione su un cluster Kubernetes reale, adattandola secondo necessità. Possiamo anche procedere nella direzione opposta e Crea risorse Podman da un manifesto K8s attraverso:
podman kube play mi_pod.yaml
Grazie a questo bridge, è molto naturale iniziare con Podman in ambienti di sviluppo o staging e poi spostare gli stessi carichi di lavoro su Kubernetes senza dover rifare l'intera configurazione da zero.
Podman Desktop: interfaccia grafica, debug ed ecosistema
Per coloro che preferiscono evitare così tanti comandi o desiderano un'esperienza visiva con i loro contenitori, Podman Desktop è un'interfaccia grafica utente open source e multipiattaforma che si integra con Podman e, in molti casi, anche con Kubernetes.
Da questa interfaccia puoi creare, avviare, arrestare, riavviare e ispezionare i contenitori Con un paio di clic puoi visualizzare i tuoi registri in tempo reale, controllare l'utilizzo di CPU, memoria e disco e aprire un terminale interattivo all'interno di un contenitore per risolvere problemi o eseguire comandi specifici.
Una delle sue funzionalità più utili è la procedura guidata per la creazione delle immagini. Invece di dover lottare con le opzioni della CLI, Podman Desktop ti consente di guida passo passo nella selezione di immagini di base, dipendenze e configurazioni, consentendo anche build in più fasi per ridurre le dimensioni finali dell'immagine e migliorare le prestazioni.
Lo strumento offre anche una vista integrata per le risorse Kubernetes come pod, distribuzioni e servizi. Ciò rende possibile monitorare un cluster, controllare lo stato delle applicazioni e regolare i limiti delle risorse senza uscire dalla stessa applicazione, il che è ideale negli ambienti di sviluppo cloud nativi.
Inoltre, Podman Desktop dispone di un ecosistema di plugin e compatibilità con numerose estensioni originariamente progettate per Docker Desktop, semplificando la transizione da una piattaforma all'altra per i team che erano già molto abituati a lavorare graficamente.
Best practice, sicurezza e automazione con Podman
Per sfruttare al meglio Podman, è consigliabile seguire una serie di best practice, soprattutto in ambienti in cui sicurezza e prestazioni sono importanti. Una delle più consigliate è Utilizzare contenitori senza radici quando possibileeseguendo Podman come utente normale ed evitando di concedere più privilegi di quelli strettamente necessari.
Un'altra abitudine molto utile è sfruttare la compatibilità con Docker CLISe hai già molti script e pipeline che chiamano dockerÈ possibile definire un alias:
alias docker=podman
e continuare a utilizzare esattamente gli stessi comandi di prima, delegandoli però a Podman. Questo semplifica notevolmente le migrazioni graduali nei team di sviluppo o CI/CD, dove modificare tutti gli script contemporaneamente sarebbe un incubo.
Per quanto riguarda la gestione dello spazio, è consigliabile ripulire periodicamente le risorse inutilizzate. Comandi come:
podman image prune
podman container prune
Rimuovono immagini e contenitori che non sono più in uso, contribuendo a impedire che l'archivio host si riempia di detriti di vecchi test e implementazioni.
Infine, negli ambienti aziendali è interessante integrare Podman con Strumenti CI/CD, gestione della configurazione e soluzioni di sicurezzaEssendo open source e supportando gli standard OCI, si adatta molto bene alle pipeline con GitHub Actions, GitLab CI, Jenkins e strumenti simili, consentendo di creare, firmare e distribuire immagini senza dipendere da Docker.
Considerando tutto quanto sopra, Podman diventa un'opzione molto solida sia per coloro che già utilizzano Docker sia per coloro che stanno appena iniziando nel mondo dei container, offrendo una combinazione di sicurezza, compatibilità, integrazione con Kubernetes e facilità d'uso che lo rende particolarmente interessante per progetti moderni, ambienti di sviluppo e implementazioni di produzione.
Scrittore appassionato del mondo dei byte e della tecnologia in generale. Adoro condividere le mie conoscenze attraverso la scrittura, ed è quello che farò in questo blog, mostrarti tutte le cose più interessanti su gadget, software, hardware, tendenze tecnologiche e altro ancora. Il mio obiettivo è aiutarti a navigare nel mondo digitale in modo semplice e divertente.