Búsqueda de sitios web

Cómo gestionar contenedores usando Podman y Skopeo en RHEL 8


Uno de los desafíos que enfrentaron los desarrolladores en el pasado es lograr que las aplicaciones se ejecuten de manera confiable en múltiples entornos informáticos. A menudo, las aplicaciones no se ejecutaban como se esperaba o encontraban errores y fallaban por completo. Y ahí nació el concepto de contenedores.

¿Qué son las imágenes de contenedores?

Las imágenes de contenedor son archivos estáticos que se envían con código ejecutable que se ejecuta en un entorno aislado. Una imagen de contenedor comprende bibliotecas del sistema, dependencias y otras configuraciones de plataforma que necesita la aplicación para ejecutarse en diversos entornos.

Red Hat Linux proporciona un conjunto de herramientas de contenedor útiles que puede aprovechar para trabajar directamente con contenedores de Linux utilizando comandos de Docker que requieran. Éstas incluyen:

  • Podman: este es un motor de contenedores sin demonio para ejecutar y administrar contenedores OCI en modo raíz o sin raíz. Podman es similar a Docker y tiene las mismas opciones de comando excepto que Docker es un demonio. Puede extraer, ejecutar y administrar imágenes de contenedores usando podman de la misma manera que lo haría con Docker. Podman viene con muchas funciones avanzadas, se integra completamente con sistemas y ofrece soporte de espacio de nombres de usuario que incluye la ejecución de contenedores sin la necesidad de un usuario root.
  • Skopeo: esta es una herramienta de línea de comandos que se utiliza para copiar imágenes de contenedores de un registro a otro. Puede utilizar Skopeo para copiar imágenes hacia y desde un host en particular, así como para copiar imágenes a otro registro o entorno de contenedor. Además de copiar imágenes, puede usarlo para inspeccionar imágenes de varios registros y usar firmas para crear y verificar imágenes.
  • Buildah: se trata de un conjunto de herramientas de línea de comandos que se utilizan para crear y administrar imágenes OCI de contenedores mediante archivos Docker.

En este artículo, nos centraremos en la gestión de contenedores utilizando podman y Skopeo.

Búsqueda de imágenes de contenedores desde un registro remoto

El comando podman search le permite buscar imágenes de contenedor en registros remotos seleccionados. La lista predeterminada de registros se define en el archivo registries.conf ubicado en el directorio /etc/containers/.

Los registros están definidos por 3 secciones.

  • [registries.search]: esta sección especifica los registros predeterminados en los que podman puede buscar imágenes de contenedor. Busca la imagen solicitada en los registros registry.access.redhat.com, registry.redhat.io y docker.io.

  • [registries.insecure]: esta sección especifica los registros que no implementan el cifrado TLS, es decir, registros inseguros. De forma predeterminada, no se especifica ninguna entrada.

  • [registries.block]: esto bloquea o niega el acceso a los registros especificados desde su sistema local. De forma predeterminada, no se especifica ninguna entrada.

Como usuario normal (no root) que ejecuta el comando podman, puede definir su propio archivo registries.conf en su directorio de inicio ($HOME/.config /containers/registries.conf) para anular la configuración de todo el sistema.

Reglas al especificar registros

Al especificar los registros, tenga en cuenta lo siguiente:

  • Cada registro debe estar entre comillas simples.
  • Los registros se pueden especificar utilizando un nombre de host o una dirección IP.
  • Si se especifican varios registros, deben estar separados por comas.
  • Si un registro utiliza un puerto no estándar (ya sea el puerto TCP 443 para seguro y 80 para inseguro), el número de puerto debe especificarse junto al nombre del registro, por ejemplo. registro.ejemplo.com:5566.

Para buscar en un registro una imagen de contenedor usando la sintaxis:

podman search registry/container_image

Por ejemplo, para buscar una imagen Redis en el registro registry.redhat.io, invoque el comando:

podman search registry.redhat.io/redis

Para buscar una imagen de contenedor MariaDB, ejecute.

podman search registry.redhat.io/mariadb

Para obtener una descripción detallada de una imagen de contenedor, use la opción --no-trunc antes del nombre de la imagen de contenedor de los resultados que obtenga. Por ejemplo, intentaremos obtener una descripción detallada de la imagen del contenedor MariaDB como se muestra:

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

