Una delle sfide che gli sviluppatori hanno dovuto affrontare in passato è stata far funzionare le applicazioni in modo affidabile in più ambienti di elaborazione. Spesso, le applicazioni non sono state eseguite come previsto o hanno riscontrato errori e non sono riuscite del tutto. Ed è qui che il concetto di containers sono nato.

Cosa sono le immagini del contenitore?

Container le immagini sono file statici forniti con codice eseguibile che viene eseguito in un ambiente isolato. Un’immagine del contenitore comprende librerie di sistema, dipendenze e altre impostazioni della piattaforma necessarie all’applicazione per l’esecuzione in ambienti diversi.

Red Hat Linux fornisce una serie di utili strumenti per i contenitori che puoi sfruttare per lavorare direttamente con i contenitori Linux utilizzando i comandi della finestra mobile che richiedono. Questi includono:

  • Podman – Questo è un motore contenitore senza daemon per l’esecuzione e la gestione OCI contenitori in modalità root o rootless. Podman è simile a Docker e ha le stesse opzioni di comando tranne quella Docker è un demone. Puoi eseguire il pull, eseguire e gestire le immagini del contenitore utilizzando podman più o meno allo stesso modo in cui lo faresti con Docker. Podman viene fornito con molte funzionalità avanzate, si integra completamente con systems, e offre supporto per lo spazio dei nomi utente che include l’esecuzione di contenitori senza la necessità di un utente root.
  • Skopeo: questo è uno strumento da riga di comando utilizzato per copiare le immagini del contenitore da un registro all’altro. Puoi usare Skopeo per copiare immagini da e verso un particolare host, nonché per copiare immagini in un altro registro o ambiente del contenitore. Oltre a copiare le immagini, puoi usarlo per ispezionare le immagini da vari registri e utilizzare le firme per creare e verificare le immagini.
  • Buildah: questo è un insieme di strumenti da riga di comando utilizzati per creare e gestire il container OCI immagini utilizzando DockerS.

In questo articolo, ci concentreremo sulla gestione dei contenitori utilizzando podman e Skopeo.

Ricerca di immagini di container da un registro remoto

Il podman search consente di cercare i registri remoti selezionati per le immagini del contenitore. L’elenco predefinito dei registri è definito in registries.conf situato nel /etc/containers/.

I registri sono definiti da 3 sezioni.

  • [registries.search] – Questa sezione specifica i registri predefiniti che podman può cercare le immagini del contenitore. Cerca l’immagine richiesta nel file registry.access.redhat.com, registry.redhat.io, e docker.io registri.
Registri predefiniti
  • [registries.insecure]– Questa sezione specifica i registri che non implementano la crittografia TLS, ad esempio i registri non sicuri. Per impostazione predefinita, non sono specificate voci.
Registri insicuri
Registri insicuri
  • [registries.block] – Questo blocca o nega l’accesso ai registri specificati dal sistema locale. Per impostazione predefinita, non sono specificate voci.
Blocca i registri
Blocca i registri

Come un normale (non-root) utente che esegue il comando podman, è possibile definire il proprio registries.conf nella tua home directory ($HOME/.config/containers/registries.conf) per ignorare le impostazioni a livello di sistema.

Regole quando si specificano i registri

Quando specifichi i registri, tieni presente quanto segue:

  • Ogni registro deve essere racchiuso tra virgolette singole.
  • I registri possono essere specificati utilizzando un nome host o un indirizzo IP.
  • Se vengono specificati più registri, devono essere separati da virgole.
  • Se un registro utilizza una porta non standard – o le porte TCP 443 per sicure e 80 per non sicure, – il numero della porta deve essere specificato accanto al nome del registro, ad es. registry.example.com:5566.

Per cercare un’immagine del contenitore in un registro utilizzando la sintassi:

# podman search registry/container_image

Ad esempio, per cercare a Redis immagine nel registry.redhat.io registro, invocare il comando:

# podman search registry.redhat.io/redis
Cerca nel registro l'immagine del contenitore
Cerca nel registro l’immagine del contenitore

