Com gestionar contenidors amb Podman i Skopeo a RHEL 8


Un dels reptes als quals s'enfrontaven els desenvolupadors en el passat és aconseguir que les aplicacions funcionin de manera fiable en diversos entorns informàtics. Sovint, les aplicacions no s'executaven com s'esperava o trobaven errors i fallaven del tot. I aquí va néixer el concepte de contenidors.

Què són les imatges de contenidors?

Les imatges dels contenidors són fitxers estàtics que s'envien amb codi executable que s'executa en un entorn aïllat. Una imatge de contenidor inclou biblioteques del sistema, dependències i altres configuracions de la plataforma necessàries per l'aplicació per executar-se en diversos entorns.

Red Hat Linux ofereix un conjunt d'eines de contenidors útils que podeu aprofitar per treballar directament amb contenidors Linux mitjançant les ordres docker que requereixen. Això inclou:

  • Podman: aquest és un motor de contenidors sense dimoni per executar i gestionar contenidors OCI en mode arrel o sense arrel. Podman és similar a Docker i té les mateixes opcions d'ordres, excepte que Docker és un dimoni. Podeu treure, executar i gestionar imatges de contenidors amb podman de la mateixa manera que ho faríeu amb Docker. Podman inclou moltes funcions avançades, s'integra totalment amb els sistemes i ofereix suport per a l'espai de noms dels usuaris, que inclou l'execució de contenidors sense necessitat d'un usuari root.
  • Skopeo: aquesta és una eina de línia d'ordres que s'utilitza per copiar imatges de contenidors d'un registre a un altre. Podeu utilitzar Skopeo per copiar imatges cap a i des d'un host concret, així com per copiar imatges a un altre registre o entorn de contenidors. A part de copiar imatges, podeu utilitzar-lo per inspeccionar imatges de diversos registres i utilitzar signatures per crear i verificar imatges.
  • Buildah: aquest és un conjunt d'eines de línia d'ordres que s'utilitzen per crear i gestionar imatges OCI del contenidor mitjançant fitxers Docker.

En aquest article, ens centrarem en la gestió de contenidors amb podman i Skopeo.

Cerca d'imatges de contenidors des d'un registre remot

L'ordre de cerca podman us permet cercar els registres remots seleccionats per a imatges de contenidors. La llista predeterminada de registres es defineix al fitxer registres.conf situat al directori /etc/containers/.

Els registres estan definits per 3 seccions.

  • [registries.search]: aquesta secció especifica els registres predeterminats que podman pot cercar per a imatges de contenidors. Cerca la imatge sol·licitada als registres registry.access.redhat.com, registry.redhat.io i docker.io.

  • [registries.insecure]: aquesta secció especifica els registres que no implementen el xifratge TLS, és a dir, registres insegurs. Per defecte, no s'especifica cap entrada.

  • [registries.block]: bloqueja o denega l'accés als registres especificats des del vostre sistema local. Per defecte, no s'especifica cap entrada.

Com a usuari habitual (no root) que executa l'ordre podman, podeu definir el vostre propi fitxer registres.conf al vostre directori d'inici ($HOME/.config/containers/registries.conf) per anul·lar la configuració de tot el sistema.

Quan especifiqueu els registres, tingueu en compte el següent:

  • Cada registre s'ha d'adjuntar entre cometes simples.
  • Els registres es poden especificar mitjançant un nom d'amfitrió o una adreça IP.
  • Si s'especifiquen diversos registres, haurien d'estar separats per comes.
  • Si un registre utilitza un port no estàndard (ja sigui el port TCP 443 per a segur i 80 per a insegur), el número de port s'ha d'especificar al costat del nom del registre, p. registry.example.com:5566.

Per cercar una imatge de contenidor en un registre mitjançant la sintaxi:

# podman search registry/container_image

Per exemple, per cercar una imatge de Redis al registre registry.redhat.io, invoqueu l'ordre:

# podman search registry.redhat.io/redis

Per cercar una imatge de contenidor MariaDB, executeu.

# podman search registry.redhat.io/mariadb

Per obtenir una descripció detallada d'una imatge del contenidor, utilitzeu l'opció --no-trunc abans del nom de la imatge del contenidor a partir dels resultats que obtingueu. Per exemple, intentarem obtenir una descripció detallada de la imatge del contenidor MariaDB tal com es mostra:

# podman search --no-trunc registry.redhat.io/rhel8/mariadb-103

Estirant imatges de contenidors

L'extracció o la recuperació d'imatges de contenidors d'un registre remot requereix que primer us autentiqueu abans que qualsevol altra cosa. Per exemple, per recuperar la imatge del contenidor MariaDB, primer inicieu sessió al registre de Redhat:

