Un'introduzione a Podman

1. Introduzione

In questo tutorial, esamineremo Podman (abbreviazione di "Pod Manager"), le sue caratteristiche e il suo utilizzo.

2. Podman

Podman è uno strumento di gestione dei contenitori open source per lo sviluppo, la gestione e l'esecuzione di contenitori OCI. Diamo un'occhiata ad alcuni dei vantaggi di Podman, rispetto ad altri strumenti di gestione dei container:

  • Le immagini create da Podman sono compatibili con altri strumenti di gestione dei contenitori . Le immagini create da Podman aderiscono allo standard OCI e quindi possono essere inviate ad altri registri di container come Docker Hub
  • Può essere eseguito come un normale utente senza richiedere i privilegi di root. Quando viene eseguito come utente non root, Podman crea uno spazio dei nomi utente all'interno del quale acquisisce l'autorizzazione di root. Ciò gli consente di montare file system e configurare i contenitori richiesti
  • Offre la possibilità di gestire i pod. A differenza degli altri strumenti di runtime del contenitore, Podman consente all'utente di gestire i pod (un gruppo di uno o più contenitori che operano insieme). Gli utenti possono eseguire operazioni come creare, elencare, ispezionare sui pod

Tuttavia, ci sono alcune limitazioni a Podman:

  • Funziona solo su sistemi basati su Linux. Attualmente, Podman funziona solo su sistemi operativi basati su Linux e non ha un wrapper per Windows e macOS.
  • Non esistono alternative per Docker Compose. Podman non ha il supporto per la gestione di più contenitori in locale, simile a quello che fa Docker Compose. Un'implementazione di Docker Compose che utilizza il backend Podman è in fase di sviluppo come parte del progetto podman-compose , ma è ancora in fase di elaborazione .

3. Confronto con Docker

Ora che abbiamo capito cos'è Podman e quali sono i suoi vantaggi e limiti, confrontiamolo con Docker, uno degli strumenti di gestione dei container più utilizzati.

3.1. Interfaccia della riga di comando (CLI)

Podman offre lo stesso set di comandi esposti dal client Docker. In altre parole, esiste una mappatura uno a uno tra i comandi di queste due utilità.

Tuttavia, i comandi come podman ps e immagini podman non mostreranno i contenitori o le immagini create utilizzando Docker. Questo perché il repository locale di Podman è / var / lib / containers invece di / var / lib / docker mantenuto da Docker.

3.2. Modello di contenitore

Docker utilizza un'architettura client-server per i contenitori, mentre Podman utilizza il tradizionale modello fork-exec comune a tutti i processi Linux. I contenitori creati utilizzando Podman sono il processo figlio del processo Podman padre. Questo è il motivo per cui quando il comando version viene eseguito sia per Docker che per Podman, Docker elenca le versioni sia del client che del server mentre Podman elenca solo la sua versione.

Output di esempio per la versione docker :

Client: Version: 17.12.0-ce API version: 1.35 Go version: go1.9.2 Git commit: c97c6d6 Built: Wed Dec 27 20:11:19 2017 OS/Arch: linux/amd64 Server: Engine: Version: 17.12.0-ce API version: 1.35 (minimum version 1.12) Go version: go1.9.2 Git commit: c97c6d6 Built: Wed Dec 27 20:09:53 2017 OS/Arch: linux/amd64 Experimental: false

Output di esempio per la versione podman :

Version: 0.3.2-dev Go Version: go1.9.4 Git Commit: "4f4a78abb40fa0e8407e8a55d5a67a2650d8fd96" Built: Mon Mar 5 11:10:35 2018 OS/Arch: linux/amd64

Poiché Podman stesso viene eseguito come un processo, non richiede alcun processo daemon in background. A differenza di Podman, Docker richiede un processo daemon, Docker daemon, per coordinare le richieste API tra il client e il server .

3.3. Modalità senza root

Come accennato in precedenza, Podman non richiede l'accesso come root per eseguire i suoi comandi. Docker, d'altra parte, essendo dipendente dal processo daemon, richiede privilegi di root o richiede che l'utente faccia parte del gruppo docker per poter eseguire i comandi Docker senza privilegi di root .

$ sudo usermod -aG docker $USER

4. Installazione e utilizzo

Cominciamo installando Podman. Il comando podman info mostra le informazioni sul sistema Podman e aiuta a controllare lo stato dell'installazione.

$ podman info