Imágenes de Contenedor Tirando

Extraer o recuperar imágenes de contenedores de un registro remoto requiere que primero se autentique antes que nada. Por ejemplo, para recuperar la imagen del contenedor MariaDB, primero inicie sesión en el registro de Redhat:

podman login

Proporcione su nombre de usuario y contraseña y presione 'ENTER' en su teclado. Si todo va bien, debería recibir un mensaje de confirmación de que el inicio de sesión en el registro se realizó correctamente.

Login Succeeded!

Ahora, puedes extraer la imagen usando la sintaxis que se muestra:

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

El se refiere al host o registro remoto que proporciona un repositorio de imágenes de contenedor en el TCP. <namespace> y <name> especifican colectivamente una imagen de contenedor basada en <namespace> en el registro. Finalmente, la opción <tag> especifica la versión de la imagen del contenedor. Si no se especifica ninguno, se utiliza la etiqueta predeterminada (más reciente).

Siempre se recomienda agregar registros confiables, es decir, aquellos que brindan cifrado y no permiten que usuarios anónimos generen cuentas con nombres aleatorios.

Para extraer la imagen de MariaDB, ejecute el comando:

podman pull registry.redhat.io/rhel8/mariadb-103
  • El – registro.redhat.io
  • El – rhel8
  • El – MariaDB
  • El – 103

Para la extracción posterior de imágenes de contenedores, no es necesario iniciar sesión más porque ya está autenticado. Para extraer una imagen de contenedor Redis, simplemente ejecute:

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

Listado de imágenes de contenedores

Una vez que haya terminado de extraer las imágenes, puede ver las imágenes que existen actualmente en su host ejecutando el comando de imágenes podman.

podman images

Inspección de imágenes de contenedores

Antes de ejecutar un contenedor, siempre es una buena idea probar la imagen y comprender qué hace. El comando podman inspect imprime un mar de metadatos sobre el contenedor, como el sistema operativo y la arquitectura.

Para inspeccionar una imagen, ejecute el comando podman inspect seguido del ID de la imagen o del repositorio.

podman inspect IMAGE ID
OR
podman inspect REPOSITORY

En el siguiente ejemplo, estamos inspeccionando el contenedor MariaDB.

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

Para extraer metadatos específicos para un contenedor, pase la opción --format seguida de los metadatos y la identidad del contenedor (ID de imagen o nombre).

En el siguiente ejemplo, recuperamos información sobre la arquitectura y la descripción del contenedor base RHEL 8 que se encuentra en la sección "Etiquetas".

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

Para inspeccionar una imagen remota de otro registro, utilice el comando skopeo inspect. En el siguiente ejemplo, estamos inspeccionando una imagen de inicio de RHEL 8 alojada en Docker.

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

Etiquetado de imágenes de contenedores

Como habrás notado, los nombres de las imágenes suelen ser de naturaleza genérica. Por ejemplo, la imagen de Redis está etiquetada:

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

Etiquetar imágenes les da un nombre más intuitivo para comprender mejor lo que contienen. Con el comando etiqueta podman, puede crear una etiqueta de imagen que es esencialmente un alias de un nombre de imagen que consta de diferentes partes.

Estos son:

registry/username/NAME:tag

Por ejemplo, para cambiar el nombre genérico de la imagen de Redis que tiene un ID de 646f2730318c, ejecutaremos el comando:

podman tag 646f2730318c myredis

Para agregar una etiqueta al final, agregue dos puntos seguidos del número de etiqueta:

podman tag 646f2730318c myredis:5.0

Sin agregar el número de etiqueta, solo se le asignará el atributo más reciente.

Imágenes de contenedores en ejecución

Para ejecutar un contenedor, utilice el comando podman run. Por ejemplo:

podman run image_id

Para ejecutar un contenedor silenciosamente en segundo plano como un servicio demonio, utilice la opción -d como se muestra.

podman run -d image_id

Por ejemplo, para ejecutar la imagen redis con ID 646f2730318c, invocaremos el comando:

podman run -d 646f2730318c