Per cercare un MariaDB esecuzione dell’immagine del contenitore.

# podman search registry.redhat.io/mariadb
Cerca l'immagine del contenitore MariaDB
Cerca l’immagine del contenitore MariaDB

Per ottenere una descrizione elaborata di un’immagine contenitore, utilizzare il –no-trunc prima del nome dell’immagine del contenitore dai risultati che ottieni. Ad esempio, cercheremo di ottenere una descrizione dettagliata dell’immagine del contenitore MariaDB come mostrato:

# podman search --no-trunc registry.redhat.io/rhel8/mariadb-103
Elenco Descrizione dell'immagine del contenitore MariaDB
Elenco Descrizione dell’immagine del contenitore MariaDB

Tirando le immagini del contenitore

L’estrazione o il recupero di immagini del contenitore da un registro remoto richiede prima di tutto l’autenticazione. Ad esempio, per recuperare l’immagine del contenitore MariaDB, prima accedi al registro Redhat:

# podman login

Fornisci il tuo nome utente e password e premi ‘ENTER‘ sulla tua tastiera. Se tutto va bene, dovresti ricevere un messaggio di conferma che l’accesso al registro è stato eseguito correttamente.

Login Succeeded!

Ora puoi estrarre l’immagine usando la sintassi mostrata:

# podman pull <registry>[:<port>]/[<namespace>/]<name>:<tag>

Il <registry> fa riferimento all’host o al registro remoto che fornisce un repository di immagini del contenitore sul TCP <port>. Il <namespace> e il <name> specificare collettivamente un’immagine del contenitore basata su <namespace> all’anagrafe. Infine, il <tag> specifica la versione dell’immagine del contenitore. Se non ne viene specificato nessuno, viene utilizzato il tag predefinito – latest –.

È sempre consigliabile aggiungere registri fidati, ovvero quelli che forniscono la crittografia e non consentono agli utenti anonimi di generare account con nomi casuali.

Per estrarre l’immagine MariaDB, eseguire il comando:

# podman pull registry.redhat.io/rhel8/mariadb-103
  • Il <registry> – register.redhat.io
  • Il <namespace> – hel8
  • Il <name> – MariaDB
  • Il <tag> – 103
Estrarre l'immagine di MariaDB
Estrarre l’immagine di MariaDB

Per il successivo pull delle immagini del contenitore, non è richiesto alcun ulteriore accesso poiché sei già autenticato. Per tirare a Redis immagine del contenitore, esegui semplicemente:

# podman pull registry.redhat.io/rhscl/redis-5-rhel7
Estrarre l'immagine del contenitore Redis
Estrarre l’immagine del contenitore Redis

Elenco delle immagini del contenitore

Una volta che hai finito di estrarre le immagini, puoi visualizzare le immagini attualmente esistenti sul tuo host eseguendo il comando podman images.

# podman images
Elenca le immagini del contenitore
Elenca le immagini del contenitore

Ispezione delle immagini del contenitore

Prima di eseguire un container, è sempre una buona idea sondare l’immagine e capire cosa fa. Il podman inspect stampa un mare di metadati sul contenitore come il sistema operativo e l’architettura.

Per ispezionare un’immagine, eseguire il podman inspect seguito dall’ID immagine o dal repository.

# podman inspect IMAGE ID
OR
# podman inspect REPOSITORY

Nell’esempio seguente, stiamo ispezionando il MariaDB contenitore.

# podman inspect registry.redhat.io/rhel8/mariadb-103
Ispezione delle immagini del contenitore MariaDB
Ispezione delle immagini del contenitore MariaDB

Per estrarre metadati specifici per un contenitore, passare il file –format seguito dai metadati e dall’identità del contenitore (ID immagine o nome).

Nell’esempio seguente, stiamo recuperando informazioni sull’architettura e sulla descrizione del contenitore di base RHEL 8 che rientra in ‘Labels‘ sezione.

# podman inspect --format=’{{.Labels.architecture}}’ image ID
# podman inspect --format=’{{.Labels.description}}’ image ID
Ottieni informazioni sull'architettura del contenitore
Ottieni informazioni sull’architettura del contenitore