Questo comando visualizza le informazioni relative all'host come la versione del kernel, lo spazio di swap utilizzato e disponibile e anche le informazioni relative a Podman come i registri a cui ha accesso per estrarre e inviare immagini, driver di archiviazione che utilizza, posizione di archiviazione e altri:

host: MemFree: 546578432 MemTotal: 1040318464 SwapFree: 4216320000 SwapTotal: 4216320000 arch: amd64 cpus: 2 hostname: base-xenial kernel: 4.4.0-116-generic os: linux uptime: 1m 2.64s insecure registries: registries: [] registries: registries: - docker.io - registry.fedoraproject.org - registry.access.redhat.com store: ContainerStore: number: 0 GraphDriverName: overlay GraphOptions: null GraphRoot: /var/lib/containers/storage GraphStatus: Backing Filesystem: extfs Native Overlay Diff: "true" Supports d_type: "true" ImageStore: number: 0 RunRoot: /var/run/containers/storage

Diamo un'occhiata ad alcuni dei comandi di base di Podman.

4.1. Creazione di un'immagine

Innanzitutto, esamineremo la creazione di un'immagine utilizzando Podman. Iniziamo creando un Dockerfile con il seguente contenuto:

FROM centos:latest RUN yum -y install httpd CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"] EXPOSE 80 

Ora creiamo l'immagine usando il comando build :

$ podman build .

Qui stiamo prima estraendo l'immagine di base di CentOS, installando Apache su di essa e quindi eseguendolo come processo in primo piano con la porta 80 esposta. Possiamo accedere al server Apache eseguendo questa immagine e mappando la porta esposta a una porta host.

Il comando build passa ricorsivamente tutte le cartelle disponibili nella directory di contesto. La directory di lavoro corrente per impostazione predefinita diventa il contesto di compilazione quando non viene specificata alcuna directory. Quindi, è consigliabile non avere file e cartelle che non sono necessari per la creazione dell'immagine, nella directory di contesto.

4.2. Elenco delle immagini disponibili

Il comando immagini podman elenca tutte le immagini disponibili. Supporta anche varie opzioni per filtrare le immagini.

$ podman images

This command lists all the images available in the local repository. It contains the information on which repository the image was pulled from, the tag, its image id, created time and size.

REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/library/centos latest 0f3e07c0138f 2 months ago 227MB  
    

4.3. Running Images

The run command creates a container of a given image and then runs it. Let's run the CentOS image we have created earlier

$ podman run -p 80:80 -dit centos

This command first checks if there is a local image available for CentOS. If the image isn't present locally, it tries to pull the image from the registries that were configured. If the image isn't present in the registries, it shows an error about unable to find the image.

The above run command specifies to map the exposed 80 port of the container to the port 80 of the host and the dit flag specifies to run the container in detached and interactive mode. The id of the container created will be the output.

4.4. Deleting Images

The rmi command removes the images present in the local repository. Multiple images can be removed by providing their ids as space-separated in the input. Specifying the -a flag removes all the images

$ podman rmi 785188cd988c

4.5. Listing the Containers

All the available containers including the ones which aren't running can be listed using the ps -a command. Similar to the images command, this can also be used with various options.

$ podman ps -a

The output for the above command lists all the containers with the information such as image it was created from, the command used to launch it, it's status, ports it's running on and the name assigned to it.

CONTAINER ID IMAGE COMMAND CREATED AT STATUS PORTS NAMES eed30719cd37 centos /bin/bash 2019-12-09 02:57:37 +0000 UTC Up 14 minutes ago 0.0.0.0:80->80/udp, 0.0.0.0:80->80/tcp reverent_liskov

4.6. Deleting Containers

The rm command removes the containers. This command does not remove the containers in running or paused state. They need to be first stopped and then removed.

$ podman stop eed30719cd37 $ podman rm eed30719cd37

4.7. Creating Pods

The pod create command creates a pod. The create command supports different options.

$ podman pod create

The pod create command creates a pod with an infra container by default associated with it unless explicitly set with infra flag as false.

$ podman pod create --infra = false

Infra container allows Podman to connect various containers in the pod.

4.8. Listing Pods

The pod list command displays all the available pods

$ podman pod list

The output of this command displays the information such as the pod id, its name, number of associated containers, the id of the infra container if available:

POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID 7e0a68528aed gallant_raman Running 5 seconds ago 1 c6d06673c667

All the available Podman commands and their usage can be found in the official documentation.

5. Conclusion

In this tutorial, we've looked at the basics of Podman and its features, its comparison to Docker and a few of the commands available.

As usual, the code sample used in this article is available over GitHub.