Cómo instalar y utilizar Podman para ejecutar contenedores en Rocky Linux 8

Podman es una plataforma de contenedores gratuita y de código abierto creada para desarrollar, gestionar y desplegar contenedores y vainas en el entorno Linux. Redhat desarrolló Podman en 2018. Es un motor de contenedorización que funciona de forma diferente a Docker. Podman no depende de un demonio para funcionar, a diferencia de Docker que utiliza Docker CLI y el demonio Docker. Depender de un demonio conduce a un único punto de fallo.

Podman está diseñado según los estándares de la OCI (Open Container Initiative) que permiten a Podman interactuar directamente con el kernel, los contenedores y las imágenes. También es más seguro que Docker, ya que no requiere acceso de root. Podman puede utilizarse como sustituto de Docker, ya que ambos cumplen con la OCI.

Este artículo te mostrará cómo instalar Podman y utilizarlo para crear y gestionar imágenes y contenedores.

Requisitos previos

  1. Un servidor basado en Rocky Linux

  2. Un usuario no-sudo con privilegios de root.

  3. Asegúrate de que el servidor está actualizado.

    $ sudo dnf update
    

Instalar Podman

Podman está incluido en el módulo container-tools, junto con Buildah y Skopeo. También está disponible en el repositorio de AppStream para Rocky Linux 8. Utilizaremos el método del módulo.

Instala Podman con el comando dnf module.

$ sudo dnf module install container-tools

Comprueba la versión de Podman para ver si está instalado correctamente.

$ podman --version
podman version 3.2.3

Buscar y descargar las imágenes del contenedor

Para buscar la imagen de Nginx, utiliza el siguiente comando.

$ podman search nginx

Resultado de la búsqueda de imágenes de Podman

En la salida, verás el nombre del registro del que procede la imagen y una descripción de las imágenes.

Para descargar la imagen, utiliza uno de los siguientes comandos.

$ podman pull docker.io/library/nginx

OR

$ podman pull nginx

Puedes ver las imágenes descargadas mediante el siguiente comando.

$ podman images
REPOSITORY               TAG         IMAGE ID      CREATED     SIZE
docker.io/library/nginx  latest      f8f4ffc8092c  3 days ago  138 MB

Ejecutar contenedores

Utiliza el siguiente comando para ejecutar un contenedor con la imagen Nginx. Hemos nombrado al contenedor como webserver.

$ podman run -d --name webserver nginx 

Podemos utilizar la misma imagen para lanzar otro contenedor con un nombre diferente.

$ podman run -d --name webserver2 nginx

Podemos lanzar un número ilimitado de contenedores utilizando la misma imagen.

Listar y detener contenedores

Para listar todos los contenedores en ejecución, utiliza el siguiente comando.

$ podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED         STATUS             PORTS       NAMES
19b6668bc627  docker.io/library/nginx:latest  nginx -g daemon o...  31 seconds ago  Up 31 seconds ago              webserver
35a286ba5a55  docker.io/library/nginx:latest  nginx -g daemon o...  2 seconds ago   Up 3 seconds ago               webserver2

Detén el contenedor en ejecución.

$ podman stop webserver
webserver

Comprueba si se ha detenido.

$ podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED             STATUS                 PORTS       NAMES
35a286ba5a55  docker.io/library/nginx:latest  nginx -g daemon o...  About a minute ago  Up About a minute ago              webserver2

Para listar todos los contenedores, incluidos los detenidos, debes utilizar la bandera -a.

$ podman ps -a
CONTAINER ID  IMAGE                           COMMAND               CREATED             STATUS                     PORTS       NAMES
19b6668bc627  docker.io/library/nginx:latest  nginx -g daemon o...  2 minutes ago       Exited (0) 35 seconds ago              webserver
35a286ba5a55  docker.io/library/nginx:latest  nginx -g daemon o...  About a minute ago  Up About a minute ago                  webserver2

Iniciar un contenedor parado

Utiliza el siguiente comando para iniciar un contenedor detenido.

$ podman start webserver
webserver

Comprueba si se ha iniciado.

$ podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS             PORTS       NAMES
19b6668bc627  docker.io/library/nginx:latest  nginx -g daemon o...  3 minutes ago  Up 16 seconds ago              webserver
35a286ba5a55  docker.io/library/nginx:latest  nginx -g daemon o...  2 minutes ago  Up 2 minutes ago               webserver2

Eliminar un contenedor

Tienes que detener un contenedor antes de eliminarlo.

$ podman stop webserver2