Per ispezionare un’immagine remota da un altro registro, utilizzare il file skopeo inspect. Nell’esempio seguente, stiamo ispezionando un’immagine di inizializzazione RHEL 8 ospitata su Docker.

# skopeo inspect docker://registry.redhat.io/rhel8-beta/rhel-init
Ispeziona l'immagine remota dal registro Docker
Ispeziona l’immagine remota dal registro Docker

Tagging delle immagini del contenitore

Come avrai notato, i nomi delle immagini sono generalmente di natura generica. Ad esempio, l’immagine redis è etichettata:

registry.redhat.io/rhscl/redis-5-rhel7

Taggare le immagini dà loro un nome più intuitivo per capire meglio cosa contengono. Usando il podman tagpuoi creare un tag immagine che è essenzialmente un alias per il nome di un’immagine che comprende parti diverse.

Questi sono:

registry/username/NAME:tag

Ad esempio, per modificare il nome generico dell’immagine Redis che ha un ID di 646f2730318c eseguiremo il comando:

# podman tag 646f2730318c myredis

Per aggiungere un tag alla fine, aggiungi due punti completi seguiti dal numero del tag:

# podman tag 646f2730318c myredis:5.0

Senza aggiungere il numero di tag, verrà assegnato solo l’ultimo attributo.

Imposta il nome per l'immagine del contenitore Redis
Imposta il nome per l’immagine del contenitore Redis

Esecuzione di immagini del contenitore

Per eseguire un container, utilizzare il podman run. Per esempio:

# podman run image_id

Per eseguire un contenitore in background in modo invisibile all’utente come servizio demone, utilizzare il file -d come mostrato.

# podman run -d image_id

Ad esempio, per eseguire il redis immagine con ID 646f2730318cinvocheremo il comando:

# podman run -d 646f2730318c
Esegui le immagini del contenitore Redis
Esegui le immagini del contenitore Redis

Se stai eseguendo un container basato su un sistema operativo come RHEL 8 immagine di base, puoi accedere alla shell usando il file -it direttiva. Il -i crea una sessione interattiva mentre il -t genera una sessione terminale. Il –name imposta il nome del contenitore su mybash mentre è il ecbc6f53bba0 ID immagine dell’immagine di base.

# podman run -it --name=mybash ecbc6f53bba0

Successivamente, puoi eseguire qualsiasi comando della shell. Nell’esempio seguente, stiamo verificando la versione del sistema operativo dell’immagine del contenitore.

# cat /etc/os-release
Verifica la versione del sistema operativo dell'immagine del contenitore
Verifica la versione del sistema operativo dell’immagine del contenitore

Per uscire dal container, è sufficiente invocare il comando exit.

# exit

Una volta che il contenitore è uscito, si ferma automaticamente. Per riavviare il contenitore, utilizzare il podman start il -ai come mostrato.

# podman start -ai mybash

Ancora una volta, questo ti dà accesso alla shell.

Avvia immagini contenitore
Avvia immagini contenitore

Elenco delle immagini del contenitore in esecuzione

Per elencare i contenitori attualmente in esecuzione, utilizzare il podman ps come mostrato.

# podman ps
Elenca le immagini del contenitore in esecuzione
Elenca le immagini del contenitore in esecuzione

Per visualizzare tutti i contenitori inclusi quelli che sono usciti dopo l’esecuzione, utilizzare il comando:

# podman ps -a
Visualizza tutte le immagini del contenitore
Visualizza tutte le immagini del contenitore

Configura le immagini del contenitore per l’avvio automatico in Systemd Service

In questa sezione, ci concentreremo su come un container può essere configurato per essere eseguito direttamente su un sistema RHEL come servizio systemd.

Per prima cosa, ottieni la tua immagine preferita. In questo caso, abbiamo tirato il Redis immagine dall’hub Docker:

# podman pull docker.io/redis

Se hai SELinux in esecuzione sul tuo sistema, devi attivare il container_manage_cgroup booleano con cui eseguire i contenitori systemd.

