Vai al contenuto

Podman

Introduzione

Note

Questo documento rappresenta il contenuto esteso del suo [documento di riferimento trovato qui](../../gemstones/containers/podman.md). Se si ha bisogno di una guida rapida, il documento di riferimento può essere sufficiente.

Podman (Pod Manager) è uno strumento di gestione di container e immagini compatibile con la OCI (Open Container Initiative).

Podman:

  • funziona senza un daemon (può eseguire i container come servizio systemd)
  • permette di gestire i container come utente non privilegiato (non è necessario essere root)
  • incluso, a differenza di docker, nei repository Rocky Linux

Questo rende Podman non solo un runtime alternativo per container compatibile con docker, ma molto di più.

Installare Podman

Utilizzare l'utilità dnf per installare Podman:

dnf install podman

È possibile recuperare l'elenco dei sottocomandi Podman disponibili con il seguente comando:

$ podman --help

Manage pods, containers and images

Usage:
  podman [options] [command]

Available Commands:
  attach      Attach to a running container
  auto-update Auto update containers according to their auto-update policy
...
...

Ecco un elenco selezionato dei sottocomandi più comunemente utilizzati:

SottocomandoDescrizione
buildCrea un'immagine usando le istruzioni nei Containerfiles
commitCrea una nuova immagine basata sul container modificato
containerGestore dei container
cpCopia file/cartelle tra un container e il filesystem locale.
createCrea ma non avvia un container
execEsegue un processo in un container in esecuzione
imageGestione immagini
imagesElenca le immagini nello storage locale
infoVisualizza le informazioni del sistema Podman
initInizializza uno o piu' container
inspectVisualizza la configurazione dell'oggetto indicato con ID
killTermina uno o più container in esecuzione con un segnale specifico
loginLog in al registro di un container
logsRecupera i registri di uno o più container
networkGestione delle reti
pauseMette in pausa tutti i processi in uno o più container.
psElenca i container
pullPull una image da un registry
pushPush una image ad una destinazione specifica
restartRiavvia uno o più container
rmCancella uno o più container
rmiRimuove una o più image dallo storage locale
runEsegue un comando su un nuovo container
startAvvia uno o più container
statsVisualizza un stream in tempo reale delle statistiche sull'utilizzo delle risorse del container.
stopTermina uno o più container
systemGestione di Podman
topVisualizza i processi in esecuzione di un container
unpauseRiavvia i processi in uno o più container
volumeGestisce i volume

Nota

Podman può eseguire quasi tutti i comandi Docker grazie alla sua interfaccia CLI simile.

Se si deve usare un compose file, ricordarsi di installare il pacchetto podman-compose:

dnf install podman-compose

Aggiungere un container

Eseguire una piattaforma cloud self-hosted Nextcloud come esempio:

podman run -d -p 8080:80 nextcloud

Verrà richiesto di selezionare il registro del container da cui scaricare. In questo esempio, si utilizzerà docker.io/library/nextcloud:latest.

Una volta scaricata l'immagine di Nextcloud, questa verrà eseguita.

Inserite indirizzo_ip:8080 nel browser web (supponendo di aver aperto la porta in firewalld) e configurate Nextcloud:

Nextcloud in container

Suggerimento

Per seguire l'output dei log dell'ultimo container creato, usare `podman logs -lf`. `-l` specifica di usare l'ultimo container creato, mentre `-f` specifica di seguire i log, man mano che vengono creati. Premere Ctrl+C per interrompere l'output dei log.

Esecuzione dei container come servizi systemd

Utilizzo di quadlet

Dalla versione Podman 4.4 con Quadlet - viene fornito un generatore di systemd. Può essere usato per generare unit file per servizi systemd rootless e rootful.

Collocare i file Quadlet per i servizi rootful in:

  • /etc/containers/systemd/
  • /usr/share/containers/systemd/

Posizionare i file rootless in uno qualsiasi dei seguenti percorsi:

  • $XDG_CONFIG_HOME/containers/systemd/ o ~/.config/containers/systemd/
  • /etc/containers/systemd/users/$(UID)
  • /etc/containers/systemd/users/

Oltre ai singoli contenitori, sono supportati i file pod, immagine, rete, volume e kube. In particolare focalizzandosi sull'esempio di Nextcloud. Creare un nuovo file ~/.config/containers/systemd/nextcloud.container con il seguente contenuto:

[Container]
Image=nextcloud
PublishPort=8080:80

Sono disponibili molte altre opzioni.

Per eseguire il generatore e far sapere a systemd che è stato eseguito un nuovo servizio:

systemctl --user daemon-reload

Per avviare il servizio, eseguite:

systemctl --user start nextcloud.service

Nota

Se si è creato un file in una delle directory per i servizi rootful, omettere il flag `--user`.

Per eseguire automaticamente il container all'avvio del sistema o al login dell'utente, si può aggiungere un'altra sezione al file nextcloud.container:

[Install]
WantedBy=default.target

