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
-
Un servidor basado en Rocky Linux
-
Un usuario no-sudo con privilegios de root.
-
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
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.