# podman login

Proporcioneu el vostre nom d'usuari i contrasenya i premeu ENTER al vostre teclat. Si tot va bé, hauríeu de rebre un missatge de confirmació que l'inici de sessió al registre s'ha realitzat correctament.

Login Succeeded!

Ara, podeu treure la imatge utilitzant la sintaxi que es mostra:

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

El <registry> fa referència a l'amfitrió o registre remot que proporciona un repositori d'imatges de contenidors al TCP <port>. El <namespace> i el <name> especifiquen col·lectivament una imatge de contenidor basada en el <namespace> al registre. Finalment, l'opció <tag> especifica la versió de la imatge del contenidor. Si no s'especifica cap, s'utilitza l'etiqueta predeterminada, la més recent.

Sempre es recomana afegir registres de confiança, és a dir, aquells que proporcionen xifratge i no permeten que usuaris anònims generin comptes amb noms aleatoris.

Per extreure la imatge MariaDB, executeu l'ordre:

# podman pull registry.redhat.io/rhel8/mariadb-103

  • El <registry>: registry.redhat.io
  • El <namespace> – rhel8
  • El <name> – MariaDB
  • El <tag> – 103

Per a l'extracció d'imatges de contenidors posteriors, no cal que inicieu sessió, ja que ja esteu autenticat. Per extreure una imatge de contenidor Redis, només cal que executeu:

# podman pull registry.redhat.io/rhscl/redis-5-rhel7

Llista d'imatges de contenidors

Un cop hàgiu acabat de treure les imatges, podeu veure les imatges existents actualment al vostre amfitrió executant l'ordre podman images.

# podman images

Inspecció d'imatges de contenidors

Abans d'executar un contenidor, sempre és una bona idea examinar la imatge i entendre què fa. L'ordre podman inspect imprimeix un mar de metadades sobre el contenidor, com ara el sistema operatiu i l'arquitectura.

Per inspeccionar una imatge, executeu l'ordre podman inspect seguida de l'ID de la imatge o del dipòsit.

# podman inspect IMAGE ID
OR
# podman inspect REPOSITORY

A l'exemple següent, estem inspeccionant el contenidor MariaDB.

# podman inspect registry.redhat.io/rhel8/mariadb-103

Per extreure metadades específiques d'un contenidor, passeu l'opció --format seguida de les metadades i la identitat del contenidor (ID de la imatge o nom).

A l'exemple següent, estem recuperant informació sobre l'arquitectura i la descripció del contenidor base RHEL 8 que es troba a la secció Etiquetes.

# podman inspect --format=’{{.Labels.architecture}}’ image ID
# podman inspect --format=’{{.Labels.description}}’ image ID

Per inspeccionar una imatge remota des d'un altre registre, utilitzeu l'ordre skopeo inspect. A l'exemple següent, estem inspeccionant una imatge d'inici RHEL 8 allotjada a Docker.

# skopeo inspect docker://registry.redhat.io/rhel8-beta/rhel-init

Etiquetar imatges de contenidors

Com haureu observat, els noms d'imatges solen ser de naturalesa genèrica. Per exemple, la imatge redis està etiquetada:

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

L'etiquetatge d'imatges els dóna un nom més intuïtiu per entendre millor el que contenen. Mitjançant l'ordre d'etiqueta podman, podeu crear una etiqueta d'imatge que és essencialment un àlies d'un nom d'imatge que inclou diferents parts.

Aquests són:

registry/username/NAME:tag

Per exemple, per canviar el nom genèric de la imatge Redis que té un ID de 646f2730318c , executarem l'ordre:

# podman tag 646f2730318c myredis

Per afegir una etiqueta al final, afegiu dos punts complets seguits del número d'etiqueta:

# podman tag 646f2730318c myredis:5.0

Sense afegir el número d'etiqueta, només se li assignarà l'atribut més tard.

Imatges de contenidors en funcionament

Per executar un contenidor, utilitzeu l'ordre podman run. Per exemple:

# podman run image_id

Per executar un contenidor en silenci en segon pla com a servei dimoni, utilitzeu l'opció -d tal com es mostra.

# podman run -d image_id

Per exemple, per executar la imatge redis amb l'ID 646f2730318c, invocarem l'ordre:

# podman run -d 646f2730318c

Si esteu executant un contenidor basat en un sistema operatiu com la imatge base RHEL 8, podeu accedir a l'intèrpret d'ordres mitjançant la directiva -it. L'opció -i crea una sessió interactiva mentre que -t genera una sessió de terminal. L'opció --name estableix el nom del contenidor a mybash mentre que és l'identificador de la imatge ecbc6f53bba0 de la imatge base.