Si está ejecutando un contenedor basado en un sistema operativo como la imagen base RHEL 8, puede obtener acceso al shell usando la directiva -it. La opción -i crea una sesión interactiva mientras que -t genera una sesión de terminal. La opción --name establece el nombre del contenedor en mybash mientras que es el ID de imagen ecbc6f53bba0 de la imagen base.

podman run -it --name=mybash ecbc6f53bba0

A partir de entonces, puede ejecutar cualquier comando de shell. En el siguiente ejemplo, verificamos la versión del sistema operativo de la imagen del contenedor.

cat /etc/os-release

Para salir del contenedor, simplemente invoque el comando de salida.

exit

Una vez que se sale del contenedor, se detiene automáticamente. Para iniciar el contenedor nuevamente, use el comando podman start con el indicador -ai como se muestra.

podman start -ai mybash

Una vez más, esto le da acceso al shell.

Listado de imágenes de contenedores en ejecución

Para enumerar los contenedores actualmente en ejecución, utilice el comando podman ps como se muestra.

podman ps

Para ver todos los contenedores, incluidos aquellos que salieron después de la ejecución, use el comando:

podman ps -a

Configure las imágenes del contenedor para que se inicien automáticamente en el servicio Systemd

En esta sección, nos centramos en cómo se puede configurar un contenedor para ejecutarse directamente en un sistema RHEL como un servicio systemd.

Primero, obtenga su imagen preferida. En este caso, hemos extraído la imagen de Redis de Docker Hub:

podman pull docker.io/redis

Si tiene SELinux ejecutándose en su sistema, necesita activar el booleano container_manage_cgroup para ejecutar contenedores con systemd.

setsebool -p container_manage_cgroup on

Luego, ejecute la imagen del contenedor en segundo plano y asígnela al nombre de su imagen preferida. En este ejemplo, hemos nombrado nuestra imagen redis_server y hemos asignado el puerto 6379 desde el contenedor a nuestro host RHEL 8.

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

A continuación, vamos a crear un archivo de configuración de unidad systemd para redis en el directorio /etc/systemd/system/.

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

Pegue el contenido a continuación en el archivo.

[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

Guardar y salir del archivo.

A continuación, configure el contenedor para que se inicie automáticamente al iniciar.

systemctl enable redis-container.service

A continuación, inicie el contenedor y verifique su estado de ejecución.

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

Configurar almacenamiento persistente para imágenes de contenedores

Al ejecutar contenedores, es prudente configurar almacenamiento externo persistente en el host. Esto proporciona una copia de seguridad en caso de que el contenedor falle o se elimine accidentalmente.

Para conservar los datos, asignaremos un directorio ubicado en el host a un directorio dentro del contenedor.

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

La opción --privileged se pasa cuando SELinux está configurado para aplicar. La opción -v especifica el volumen externo que se encuentra en el host. El volumen contenedor aquí es el directorio /mnt.

Una vez que hayamos accedido al shell, crearemos un archivo de muestra testing.txt en el directorio /mnt como se muestra.

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

Luego saldremos del contenedor y comprobaremos si el archivo existe en el almacenamiento externo que reside en el host.

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

SalidaEsto prueba el almacenamiento externo persistente.

Detener y retirar contenedores

Una vez que haya terminado de ejecutar su contenedor, puede detenerlo usando el comando podman stop seguido del container-id que puede obtener del podman ps comando .

podman stop container-id

Para eliminar los contenedores que ya no necesita, primero asegúrese de detenerlo y luego invoque el comando podman rm seguido de la identificación o el nombre del contenedor como una opción.

podman rm container-id

Para eliminar varios contenedores a la vez con un solo comando, especifique los ids del contenedor separados por un espacio.

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

Para borrar todos sus contenedores, ejecute el comando:

podman rm -a

Eliminar una imagen

Para eliminar una imagen, primero asegúrese de que todos los contenedores generados a partir de las imágenes se detengan y eliminen como se analizó en el subtema anterior.

A continuación, continúe y ejecute el comando podman -rmi seguido del ID de la imagen como se muestra:

podman -rmi image-id

Conclusión

Con esto concluye este capítulo sobre la gestión y el trabajo con contenedores en RHEL 8. Esperamos que esta guía le haya proporcionado una comprensión adecuada de los contenedores y de cómo puede interactuar y gestionarlos en su sistema RHEL utilizando podman y Skopeo.