Ir al contenidoIr a la navegación de la página: página anterior [tecla de acceso p]/página siguiente [tecla de acceso n]
documentation.suse.com / Gestión básica de contenedores mediante Podman

Gestión básica de contenedores mediante Podman

Fecha de publicación: 29 Sep 2024
DESCRIPCIÓN

Los contenedores ofrecen un método de virtualización ligero para ejecutar varios entornos virtuales (contenedores) simultáneamente en un único host. Podman es la herramienta por defecto en SLE Micro para gestionar los contenedores.

INTENCIÓN

Este artículo proporciona información básica sobre Podman y explica cómo se puede utilizar para gestionar contenedores.

ESFUERZO

Se tardan unos 30 minutos en leer este artículo.

OBJETIVO

Comprenderá que es Podman, las imágenes de contenedor y los contenedores.

REQUISITOS
  • Podman debe estar instalado

1 Conceptos básicos sobre los contenedores

Los contenedores ofrecen un método de virtualización ligero para ejecutar varios entornos virtuales (contenedores) simultáneamente en un único host. A diferencia de tecnologías como Xen o KVM, donde el procesador simula un entorno de hardware completo y un hipervisor controla las máquinas virtuales, los contenedores proporcionan virtualización en el nivel del sistema operativo, donde el kernel controla los contenedores aislados.

Ventajas de utilizar contenedores
  • Los contenedores permiten aislar aplicaciones en unidades independientes.

  • Los contenedores proporcionan un rendimiento casi nativo. Dependiendo del tiempo de ejecución, un contenedor puede utilizar el kernel del host directamente, minimizando así la sobrecarga.

  • Es posible controlar las interfaces de red y aplicar recursos dentro de los contenedores a través de grupos de control del kernel.

Limitaciones de los contenedores
  • Los contenedores se ejecutan en el kernel del sistema host, por lo que no pueden utilizar distintos kernels o versiones del kernel.

  • La seguridad de los contenedores depende del sistema host. Las aplicaciones en contenedores se pueden proteger mediante perfiles de AppArmor o SELinux. Proteger los contenedores es más difícil que proteger las máquinas virtuales debido a la mayor superficie de ataque.

2 Acerca de Podman

Podman es la abreviatura de Pod Manager Tool (Herramienta de gestión de pods). Se trata de un motor de contenedor sin daemon que permite ejecutar y distribuir aplicaciones mediante contenedores e imágenes de contenedor. Podman proporciona una interfaz de línea de comandos para gestionar contenedores.

Como Podman no tiene un daemon, proporciona integración con systemd. Esto hace posible controlar los contenedores mediante unidades systemd. Puede crear estas unidades para contenedores existentes, así como generar unidades que puedan iniciar contenedores si no existen en el sistema. Podman puede ejecutar systemd dentro de contenedores.

Podman permite organizar los contenedores en pods. Los pods comparten la misma interfaz de red y los mismos recursos. Un caso de uso típico para organizar un grupo de contenedores en un pod es un contenedor que ejecuta una base de datos y un contenedor con un cliente que accede a la base de datos.

2.1 Instalación de Podman

Podman se incluye en SLE Micro por defecto. Sin embargo, si falta Podman, puede instalarlo como se describe a continuación:

  1. Ejecute el comando:

    > sudo transactional-update pkg install podman*
  2. Reinicie el sistema para arrancar en la nueva instantánea.

3 Obtención de imágenes de contenedor

Para ejecutar un contenedor, necesita una imagen. Una imagen incluye todas las dependencias necesarias para ejecutar una aplicación. Puede obtener imágenes de un registro de imágenes. Los registros disponibles se definen en el archivo de configuración /etc/containers/registries.conf. Si dispone de un registro de imágenes local o desea utilizar otros registros, añádalos al archivo de configuración.

Importante
Importante: no se incluyen herramientas para crear imágenes en SLE Micro

SLE Micro no proporciona herramientas para crear imágenes personalizadas. Por lo tanto, la única forma de obtener una imagen es extraerla de un registro de imágenes.

Nota
Nota: ni el registro de openSUSE ni Docker Hub están habilitados por defecto

Ni el registro de openSUSE ni Docker Hub están configurados en la instalación por defecto. Para descargar imágenes de contenedor de esos registros, debe añadir los registros al archivo /etc/containers/registries.conf de la siguiente manera:

unqualified-search-registries = ["registry.suse.com", "registry.opensuse.org", "docker.io"]

El comando podman pull extrae una imagen de un registro de imágenes. La sintaxis es la siguiente:

# podman pull[OPTIONS]SOURCE

source puede ser una imagen sin el nombre de registro. En ese caso, Podman intentará extraer la imagen de todos los registros configurados en el archivo /etc/containers/registries.conf. La etiqueta de imagen por defecto es latest. La ubicación por defecto de las imágenes extraídas es /var/lib/containers/storage/overlay-images/.

Para ver todas las opciones posibles del comando podman pull, ejecute:

# podman pull --help
Nota
Nota: obtención de imágenes mediante Cockpit

Si utiliza Cockpit, también puede extraer imágenes de un registro de imágenes con el menú Podman containers (Contenedores de Podman) haciendo clic en + Get new image (Obtener nueva imagen).

Podman permite buscar imágenes en un registro de imágenes o en una lista de registros mediante el comando:

# podman searchIMAGE_NAME

Como alternativa, puede utilizar la herramienta skopeo para gestionar imágenes de contenedor y repositorios de imágenes. Para obtener más información, consulte la siguiente sección.

3.1 skopeo

skopeo es una utilidad de línea de comandos para gestionar, inspeccionar y firmar imágenes de contenedores y repositorios de imágenes. skopeo permite inspeccionar contenedores y repositorios en registros de contenedores remotos y locales, y también facilita la copia de imágenes de contenedor entre diferentes sistemas de almacenamiento.

skopeo funciona con los siguientes tipos de registro:

containers-storage:IMAGE_REFERENCE

Una imagen ubicada en un almacén de imágenes local.

docker://IMAGE_REFERENCE

Una imagen en un registro.

skopeo proporciona varios comandos para gestionar imágenes y registros:

inspect

El comando obtiene el manifiesto del repositorio y puede mostrar información como etiquetas disponibles para el repositorio especificado, etiquetas de una imagen de contenedor, el sistema operativo de una imagen, etc.

El comando tiene la siguiente sintaxis:

> skopeo inspect REGISTRY_TYPEIMAGE_NAME

A continuación se muestra un ejemplo de uso:

> skopeo inspect docker://registry.suse.com/suse/pcp:latest
{
  "Name": "registry.suse.com/suse/pcp",
  "Digest": "sha256:eee17c009fb8b05e5825a8c9658d972ab13a17541180bd7a1348fccc6e4fc77f",
  "RepoTags": [
      "5",
      "5-12.54",
      "5-13.10",
      ...
      ],
  "Created": "2023-06-19T16:59:01.617731565Z",
  "DockerVersion": "20.10.23-ce",
  "Labels": {
      "com.suse.application.pcp.created": "2023-06-19T16:58:29.786850402Z",
      "com.suse.application.pcp.description": "Performance Co-Pilot (pcp) container image based on the SLE Base Container Image. This container image is not supported when using a container runtime other than podman.",
      ...
      ],
      "Architecture": "amd64",
  "Os": "linux",
  "Layers": [
      "sha256:a05e4c4d1fc89c7f7aa60829b8631b64873df6041f627eb2b43524e9e010446e",
      "sha256:19793da49ce886a67aa62657dc24a105a26d63568ce27de241246bc6cc9bc008",
      "sha256:403f9ef6c98d4cf277caf3166ca4455817828e33c8b699237bb8eb24cb2b41bf"
  ],
  "LayersData": [
      {
          "MIMEType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
          "Digest": "sha256:a05e4c4d1fc89c7f7aa60829b8631b64873df6041f627eb2b43524e9e010446e",
          "Size": 47291175,
          "Annotations": null
      },
      ...
  ],
  "Env": [
      "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
copy

El comando permite copiar imágenes de contenedor entre registros, sistemas secundarios de almacenamiento de contenedores y directorios locales.

A continuación se muestra un ejemplo de uso:

> skopeo copy oci:busybox_ocilayout:latest dir:existingemptydirectory
delete

Para marcar una imagen para que el recopilador de basura del registro la elimine posteriormente.

> skopeo delete docker://registry.example.com/example/pause:latest
sync

Para sincronizar imágenes entre repositorios de registro y directorios locales.

4 Uso de contenedores

4.1 Ejecución de contenedores

Después de extraer la imagen del contenedor, puede crear contenedores basados en ella. Puede ejecutar una instancia de la imagen mediante el comando podman run. La sintaxis del comando es la siguiente:

# podman run [OPTIONS] IMAGE [CONTAINER_NAME]

IMAGE se especifica con el formato transport:path. Si se omite el transporte, se utiliza el valor por defecto docker. La vía puede hacer referencia a un registro de imagen específico. Si se omite, Podman busca la imagen en los registros definidos en el archivo /etc/containers/registries.conf. A continuación se muestra un ejemplo que ejecuta un contenedor llamado sles15 basado en la imagen sle15:

# podman run registry.opensuse.org/suse/templates/images/sle-15-sp4/base/images/suse/sle15 sles15

A continuación se muestra una lista de las opciones más utilizadas. Para obtener una lista completa de las opciones disponibles, ejecute el comando podman run --help:

--detach, -d

El contenedor se ejecutará en segundo plano.

--env, -e=env

Esta opción permite que las variables de entorno arbitrarias que están disponibles para el proceso se lancen dentro del contenedor. Si se especifica una variable de entorno sin un valor, Podman comprobará el entorno del host en busca de un valor y establecerá la variable solo si está definida en el host.

--help

Imprime la ayuda para el comando podman run.

--hostname=nombre, -h

Define el nombre de host del contenedor que está disponible dentro del contenedor.

--pod= nombre

Ejecuta el contenedor en un pod existente. Para crear un pod, añada el prefijo new: al nombre del pod.

--read-only

Monta el sistema de archivos raíz del contenedor como de solo lectura.

--systemd=true|false|always

Ejecuta el contenedor en modo systemd. El valor por defecto es verdadero.

4.2 Listado de contenedores

Podman permite mostrar todos los contenedores en ejecución usando el comando podman ps. La sintaxis genérica del comando es la siguiente:

# podman  ps[OPTIONS]

Las opciones del comando pueden cambiar la información mostrada. Por ejemplo, si se usa la opción --all, se mostrarán todos los contenedores creados por Podman (no solo los contenedores en ejecución).

Para obtener una lista completa de opciones de podman ps, ejecute:

# podman ps --help

4.3 Detención de contenedores

Si el comando podman run finaliza correctamente, se ha iniciado un nuevo contenedor. Puede detener el contenedor ejecutando:

# podman stop[OPTIONS]CONTAINER

Puede especificar un único nombre o ID de contenedor o una lista de contenedores separados por espacios. El comando acepta las siguientes opciones:

--all, -a

Detiene todos los contenedores en ejecución.

--latest, -l

En lugar de proporcionar un nombre de contenedor, se detendrá el último contenedor creado.

--time, -t= segundos

Segundos de espera antes de detener el contenedor a la fuerza.

Para ver todas las opciones posibles del comando podman stop, ejecute lo siguiente:

# podman stop --help

4.4 Inicio de contenedores

Para iniciar contenedores ya creados pero detenidos, utilice el comando podman start. La sintaxis del comando es la siguiente:

# podman start[OPTIONS]CONTAINER

CONTAINER puede ser un nombre de contenedor o un ID de contenedor.

Para obtener una lista completa de las opciones posibles de podman start, ejecute el comando:

# podman start --help

4.4.1 Confirmación de contenedores modificados

Puede ejecutar un contenedor nuevo con atributos específicos que no formen parte de la imagen original. Para guardar el contenedor con estos atributos como una imagen nueva, puede utilizar el comando podman commit:

# podman commit[OPTIONS]CONTAINERIMAGE

CONTAINER es un nombre de contenedor o un ID de contenedor. IMAGE es el nuevo nombre de la imagen. Si el nombre de la imagen no comienza con un nombre de registro, se utiliza el valor localhost.

4.5 Eliminación de contenedores

Para eliminar uno o varios contenedores no utilizados del host, utilice el comando podman rm de la siguiente manera:

# podman rm[OPTIONS]CONTAINER

CONTAINER puede ser un nombre de contenedor o un ID de contenedor.

El comando no elimina el contenedor especificado si el contenedor se está ejecutando. Para eliminar un contenedor en ejecución, utilice la opción -f.

Para obtener una lista completa de opciones de podman rm, ejecute:

# podman rm --help
Nota
Nota: supresión de todos los contenedores detenidos

Puede suprimir todos los contenedores detenidos del host con un solo comando:

# podman container prune

Asegúrese de que esté previsto que todos los contenedores detenidos se eliminarán antes de ejecutar el comando; de lo contrario, podrían eliminarse contenedores que todavía están en uso y se han detenido solo temporalmente.

5 Uso de pods

Los contenedores se pueden agrupar en un pod. Los contenedores del pod comparten la red, el pid y el espacio de nombres IPC. Los pods se pueden gestionar mediante comandos podman pod. Esta sección proporciona una descripción general de los comandos para gestionar los pods.

5.1 Creación de pods

El comando podman pod create se utiliza para crear un pod. La sintaxis del comando es la siguiente:

# podman pod create[OPTIONS]

El comando genera el ID del pod. Por defecto, los pods se crean sin iniciar. Puede iniciar un pod ejecutando un contenedor del pod o iniciando el pod como se describe en la Sección 5.3, “Iniciar, detener o reiniciar pods”.

Nota
Nota: nombres de pod por defecto

Si no especifica un nombre de pod con la opción --name, Podman asignará un nombre por defecto al pod.

Para obtener una lista completa de las opciones posibles, ejecute el siguiente comando:

# podman pod create --help

5.2 Listado de pods

Puede mostrar todos los pods ejecutando el comando:

# podman pod list

El resultado es el siguiente:

POD ID        NAME               STATUS   CREATED       # OF CONTAINERS  INFRA ID
30fba506fecb  upbeat_mcclintock  Created  19 hours ago  1                4324f40c9651
976a83b4d88b  nervous_feynman    Running  19 hours ago  2                daa5732ecd02

Dado que cada pod incluye el contenedor INFRA, el número de contenedores de un pod es siempre mayor que cero.

5.3 Iniciar, detener o reiniciar pods

Después de crear un pod, debe iniciarlo, ya que por defecto no se encuentra en el estado running. En los comandos siguientes, POD puede ser un nombre de pod o un ID de pod.

Para iniciar un pod, ejecute el comando:

# podman pod start[OPTIONS]POD

Para obtener una lista completa de las opciones posibles, ejecute:

# podman pod start --help

Para detener un pod, utilice el comando podman pod stop así:

# podman pod stopPOD

Para reiniciar un pod, utilice el comando podman pod restart de la siguiente manera:

# podman pod restartPOD

5.4 Gestión de contenedores de un pod

Para añadir un contenedor nuevo a un pod, utilice el comando podman run con la opción --pod. A continuación se muestra una sintaxis general del comando:

# podman run[OPTIONS] --pod POD_NAME IMAGE

Para obtener más información sobre el comando podman run, consulte la Sección 4.1, “Ejecución de contenedores”.

Nota
Nota: solo se pueden añadir contenedores nuevos a un pod

El comando podman start no permite iniciar un contenedor en un pod si el contenedor no se ha añadido al pod durante la ejecución inicial del contenedor.

No es posible eliminar un contenedor de un pod y mantener el contenedor en ejecución, ya que el contenedor en sí se elimina del host.

Otras acciones como iniciar, reiniciar y detener se pueden realizar en contenedores específicos sin que ello afecte al estado del pod.

5.5 Monitorización de procesos en pods

Para ver todos los contenedores de todos los pods, utilice el siguiente comando:

# podman ps -a --pod

El resultado del comando será similar a lo siguiente:

CONTAINER ID  IMAGE                       COMMAND    CREATED       STATUS                 [...]
4324f40c9651  k8s.gcr.io/pause:3.2                   21 hours ago  Created
daa5732ecd02  k8s.gcr.io/pause:3.2                   22 hours ago  Up 3 hours ago
e5c8e360c54b  localhost/test:latest       /bin/bash  3 days ago    Exited (137) 3 days ago
82dad15828f7  localhost/opensuse/toolbox  /bin/bash  3 days ago    Exited (137) 3 days ago
1a23da456b6f  docker.io/i386/ubuntu       /bin/bash  4 days ago    Exited (0) 6 hours ago
df890193f651  localhost/opensuse/toolbox  /bin/bash  4 days ago    Created

Los dos primeros registros son los contenedores INFRA de cada pod, según la imagen k8s.gcr.io/pause:3.2. Otros contenedores del resultado son contenedores independientes que no pertenecen a ningún pod.

5.6 Eliminación de pods

Hay dos formas de eliminar pods. Puede utilizar el comando podman pod rm para eliminar uno o varios pods. Como alternativa, puede eliminar todos los pods detenidos mediante el comando podman pod prune.

Para eliminar un pod o varios pods, ejecute el comando podman pod rm de la siguiente manera:

# podman pod rmPOD

POD puede ser un nombre de pod o un ID de pod.

Para eliminar todos los pods actualmente detenidos, utilice el comando podman pod prune. Asegúrese de que todos los pods detenidos deben eliminarse antes de ejecutar el comando podman pod prune; de lo contrario, podría eliminar pods que aún estén en uso.