Poiché i file di servizio generati sono considerati transitori, non possono essere abilitati da systemd. Per ovviare a questo problema, il generatore applica manualmente le installazioni durante la generazione. In questo modo si abilitano effettivamente anche i file dei servizi.

Sono supportati altri tipi di file: pod, volume, network, image, and kube. Pods, per esempio, può essere usato per raggruppare i container - i servizi systemd generati e le loro dipendenze (creare il pod prima dei container) sono gestiti automaticamente da systemd.

Utilizzo di podman generate systemd

Podman fornisce inoltre il sottocomando generate systemd. Usare questo sottocomando per generare i service file di systemd.

Attenzione

`generate systemd` è ora obsoleto e non riceverà ulteriori funzioni. Si raccomanda l'uso di Quadlet.

Ora lo si farà con Nextcloud. Eseguire:

podman ps

Si otterrà un elenco di container in esecuzione:

04f7553f431a  docker.io/library/nextcloud:latest  apache2-foregroun...  5 minutes ago  Up 5 minutes  0.0.0.0:8080->80/tcp  compassionate_meninsky

Come visto sopra, il nome di questo container è compassionate_meninsky.

Per creare un servizio systemd per il container Nextcloud e abilitarlo al riavvio, eseguire quanto segue:

podman generate systemd --name compassionate_meninsky > /usr/lib/systemd/system/nextcloud.service
systemctl enable nextcloud

Sostituire compassionate_meninsky con il nome assegnato al container.

Quando il sistema si riavvia, Nextcloud si riavvia in Podman.

Containerfiles

Un Containerfile è un file usato da Podman per creare immagini di container. I file container usano la stessa sintassi dei file Docker, quindi si possono costruire le immagini dei container con Podman come si farebbe con Docker.

Server web da un Containerfile

Server web da un file container

Creare una cartella dedicata alla image:

mkdir myrocky && cd myrocky

Creare un file index.html che verrà eseguito nel nostro server web:

echo "Welcome to Rocky" > index.html

Creare un file Containerfile con il seguente contenuto:

# Use the latest rockylinux image as a start
FROM rockylinux:9

# Make it uptodate
RUN dnf -y update
# Install and enable httpd
RUN dnf -y install httpd
RUN systemctl enable httpd
# Copy the local index.html file into our image
COPY index.html /var/www/html/

# Expose the port 80 to the outside
EXPOSE 80

# Start the services
CMD [ "/sbin/init" ]

Siamo pronti a costruire la nostra immagine chiamata myrockywebserver:

$ podman build -t myrockywebserver .

STEP 1/7: FROM rockylinux:9
Resolved "rockylinux" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull docker.io/library/rockylinux:9...
Getting image source signatures
Copying blob 489e1be6ce56 skipped: already exists
Copying config b72d2d9150 done
Writing manifest to image destination
STEP 2/7: RUN dnf -y update
Rocky Linux 9 - BaseOS                          406 kB/s | 2.2 MB     00:05    
Rocky Linux 9 - AppStream                       9.9 MB/s | 7.4 MB     00:00    
Rocky Linux 9 - Extras                           35 kB/s |  14 kB     00:00    
Dependencies resolved.
================================================================================
 Package                   Arch      Version                 Repository    Size
================================================================================
Upgrading:
 basesystem                noarch    11-13.el9.0.1           baseos       6.4 k
 binutils                  x86_64    2.35.2-42.el9_3.1       baseos       4.5 M
...
Complete!
--> 2e8b93d30f31
STEP 3/7: RUN dnf -y install httpd
Last metadata expiration check: 0:00:34 ago on Wed Apr  3 07:29:56 2024.
Dependencies resolved.
================================================================================
 Package                Arch       Version                  Repository     Size
================================================================================
Installing:
 httpd                  x86_64     2.4.57-5.el9             appstream      46 k
...
Complete!
--> 71db5cabef1e
STEP 4/7: RUN systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service  /usr/lib/systemd/system/httpd.service.
--> 423d45a3cb2d
STEP 5/7: COPY index.html /var/www/html/
--> dfaf9236ebae
STEP 6/7: EXPOSE 80
--> 439bc5aee524
STEP 7/7: CMD [ "/sbin/init" ]
COMMIT myrockywebserver
--> 7fcf202d3c8d
Successfully tagged localhost/myrockywebserver:latest
7fcf202d3c8d059837cc4e7bc083a526966874f978cd4ab18690efb0f893d583

È possibile eseguire l'immagine di Podman e confermare l'avvio:

$ podman run -d --name rockywebserver -p 8080:80 localhost/myrockywebserver
282c09eecf845c7d9390f6878f9340a802cc2e13d654da197d6c08111905f1bd

$ podman ps
CONTAINER ID  IMAGE                              COMMAND     CREATED         STATUS         PORTS                 NAMES
282c09eecf84  localhost/myrockywebserver:latest  /sbin/init  16 seconds ago  Up 16 seconds  0.0.0.0:8080->80/tcp  rockywebserver