Elimina el contenedor.

$ podman rm webserver2

Puedes eliminar un contenedor en ejecución utilizando la bandera --force.

$ podman rm webserver2 --force
35a286ba5a553d5f88e3d9795780f893cfb58bf4a126c4912d1ec56b9d0e5a27

Matar contenedor

Detener y Matar un contenedor son dos cosas diferentes que al final consiguen lo mismo. La diferencia es que Detener un contenedor lo cierra con gracia, mientras que Matar un contenedor es terminarlo a la fuerza, lo que provoca la pérdida de datos.

Utiliza el siguiente comando para matar el contenedor.

$ podman kill -s 9 webserver2

El comando anterior utiliza la opción SIGNAL 9 (SIGKILL) para matar el contenedor.

Para matar todos los contenedores, utiliza la bandera --all o -a y para matar sólo el último contenedor, utiliza la bandera --latest o -l.

Borrar la imagen

Puedes eliminar las imágenes utilizando el comando rmi.

$ podman rmi registry.redhat.io/rhel8/rsyslog

Puedes eliminar varias imágenes separándolas con comas.

$ podman rmi registry.redhat.io/rhel8/rsyslog registry.redhat.io/ubi8/ubi

Para eliminar todas las imágenes de tu sistema, utiliza la bandera -a.

$ podman rmi -a

Ver los registros del contenedor

Para ver los registros de los contenedores, utiliza el siguiente comando.

$ podman logs webserver
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
......

Puedes restringir los registros a las últimas 5 líneas utilizando la opción --tail.

$ podman logs --tail=5 webserver
2021/10/05 10:13:52 [notice] 1#1: built by gcc 8.3.0 (Debian 8.3.0-6)
2021/10/05 10:13:52 [notice] 1#1: OS: Linux 4.18.0-305.19.1.el8_4.x86_64
2021/10/05 10:13:52 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 262144:262144
2021/10/05 10:13:52 [notice] 1#1: start worker processes
2021/10/05 10:13:52 [notice] 1#1: start worker process 23

Por defecto, no obtendrás ninguna marca de tiempo en los registros. Utiliza la bandera -t para añadir marcas de tiempo a tus registros.

$ podman logs -t webserver
2021-10-05T09:25:02.026967459Z /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
2021-10-05T09:25:02.026967459Z /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
2021-10-05T09:25:02.033956297Z /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
2021-10-05T09:25:02.043751152Z 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
2021-10-05T09:25:02.064561317Z 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
.....

Inspección de contenedores

Al inspeccionar un contenedor se imprimirá la información sobre el mismo.

$ podman inspect webserver
[
    {
        "Id": "19b6668bc6278a66b3ffc98ae1515af25f5bebcd20bf26de803cae41c4485f59",
        "Created": "2021-10-05T09:25:01.784949744Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],
        "State": {
            "OciVersion": "1.0.2-dev",
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 4423,
....

El comando por defecto imprimirá una salida larga en formato JSON. Para filtrar la salida, debes utilizar la opción --format. Para saber cuándo se inició el contenedor, ejecuta el siguiente comando.

$ podman inspect webserver --format '{{.State.StartedAt}}'
2021-10-05 10:13:52.794806322 +0000 UTC

Acceder al Shell del contenedor

Puedes acceder al prompt Shell de cualquier contenedor utilizando la opción exec.

$ podman exec -it webserver2 /bin/bash

Pods

Podman tiene una característica única de la que carece Docker. Podman puede crear Pods a partir de contenedores que funcionan juntos. Esto te permite gestionar varios contenedores en conjunto.

Para crear un Pod, utiliza el siguiente comando.

$ podman pod create --name mypod

Añade los contenedores al pod recién creado.

$ podman run --pod mypod --name myimage1 image:latest
$ podman run --pod mypod --name myimage2 diff-image:latest

Ahora puedes gestionar los contenedores mediante sencillos comandos de una sola línea.

$ podman kill mypod      # Kill all containers
$ podman restart mypod   # Restart all containers
$ podman stop mypod      # Stop all containers
$ podman pod ps			# List all pods
$ podman pod top mypod   # Display running processes in a pod
$ podman pod inspect mypod # Inspect a Pod
$ podman pod rm mypod    # Remove the pod

Conclusión

Con esto concluye nuestro tutorial sobre la instalación y uso de Podman para ejecutar Contenedores. Hay muchas cosas que puedes hacer con Podman que no hemos cubierto. Si tienes alguna pregunta, publícala en los comentarios de abajo.

También te podría gustar...