Podman su Ubuntu: Creare ed Eseguire Container con Dockerfile (Guida dal Principiante al Pratico)

目次

1. Introduzione

L’evoluzione della tecnologia dei container e perché è importante

Negli ultimi anni, l’importanza della tecnologia dei container è aumentata rapidamente nello sviluppo e nelle operazioni delle applicazioni. In particolare, la capacità di garantire la riproducibilità allineando gli ambienti di sviluppo e produzione ha ottenuto un forte supporto tra gli ingegneri.

Docker è stato a lungo la soluzione dominante in questo ambito, ma negli ultimi anni, Podman è emerso come una valida alternativa. Podman offre una CLI (Command Line Interface) quasi identica a Docker, fornendo al contempo vantaggi chiave come un’architettura senza demone, operazione leggera e esecuzione senza privilegi di root senza richiedere privilegi di root.

Perché “Podman + Dockerfile + Ubuntu”?

Questo articolo spiega le operazioni moderne con i container su Linux combinando tre elementi essenziali: Podman, Dockerfile e Ubuntu.

  • Ubuntu è una distribuzione Linux ampiamente utilizzata, adatta sia ai principianti che agli utenti avanzati,
  • Dockerfile funge da modello per la creazione di immagini di container,
  • E Podman è uno strumento di nuova generazione che consente una gestione dei container più flessibile e sicura.

Con la crescente consapevolezza della sicurezza, l’uso di Podman con Dockerfile su Ubuntu è diventato una scelta popolare sia per gli sviluppatori individuali sia per gli ambienti aziendali.

Scopo e pubblico di riferimento

Lo scopo di questo articolo è spiegare attentamente come creare Dockerfile e realizzare container pratici usando Podman su Ubuntu.

Questo articolo è destinato a lettori come:

  • Coloro che hanno esperienza con Docker e sono interessati a Podman
  • Utenti di Ubuntu che desiderano gestire i container in modo sicuro
  • Ingegneri che intendono adottare la tecnologia dei container nel loro lavoro
  • Principianti che vogliono provare a scrivere Dockerfile e a costruire immagini con Podman

Oltre all’uso di base, questo articolo copre anche consigli di risoluzione dei problemi, le principali differenze rispetto a Docker e le strategie di migrazione.

2. Cos’è Podman?

Panoramica di base di Podman

Podman (Pod Manager) è uno strumento di gestione dei container di nuova generazione sviluppato dalla community guidata da Red Hat. Come Docker, può creare, eseguire e gestire container conformi a OCI (Open Container Initiative), ma la sua filosofia di progettazione e architettura differiscono in modo significativo.

La caratteristica più notevole è che Podman non richiede un demone. Questo consente un’operazione leggera e sicura. Podman supporta anche la modalità rootless, permettendo agli utenti normali di gestire i container senza escalation di privilegi. La compatibilità della sua CLI con Docker è molto alta, rendendo la migrazione semplice.

Caratteristiche principali di Podman

Di seguito alcune delle principali caratteristiche di Podman:

Architettura senza demone

Podman non si basa su un processo demone in background per gestire i container. Questo permette un utilizzo più efficiente delle risorse senza servizi di background inutili.

Supporto rootless (utente non privilegiato)

Podman consente agli utenti non amministratori di avviare e gestire i container. Questo migliora notevolmente la sicurezza in ambienti multiutente o server e riduce significativamente i rischi di sicurezza.

CLI compatibile con Docker

Podman utilizza quasi la stessa struttura di comandi di Docker. Ad esempio, i seguenti comandi Docker funzionano quasi identicamente in Podman:

podman build -t myimage .
podman run -it myimage bash

Di conseguenza, gli utenti Docker possono migrare con minima frizione.

Funzionalità Pod

Podman incorpora il concetto di “Pod” di Kubernetes, consentendo la gestione di più container come un’unica unità logica. Questo rende Podman altamente compatibile con Kubernetes e permette transizioni fluide dallo sviluppo locale agli ambienti cloud.

Compatibilità con Ubuntu

Mentre Podman è ampiamente adottato in Fedora e nelle distribuzioni basate su RHEL, funziona in modo stabile anche su Ubuntu. Può essere installato dai repository ufficiali con una configurazione relativamente semplice. Dalla versione Ubuntu 20.04 LTS, il supporto dei pacchetti è notevolmente migliorato, abbassando la soglia d’ingresso.

3. Installare Podman su Ubuntu

Prima di Iniziare: Prerequisiti

Prima di installare Podman su Ubuntu, verifica prima la tua versione di Ubuntu. Podman è ufficialmente consigliato per Ubuntu 20.04 LTS o versioni successive. Su versioni più vecchie, i pacchetti richiesti potrebbero non essere disponibili nei repository ufficiali.