Si è eseguita l'immagine Podman in modalità demone (-d) e la si è chiamata rockywebserver (opzione --nome).

Si è reindirizzata la porta 80 (protetta) alla porta 8080 con l'opzione -p. Vedere se la porta è in ascolto con:

ss -tuna | grep "*:8080"
tcp   LISTEN    0      4096                *:8080             *:*

Verificare che il file index.html sia accessibile:

$ curl http://localhost:8080
Welcome to Rocky

Congratulazioni! A questo punto è possibile arrestare e cancellare l'immagine in esecuzione, assegnando il nome fornito durante la creazione:

podman stop rockywebserver && podman rm rockywebserver

Suggerimento

Si può aggiungere l'opzione `--rm` per cancellare automaticamente il contenitore una volta che si ferma.

Se si rilancia il processo di compilazione, podman utilizzerà una cache a ogni passo della compilazione:

$ podman build -t myrockywebserver .

STEP 1/7: FROM rockylinux:9
STEP 2/7: RUN dnf -y update
--> Using cache 2e8b93d30f3104d77827a888fdf1d6350d203af18e16ae528b9ca612b850f844
--> 2e8b93d30f31
STEP 3/7: RUN dnf -y install httpd
--> Using cache 71db5cabef1e033c0d7416bc341848fbf4dfcfa25cd43758a8b264ac0cfcf461
--> 71db5cabef1e
STEP 4/7: RUN systemctl enable httpd
--> Using cache 423d45a3cb2d9f5ef0af474e4f16721f4c84c1b80aa486925a3ae2b563ba3968
--> 423d45a3cb2d
STEP 5/7: COPY index.html /var/www/html/
--> Using cache dfaf9236ebaecf835ecb9049c657723bd9ec37190679dd3532e7d75c0ca80331
--> dfaf9236ebae
STEP 6/7: EXPOSE 80
--> Using cache 439bc5aee524338a416ae5080afbbea258a3c5e5cd910b2485559b4a908f81a3
--> 439bc5aee524
STEP 7/7: CMD [ "/sbin/init" ]
--> Using cache 7fcf202d3c8d059837cc4e7bc083a526966874f978cd4ab18690efb0f893d583
COMMIT myrockywebserver
--> 7fcf202d3c8d
Successfully tagged localhost/myrockywebserver:latest
7fcf202d3c8d059837cc4e7bc083a526966874f978cd4ab18690efb0f893d583

È possibile cancellare la cache con il sottocomando prune:

podman system prune -a -f
OpzioniDescrizione
-aRimuove tutti i dati inutilizzati, non solo quelli esterni a Podman.
-fForza senza nessuna richiesta di conferma
--volumesElimina i volume

Pods

I pod sono un modo per raggruppare i container I contenitori in un pod condividono alcune impostazioni, come i mount point l'allocazione delle risorse o le mappature delle porte.

In Podman, si gestiscono i pod usando il sottocomando podman pod, simile a molti comandi di Podman, per controllare i contenitori:

ComandoDescrizione
cloneCrea una copia di un pod esistente.
createCrea un nuovo pod.
existsControlla se un pod esiste nel storage locale.
inspectVisualizza le informazioni che descrivono un pod.
killTermina il processo principale di ogni container in uno o più pods.
logsVisualizza i registry per i pod con uno o più container.
pauseMette in pausa uno o più pod.
pruneRimuove tutti i pod terminati e i loro container.
psStampa le informazioni sui pod.
restartRiavvia uno o più pod.
rmRimuove uno o più pod e container terminati.
startAvvia uno o più pods.
statsVisualizza uno stream in tempo reale delle statistiche di utilizzo delle risorse per i continer in uno o più pod.
stopTermina uno o più pod.
topVisualizza i processi in esecuzione dei container in un pod.
unpauseRiavvia uno o più pods.

I container raggruppati in un pod possono accedere l'uno all'altro utilizzando localhost. È utile, ad esempio, quando si configura Nextcloud con un database dedicato come Postgres. Nextcloud può accedere al database, ma non è necessario che il database sia accessibile dall'esterno dei container.

Per creare un pod contenente Nextcloud e un database dedicato, eseguire quanto segue:

# Creare il pod con una mappatura delle porte
podman pod create --name nextcloud -p 8080:80

# Aggiungere un contenitore Nextcloud al pod - il mapping della porta non deve essere specificato di nuovo!
podman create --pod nextcloud --name nextcloud-app nextcloud

# Aggiungere un database Postgres. Questo contenitore ha una variabile d'ambiente specifica per Postgres.
podman create --pod nextcloud --name nextcloud-db -e POSTGRES_HOST_AUTH_METHOD=trust postgres

Per eseguire il pod appena creato, eseguire:

podman pod start nextcloud

Ora è possibile configurare Nextcloud utilizzando un database locale:

Nextcloud setting up a database

Author: Neel Chauhan, Antoine Le Morvan

Contributors: Steven Spencer, Ganna Zhyrnova, Christian Steinert