Inicio desactivadoInicio desactivadoInicio desactivadoInicio desactivadoInicio desactivado
 

Uno de los desafíos a los que se 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 un 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 útiles herramientas de contenedor que puede aprovechar para trabajar directamente con contenedores de Linux utilizando los comandos de docker requeridos. Éstos incluyen:

  • Podman : este es un motor de contenedor sin daemon 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 con 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 de espacio de nombres de usuario que incluye la ejecución de contenedores sin la necesidad de un usuario raíz.
  • Skopeo : esta es una herramienta de línea de comandos utilizada para copiar imágenes de contenedores de un registro a otro. Puede usar Skopeo para copiar imágenes hacia y desde un host en particular, así como 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 contenedores utilizando archivos Docker.

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

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

El comando de búsqueda podman le permite buscar imágenes de contenedores 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 contenedores. Busca la imagen solicitada en los registros registration.access.redhat.com, registration.redhat.io y docker.io.

Registros predeterminados

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

Registros inseguros

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

Registros de bloques

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 puerto TCP 443 para seguro y 80 para inseguro, el número de puerto debe especificarse junto con el nombre del registro, por ejemplo, registration.example.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 registration.redhat.io, invoque el comando:

# podman search registry.redhat.io/redis

Registro de búsqueda de imagen de contenedor

Para buscar una imagen de contenedor de MariaDB, ejecute.

# podman search registry.redhat.io/mariadb

Buscar imagen de contenedor de MariaDB

Para obtener una descripción detallada de la imagen de un contenedor, utilice la opción --no-trunc antes del nombre de la imagen del contenedor a partir 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

Descripción de la lista de la imagen del contenedor MariaDB

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 de MariaDB, primero inicie sesión en el registro de Redhat:

# podman login

Proporcione su nombre de usuario y contraseña y presione ' ENTRAR ' 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.

¡Inicio de sesión exitoso!

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

# podman pull <registro>[:<puerto>]/[<espacio-de-nombres>/]<nombre>:<etiqueta>

hace referencia al <registry> host o registro remoto que proporciona un depósito de imágenes de contenedor en el TCP <port> . El <namespace> y el <name> especifican colectivamente una imagen de contenedor basada en el registro <namespace>. Finalmente, la opción <tag> 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 cifrado y no permiten que los 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 <registry> registry.redhat.io
  • El <namespace> – rhel8
  • El <name> – MariaDB
  • El <tag> – 103

Extraer imagen de MariaDB

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

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

Extraer imagen de contenedor de Redis

Listado de imágenes de contenedores

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

# podman images

Mostrar imágenes de contenedores

Inspección de imágenes de contenedores

Antes de ejecutar un contenedor, siempre es una buena idea probar la imagen y comprender lo que hace. El comando de inspección podman 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
O 
# podman inspect REPOSITORY

En el siguiente ejemplo, estamos inspeccionando el contenedor de MariaDB.

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

Inspección de imágenes de contenedores de MariaDB

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}}' ID-de-la-imagen
# podman inspect --format='{{.Labels.description}}' ID-de-la-imagen

Obtenga información sobre la arquitectura de contenedores

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

Inspeccionar imagen remota desde Docker Registry

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 redis está etiquetada:

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

Etiquetar imágenes les da un nombre más intuitivo para comprender mejor lo que contienen. Usando el comando de etiqueta podman, puede crear una etiqueta de imagen que es esencialmente un alias para 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.

Establecer nombre para la imagen del contenedor de Redis

Ejecución de imágenes de contenedores

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

# podman run image_id

Para ejecutar un contenedor de forma silenciosa en segundo plano como un servicio daemon, utilice la opción -d que se muestra.

# podman run -d image_id

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

# podman run -d 646f2730318c

Ejecutar imágenes de contenedores de Redis

Si está ejecutando un contenedor basado en un sistema operativo como la imagen base de RHEL 8, puede obtener acceso al shell mediante  -it. La opción -i crea una sesión interactiva mientras -t genera una sesión de terminal. La directiva --name opción 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

Verificar la versión del sistema operativo de la imagen del contenedor

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

# exit

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

# podman start -ai mybash

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

Iniciar imágenes de contenedor

Listado de imágenes de contenedores en ejecución

Para enumerar los contenedores que se están ejecutando actualmente, use el comando podman ps como se muestra.

# podman ps

Lista de imágenes de contenedores en ejecución

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

# podman ps -a

Ver todas las imágenes de contenedores

Configurar imágenes de contenedores 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 que se ejecute directamente en un sistema RHEL como un servicio systemd.

Primero, obtenga su imagen preferida. En este caso, extrajimos la imagen de Redis de Docker Hub:

# podman pull docker.io/redis

Si tiene SELinux ejecutándose en su sistema, debe 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, nombramos nuestra imagen redis_server y asignamos el puerto 6379 desde el contenedor a nuestro host RHEL 8

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

Ejecutar imagen de contenedor en segundo plano

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 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

Verificar el estado de la imagen del contenedor

Configurar almacenamiento persistente para imágenes de contenedores

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 asignar 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 contenedor aquí es el directorio /mnt.

Una vez que hayamos accedido al shell, vamos a crear 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 verificaremos 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.

Configurar almacenamiento persistente para contenedores

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 ID del contenedor que puede obtener del comando podman ps.

# podman stop container-id

Detener imagen de contenedor

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 en un solo comando, especifique los ID de contenedor separados por un espacio.

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

Eliminar imagen de contenedor

Para borrar todos sus contenedores, ejecute el comando:

# podman rm -a

Borrar todos los contenedores

Eliminación de 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 explicó 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

Quita la imagen

Conclusión

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