Cómo administrar contenedores con 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 ejecutaron como se esperaba o encontraron errores y fallaron por completo. Y ahí es donde nació el concepto de contenedores.

¿Qué son las imágenes de contenedor?

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 los comandos de Docker que requieren. Éstas incluyen:

  • Podman: este es un motor de contenedores sin demonios para ejecutar y administrar contenedores OCI en modo root o sin root. 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 utilizando podman de la misma manera que lo haría con Docker. Podman viene con muchas funciones avanzadas, se integra completamente con los sistemas y ofrece soporte para el 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 contenedor 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: este es un conjunto de herramientas de línea de comandos que se utilizan para crear y administrar imágenes OCI de contenedor 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 contenedor desde un registro remoto

El comando de búsqueda de podman le permite buscar registros remotos seleccionados para imágenes de contenedores. 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.

  • [registros.inseguro]: esta sección especifica los registros que no implementan el cifrado TLS, es decir, registros inseguros. De forma predeterminada, no se especifican entradas.

  • [registries.block]: esto bloquea o deniega el acceso a los registros especificados desde su sistema local. De forma predeterminada, no se especifican entradas.

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

Cuando especifique los registros, tenga en cuenta lo siguiente:

  • Todos los registros deben ir entre comillas simples.
  • Los registros se pueden especificar mediante 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 puertos 443 para seguro y 80 para inseguro, el número de puerto debe especificarse junto con el nombre del registro, p. ej. 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 de 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

Tirando de imágenes de contenedores

Para extraer o recuperar imágenes de contenedor de un registro remoto, primero debe autenticarse 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 fue exitoso.

Login Succeeded!

Ahora, puede 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 de TCP. El y el especifican colectivamente una imagen de contenedor basada en el en el registro. Finalmente, la opción especifica la versión de la imagen del contenedor. Si no se especifica ninguno, se utiliza la etiqueta predeterminada, la más reciente.

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

Para extraer la imagen MariaDB, ejecute el comando:

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

  • El - registry.redhat.io
  • El - rhel8
  • El - MariaDB
  • El - 103

Para la extracción de imágenes de contenedor posteriores, no es necesario iniciar sesión más, ya que ya está autenticado. Para extraer una imagen de contenedor de 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 podman images.

# podman images

Inspección de imágenes de contenedores

Antes de ejecutar un contenedor, siempre es una buena idea sondear la imagen y comprender lo que 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 el 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, estamos recuperando 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, use 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á 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 de etiqueta de podman, puede crear una etiqueta de imagen que es esencialmente un alias de un nombre de imagen que comprende 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 completos 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.

Ejecución de imágenes de contenedor

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

# podman run image_id

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

# podman run -d image_id

Por ejemplo, para ejecutar la imagen de 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, estamos verificando la versión del sistema operativo de la imagen del contenedor.

# cat /etc/os-release

Para salir del contenedor, simplemente invoque el comando exit.

# exit

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

# podman start -ai mybash

Una vez más, esto le da acceso al caparazón.

Listado de imágenes de contenedores en ejecución

Para enumerar los contenedores que se ejecutan actualmente, use el comando podman ps como se muestra.

# podman ps

Para ver todos los contenedores, incluidos los que han salido después de ejecutarse, use el comando:

# podman ps -a

Configurar imágenes de contenedor para que se inicien automáticamente en el servicio Systemd

En esta sección, nos enfocamos en cómo se puede configurar un contenedor para que se ejecute 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

A partir de entonces, ejecute la imagen del contenedor en segundo plano y asígnela a su nombre de imagen preferido. En este ejemplo, hemos nombrado nuestra imagen redis_server y hemos mapeado el puerto 6379 desde el contenedor a nuestro host RHEL 8

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

A continuación, crearemos 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 arrancar.

# 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 el almacenamiento persistente para imágenes de contenedor

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

Para conservar los datos, vamos a mapear 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 hacer cumplir. La opción -v especifica el volumen externo que se encuentra en el host. El volumen del 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

Salida ⇒ Esto prueba el almacenamiento externo persistente.

Detención y extracción de 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 comando podman ps.

# podman stop container-id

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

# podman rm container-id

Para eliminar varios contenedores de una vez en un comando, especifique los ID de 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 estén detenidos y eliminados como se discutió en el subtema anterior.

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

# podman -rmi image-id

Conclusión

Esto concluye este capítulo sobre la administración y el trabajo con contenedores en RHEL 8. Esperamos que esta guía proporcione una comprensión decente de los contenedores y cómo puede interactuar y administrarlos en su sistema RHEL utilizando podman y Skopeo.