Puoi controllare la tua versione di Ubuntu usando il seguente comando:

lsb_release -a

L’installazione di Podman richiede privilegi sudo. Anche se prevedi di usare Podman in modalità rootless, i privilegi di amministratore sono comunque necessari durante l’installazione.

Installare Podman dal Repository Ufficiale di Ubuntu

Sulle versioni recenti di Ubuntu, come 20.04 o 22.04, Podman può essere installato facilmente usando APT.

sudo apt update
sudo apt install -y podman

Dopo l’installazione, verifica che Podman sia stato installato correttamente controllando la versione:

podman --version

Installare l’Ultima Versione Usando il PPA Ufficiale

La versione di Podman inclusa nel repository predefinito di Ubuntu è spesso leggermente obsoleta. Se desideri utilizzare le funzionalità più recenti, puoi installare Podman dal PPA ufficiale.

. /etc/os-release
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
curl -L https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/xUbuntu_${VERSION_ID}/Release.key | sudo apt-key add -
sudo apt update
sudo apt install -y podman

Questo metodo ti consente di usare le versioni più recenti di Podman equivalenti a quelle presenti su sistemi Red Hat e Fedora.

Test di Base della Funzionalità di Podman

Dopo l’installazione, esegui un semplice test per confermare che Podman funzioni correttamente:

podman info

Questo comando mostra la configurazione di Podman, la versione e le funzionalità supportate, come la modalità rootless.

Puoi anche testare l’esecuzione di un container avviando un’immagine ufficiale di Alpine Linux:

podman run --rm -it alpine sh

Se la shell si avvia correttamente, Podman sta funzionando come previsto.

4. Nozioni di Base sui Dockerfile e Uso con Podman

Che Cos’è un Dockerfile?

Un Dockerfile è un modello utilizzato per costruire immagini di container. È un file di testo che definisce istruzioni come l’immagine di base da usare, i pacchetti da installare e i file da copiare.

Sulla base di questo file, strumenti di container come Podman e Docker possono creare automaticamente un ambiente coerente.

Le istruzioni più comuni nei Dockerfile includono:

FROM ubuntu:22.04
RUN apt update && apt install -y curl
COPY ./app.sh /usr/local/bin/app.sh
CMD ["bash", "/usr/local/bin/app.sh"]

Questo esempio installa pacchetti su un’immagine di base Ubuntu, copia uno script e definisce il comando di esecuzione predefinito.

Usare Dockerfile con Podman

Podman può costruire immagini di container da Dockerfile nello stesso modo di Docker.

1. Preparare la Directory del Progetto

Crea la seguente struttura di directory:

project/
├── Dockerfile
└── app.sh

Il file app.sh può contenere uno script semplice:

#!/bin/bash
echo "Hello from Podman container!"

Rendi lo script eseguibile:

chmod +x app.sh

2. Costruire l’Immagine con Podman

Esegui il comando seguente nella directory che contiene il Dockerfile:

podman build -t mypodmanapp .

Questo crea un’immagine di container chiamata mypodmanapp.

3. Verificare l’Immagine Costruita

Puoi elencare le immagini disponibili con:

podman images

4. Eseguire il Container

Avvia un container usando l’immagine costruita:

podman run --rm mypodmanapp

Se configurato correttamente, l’output Hello from Podman container! verrà visualizzato.

Dockerfile vs Containerfile

In Podman, i file che usano la sintassi Dockerfile possono anche essere chiamati Containerfile. Questa denominazione riflette il desiderio di una terminologia indipendente da Docker.

Non c’è alcuna differenza funzionale tra Dockerfile e Containerfile. Entrambi sono pienamente supportati da Podman.

podman build -f Containerfile -t myimage .

È possibile specificare il nome del file esplicitamente usando l’opzione -f.

5. Esempio pratico: creazione di un container basato su Ubuntu

Creazione di un Dockerfile basato su Ubuntu

Da qui, percorreremo un esempio pratico, passo‑passo, di creazione di un Dockerfile basato su Ubuntu e costruzione ed esecuzione di un’immagine container con Podman.

Per prima cosa, crea il seguente semplice Dockerfile:

FROM ubuntu:22.04

RUN apt update && \
    apt install -y curl && \
    apt clean

COPY hello.sh /usr/local/bin/hello.sh
RUN chmod +x /usr/local/bin/hello.sh

CMD ["/usr/local/bin/hello.sh"]

Questo Dockerfile esegue le seguenti operazioni:

  • Usa l’immagine ufficiale Ubuntu 22.04 come base
  • Installa il pacchetto curl
  • Copia hello.sh dall’host nel container
  • Imposta hello.sh come script di esecuzione predefinito