# podman run -it --name=mybash ecbc6f53bba0

A partir de llavors, podeu executar qualsevol ordre de l'intèrpret d'ordres. A l'exemple següent, estem verificant la versió del sistema operatiu de la imatge del contenidor.

# cat /etc/os-release

Per sortir del contenidor, només cal que invoqueu l'ordre de sortida.

# exit

Un cop sortit del contenidor, s'atura automàticament. Per tornar a iniciar el contenidor, utilitzeu l'ordre d'inici podman amb el senyalador -ai tal com es mostra.

# podman start -ai mybash

Una vegada més, això us permet accedir a l'intèrpret d'ordres.

Llista d'imatges de contenidors en execució

Per llistar els contenidors que s'executen actualment, utilitzeu l'ordre podman ps tal com es mostra.

# podman ps

Per veure tots els contenidors, inclosos els que s'han sortit després d'executar-se, utilitzeu l'ordre:

# podman ps -a

Configureu les imatges del contenidor per a l'inici automàtic sota el servei Systemd

En aquesta secció, ens centrem en com es pot configurar un contenidor per executar-se directament en un sistema RHEL com a servei de sistema.

Primer, obteniu la vostra imatge preferida. En aquest cas, hem extret la imatge Redis del Docker Hub:

# podman pull docker.io/redis

Si teniu SELinux en execució al vostre sistema, heu d'activar el booleà container_manage_cgroup per executar contenidors amb systemd.

# setsebool -p container_manage_cgroup on

A continuació, executeu la imatge del contenidor en segon pla i assigneu-la al nom de la vostra imatge preferida. En aquest exemple, hem anomenat la nostra imatge redis_server i hem assignat el port 6379 del contenidor al nostre host RHEL 8

# podman run -d --name redis_server -p 6379:6379 redis

A continuació, crearem un fitxer de configuració de la unitat systemd per a redis al directori /etc/systemd/system/.

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

Enganxeu el contingut següent al fitxer.

[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

Desa i surt del fitxer.

A continuació, configureu el contenidor perquè s'iniciï automàticament a l'arrencada.

# systemctl enable redis-container.service

A continuació, inicieu el contenidor i verifiqueu el seu estat d'execució.

# systemctl start redis-container.service
# systemctl status redis-container.service

Configura l'emmagatzematge persistent per a imatges de contenidors

Quan executeu contenidors, és prudent configurar l'emmagatzematge extern persistent a l'amfitrió. Això proporciona una còpia de seguretat en cas que el contenidor s'estavella o s'elimini accidentalment.

Per conservar les dades, maparem un directori situat a l'amfitrió a un directori dins del contenidor.

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

L'opció --privileged es passa quan SELinux està configurat per a l'aplicació. L'opció -v especifica el volum extern que es troba a l'amfitrió. El volum del contenidor aquí és el directori /mnt.

Un cop hàgim accedit a l'intèrpret d'ordres, crearem un fitxer de mostra testing.txt al directori /mnt tal com es mostra.

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

Aleshores sortirem del contenidor i comprovarem si el fitxer existeix a l'emmagatzematge extern que resideix a l'amfitrió

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

Sortida ⇒ Això prova l'emmagatzematge extern persistent.

Aturació i retirada de contenidors

Un cop hàgiu acabat d'executar el vostre contenidor, podeu aturar-lo mitjançant l'ordre podman stop seguida de l'identificador del contenidor que podeu obtenir des de l'ordre podman ps.

# podman stop container-id

Per eliminar els contenidors que ja no necessiteu, primer, assegureu-vos d'aturar-lo i, a continuació, invoqueu l'ordre podman rm seguida de l'identificador o el nom del contenidor com a opció.

# podman rm container-id

Per eliminar diversos contenidors alhora en una ordre, especifiqueu els identificadors del contenidor separats per un espai.

# podman rm container-id-1 container-id-2 container-id-3

Per esborrar tots els contenidors, executeu l'ordre:

# podman rm -a

Eliminació d'una imatge

Per eliminar una imatge, primer, assegureu-vos que tots els contenidors generats a partir de les imatges s'aturen i s'eliminen tal com s'ha comentat al subtema anterior.

A continuació, continueu i executeu l'ordre podman -rmi seguida de l'ID de la imatge tal com es mostra:

# podman -rmi image-id

Conclusió

Això tanca aquest capítol sobre la gestió i el treball amb contenidors a RHEL 8. Esperem que aquesta guia proporcioni una comprensió decent dels contenidors i com podeu interactuar i gestionar-los al vostre sistema RHEL mitjançant podman i Skopeo.