# setsebool -p container_manage_cgroup on

Successivamente, esegui l’immagine del contenitore in background e assegnala al nome dell’immagine preferito. In questo esempio, abbiamo chiamato la nostra immagine redis_server e mappato il porto 6379 dal contenitore al ns RHEL 8 ospite

# podman run -d --name redis_server -p 6379:6379 redis
Esegui l'immagine del contenitore in background
Esegui l’immagine del contenitore in background

Successivamente, creeremo un systemd file di configurazione dell’unità per redis nel file /etc/systemd/system/.

# vim /etc/systemd/system/redis-container.service

Incolla il contenuto di seguito nel file.

[Unit]
Description=Redis container

[Service]
Restart=always
ExecStart=/usr/bin/podman start -a redis_server
ExecStop=/usr/bin/podman stop -t 2 redis_server

[Install]
WantedBy=local.target

Salva ed esci dal file.

Quindi, configura il contenitore per l’avvio automatico all’avvio.

# systemctl enable redis-container.service

Quindi, avvia il contenitore e verifica il suo stato di esecuzione.

# systemctl start redis-container.service
# systemctl status redis-container.service
Verifica lo stato dell'immagine del contenitore
Verifica lo stato dell’immagine del contenitore

Configura l’archiviazione persistente per le immagini del contenitore

Quando si eseguono container, è prudente configurare l’archiviazione esterna persistente sull’host. Ciò fornisce un backup nel caso in cui il contenitore si arresti in modo anomalo o venga rimosso accidentalmente.

Per rendere persistenti i dati, mapperemo una directory situata nell’host a una directory all’interno del contenitore.

$ podman run --privileged -it -v /var/lib/containers/backup_storage:/mnt registry.redhat.io/ubi8/ubi /bin/bash

Il –privileged è passato quando SELinux è impostato per far rispettare. Il -v specifica il volume esterno che si trova sull’host. Il volume del contenitore qui è il /mnt.

Una volta effettuato l’accesso alla shell, creeremo un file di esempio testing.txt nel /mnt come mostrato.

$ echo "This tests persistent external storage" > /mnt/testing.txt

Lo faremo allora exit il contenitore e verificare se il file esiste nella memoria esterna che risiede sull’host

# exit
# cat /var/lib/containers/backup_storage/testing.txt

Uscita ⇒ This tests persistent external storage.

Configura l'archiviazione persistente per i contenitori
Configura l’archiviazione persistente per i contenitori

Arresto e rimozione dei contenitori

Una volta che hai finito con l’esecuzione del tuo container, puoi interromperlo usando il podman stop seguito dal container-id che puoi ottenere dal podman ps.

# podman stop container-id
Arresta immagine contenitore
Arresta immagine contenitore

Per rimuovere i contenitori che non ti servono più, assicurati innanzitutto di interromperlo e quindi di richiamare il file podman rm seguito dall’ID o dal nome del contenitore come opzione.

# podman rm container-id

Per rimuovere più contenitori contemporaneamente in un unico comando, specifica il contenitore ids separati da uno spazio.

# podman rm container-id-1 container-id-2 container-id-3
Rimuovi l'immagine del contenitore
Rimuovi l’immagine del contenitore

Per cancellare tutti i tuoi contenitori, esegui il comando:

# podman rm -a
Cancella tutti i contenitori
Cancella tutti i contenitori

Rimozione di un’immagine

Per rimuovere un’immagine, assicurati innanzitutto che tutti i contenitori generati dalle immagini vengano arrestati e rimossi come discusso nell’argomento secondario precedente.

Quindi, procedi ed esegui il podman -rmi seguito dall’ID dell’immagine come mostrato:

# podman -rmi image-id
Rimuovi immagine
Rimuovi immagine

Conclusione

Questo conclude questo capitolo sulla gestione e l’utilizzo dei contenitori in RHEL 8. Ci auguriamo che questa guida abbia fornito una comprensione decente dei contenitori e di come puoi interagire e gestirli sul tuo RHEL sistema utilizzando podman e Skopeo.