Successivamente, crea un semplice script shell chiamato hello.sh:

#!/bin/bash
echo "Hello, this output is from a Podman container!"

Concedi i permessi di esecuzione allo script:

chmod +x hello.sh

Costruzione dell’immagine con Podman

Una volta pronti i file, costruisci l’immagine usando il comando seguente:

podman build -t ubuntu-hello .

L’opzione -t ubuntu-hello assegna un nome di tag all’immagine, e il . finale specifica la directory contenente il Dockerfile.

Se la compilazione termina con successo, l’immagine verrà memorizzata localmente.

podman images

Puoi usare questo comando per verificare che l’immagine sia stata creata.

Esecuzione e verifica dell’immagine costruita

Esegui un container dall’immagine appena creata usando il comando seguente:

podman run --rm ubuntu-hello

Output di esempio:

Hello, this output is from a Podman container!

L’opzione --rm rimuove automaticamente il container al termine dell’esecuzione, rendendolo ideale per scopi di test.

Opzionale: esecuzione di un container interattivo

Se desideri interagire direttamente con il container, puoi avviarlo con l’opzione -it e lanciare Bash:

podman run -it ubuntu-hello bash

Questo ti consente di usare il container come un ambiente di sviluppo leggero basato su Ubuntu.

6. Funzionalità utili di Podman e consigli

Punti di forza di Podman: flessibilità e sicurezza

Mantenendo la compatibilità con Docker, Podman offre funzionalità che consentono operazioni container più flessibili e sicure. Questa sezione presenta funzionalità pratiche e suggerimenti particolarmente utili nella routine quotidiana.

Operazioni sicure con la modalità rootless

Una delle funzionalità più potenti di Podman è la modalità rootless, che permette agli utenti normali di avviare, arrestare e gestire i container senza privilegi di amministratore.

Puoi eseguire i container senza sudo come mostrato di seguito:

podman run -it ubuntu bash

Poiché questa operazione è confinata nella directory home dell’utente, l’impatto a livello di sistema è ridotto. La modalità rootless è particolarmente utile su server condivisi e ambienti di sviluppo.

Avvio automatico con integrazione systemd

Podman supporta l’integrazione nativa con systemd, consentendo ai container di avviarsi automaticamente come servizi Linux.

Puoi generare un’unità di servizio systemd per un container usando il comando seguente:

podman generate systemd --name mycontainer --files --restart-policy=always

Questo comando crea i file di unità in ~/.config/systemd/user/. Dopo la generazione, abilita e avvia il servizio come segue:

systemctl --user daemon-reexec
systemctl --user enable --now container-mycontainer.service

Questa configurazione garantisce che i container si avviino automaticamente all’avvio del sistema.

Gestione di più container con podman-compose

Oltre a gestire container singoli, Podman supporta l’orchestrazione multi‑container. Utilizzando podman‑compose, è possibile ottenere una funzionalità simile a Docker Compose.

Installa podman‑compose usando pip:

pip install podman-compose

Poiché è ampiamente compatibile con i file docker-compose.yml, è spesso possibile riutilizzare le configurazioni esistenti.

Avviare i servizi è semplice come eseguire:

podman-compose up -d

Questo ti consente di riprodurre ambienti di sviluppo completi istantaneamente anche quando usi Podman.

Altri comandi utili e consigli

Pulizia di immagini e container inutilizzati

podman system prune -a

Questo comando rimuove container, immagini e file temporanei inutilizzati, aiutando a mantenere pulito lo spazio di archiviazione.

Abilitare il completamento dei comandi (bash/zsh)

Puoi installare il supporto al completamento dei comandi con il seguente pacchetto:

sudo apt install podman-docker

Questo abilita il completamento dei comandi simile a Docker per Podman, migliorando la produttività.

7. Guida alla migrazione: da Docker a Podman

Perché la migrazione a Podman sta guadagnando attenzione

Docker è stato a lungo sinonimo di tecnologia dei container, ma negli ultimi anni, un passaggio verso Podman come alternativa più leggera e sicura ha guadagnato slancio. In particolare, Red Hat Enterprise Linux (RHEL) e Fedora hanno ridotto il supporto a Docker e hanno adottato Podman come motore di container predefinito, spingendo molte organizzazioni a considerare la migrazione.

Questa sezione spiega i passaggi pratici e le considerazioni importanti per migrare senza problemi da Docker a Podman.

Compatibilità dei comandi tra Docker e Podman

Podman mantiene un alto livello di compatibilità della CLI con Docker, consentendo di sostituire direttamente la maggior parte dei comandi senza modifiche.

DockerPodman
docker build -t myapp .podman build -t myapp .
docker run -it myapppodman run -it myapp
docker imagespodman images
docker pspodman ps

Ciò rende possibile passare a Podman senza cambiare il tuo flusso di lavoro, che è uno dei suoi maggiori vantaggi.

Ottenere piena compatibilità con podman-docker

Se gli script esistenti, le pipeline CI/CD o gli strumenti presumono la presenza del comando docker, puoi installare il pacchetto podman-docker per far sì che Podman funzioni come sostituto immediato.

sudo apt install podman-docker

Dopo l’installazione, il comando docker diventa un collegamento simbolico a Podman:

which docker
# → /usr/bin/docker → symbolic link to podman

Questo consente agli script basati su Docker esistenti di funzionare su Podman senza modifiche.

Sostituire docker-compose con podman-compose

Per i progetti che usano Docker Compose per definire ambienti multi‑container, podman-compose fornisce un’alternativa compatibile.

Sebbene la compatibilità sia generalmente alta, nota le seguenti limitazioni:

  • Alcune opzioni di Compose (come depends_on) potrebbero non essere supportate o comportarsi diversamente
  • Possono esserci differenze nel logging degli eventi e nel comportamento dei controlli di salute

Per configurazioni tipiche, come una combinazione di server web e database, la migrazione è solitamente semplice.

Migrazione di immagini e volumi

Le immagini Docker memorizzate localmente non possono essere accedute direttamente da Podman. È necessario o riscaricarle o esportarle e importarle.

Opzione 1: Riscaricare le immagini con Podman

podman pull ubuntu:22.04

Opzione 2: Esportare da Docker e importare in Podman

# Export from Docker
docker save myimage > myimage.tar

# Import into Podman
podman load < myimage.tar

Ciò consente di riutilizzare le immagini create con Docker in Podman.

Considerazioni aggiuntive sulla migrazione

  • Differenze nell’operazione rootless: Docker tipicamente presuppone l’uso di root, mentre Podman è progettato per l’operazione rootless
  • Architettura daemon: Podman è senza daemon, modificando il modo in cui i processi in background sono gestiti
  • Posizioni di archiviazione dei log e dei dati differiscono e dovrebbero essere riviste durante la migrazione

8. Domande Frequenti (FAQ)

Q1. Qual è la principale differenza tra Podman e Docker?

A1. La differenza più significativa è che Podman opera senza un demone. Questo consente un funzionamento più leggero e sicuro. Podman supporta anche la modalità rootless, che permette la gestione dei container senza escalazione di privilegi. La compatibilità CLI con Docker è molto alta.

Q2. Qual è la differenza tra Dockerfile e Containerfile?

A2. Non c’è nessuna differenza funzionale. Entrambi i file descrivono le istruzioni per la build del container utilizzando la stessa sintassi.
Il nome Containerfile è preferito nei progetti conformi a OCI per evitare terminologia specifica di Docker. In pratica, Dockerfile funziona perfettamente con Podman.

Q3. Docker Compose può essere utilizzato con Podman?

A3. Docker Compose non è supportato direttamente, ma è possibile utilizzare podman-compose come alternativa. Esso interpreta i file docker-compose.yml in un ambiente Podman.

Alcune opzioni come depends_on sono limitate, quindi si raccomanda il test per configurazioni complesse.

Q4. Podman funziona in modo stabile su Ubuntu?

A4. Sì. Podman funziona in modo stabile su Ubuntu 20.04 LTS e versioni successive. È disponibile nei repository ufficiali di Ubuntu e può essere installato facilmente utilizzando apt. Per versioni più recenti, l’utilizzo di un PPA è anche un’opzione.

Q5. Ci sono limitazioni nell’utilizzo della modalità rootless?

A5. La modalità rootless restringe determinate operazioni privilegiate e il binding alle porte inferiori a 1024. Tuttavia, queste limitazioni possono spesso essere aggirate utilizzando il port forwarding. Per la maggior parte dei casi d’uso, la modalità rootless è pienamente pratica.

Q6. Podman può scaricare le stesse immagini di Docker Hub?

A6. Sì. Podman può scaricare immagini da Docker Hub per impostazione predefinita. In alcuni ambienti, potrebbe essere necessario specificare esplicitamente il registro e lo spazio dei nomi:

podman pull docker.io/library/ubuntu

Podman supporta anche altri registri come Quay.io e GitHub Container Registry.

Q7. Podman è adatto per ambienti di produzione?

A7. Sì. Podman include funzionalità richieste per l’uso in produzione, come i concetti di pod compatibili con Kubernetes e l’integrazione con systemd. In ambienti sensibili alla sicurezza, Podman potrebbe essere una scelta migliore rispetto a Docker.

Podman è già il motore di container predefinito in RHEL e Fedora e ha un’adozione estesa in produzione.