Instalando y jugando con una alternativa a Docker: Podman

Instalando y jugando con una alternativa a Docker: Podman

En la arena de los motores de contenedores, no solo existe Docker, hay un par más, en concreto, en este artículo, hablaré sobre Podman.

Docker, de alguna manera, es el estándar cuando hablamos de contenedores, hay mucho contenido en la vuelta alrededor de este motor, pero hay otras opciones a la hora de hablar de contenedores sin meternos al nivel de la orquestación. Una de ellas es Podman.

Podman, es un proyecto Open Source que está respaldado por Red Hat y que es relativamente joven, hace poco se lanzó la versión 2 y lo que tiene de interesante es que el uso de la CLI es muy similar a la de Docker, lo cual hace que probarlo no nos obligue a aprender comandos nuevos.

Este motor trabaja un poco diferente de como trabaja Docker. En Docker, cada contenedor está atachado al proceso madre, que es el motor y que el mismo está atachado a systemd. Podman, en cambio, cada contenedor, es un proceso individual y no depende de un proceso madre, esto lo hace, de alguna manera un poco más robusto ya que nuestro contenedor no depende de otro proceso y su salud.

Dos cosas que me gustan mucho de Podman es que tiene menos componentes que Docker para hacer prácticamente lo mismo, lo cual hace que el footprint sea mínimo y la posibilidad de correr contenedores sin permisos de root, esto es algo que siempre se le criticó a Docker y Podman, lo resuelve, aunque, por ejemplo, para correr podman stats, para ver el uso de recursos por parte de los contenedores, tenemos que ejecutarlo con sudo.

Empecemos a jugar...

Instalando Podman

Cuando pensamos en desplegar Podman, pensamos en sistemas RHEL kind, por ejemplo, Fedora, CentOS, el mismo RHEL y Fedora CoreOS, pero también es compatible con sistemas Debian, así que en este caso, vamos a hacer la instalación en Ubuntu Server Core 20.04.

Ejecutamos lo siguiente:

$ . /etc/os-release
$ echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
$ curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/Release.key | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get -y upgrade
$ sudo apt-get -y install podman

Esto va a descargar e instalar los paquetes, si prestamos atención, veremos que lo que ocupa de disco es...

After this operation, 142 MB of additional disk space will be used.

Esto es menos de la mitad de lo que instala Docker.

Para revisar si quedo todo instalado, podemos correr lo siguiente:

$ podman ps

Este comando, es el equivalente a docker ps y nos mostrará los contenedores que están corriendo. Como en este caso la instalación es nueva, el resultado de ese comando debe verse así:

CONTAINER ID  IMAGE   COMMAND  CREATED  STATUS  PORTS   NAMES

Ya tenemos Podman instalado y funcionando, corramos algunos contenedores.

Hello World

Nuestro primer container va a ser un Hello World. No es muy diferente al hacerlo con Docker, veamos...

$ podman run -d -p 8080:80 tutum/hello-world

El resultado se verá algo así:

Trying to pull docker.io/tutum/hello-world...
Getting image source signatures
Copying blob 983d35417974 done
Copying blob a3ed95caeb02 done
Copying blob d0034177ece9 done
Copying blob af3cc4b92fa1 done
Copying blob 658bc4dc7069 done
Copying blob a3ed95caeb02 done
Copying blob a3ed95caeb02 skipped: already exists
Writing manifest to image destination
Storing signatures
15ad7659ef2a1f4bfcfeeadbcdce3cc10c9367cd1c9fd51e2d71c0e22f7c09f6

Si hacemos un podman ps, veremos que nuestro contenedor ya está corriendo.

CONTAINER ID  IMAGE                               COMMAND               CREATED             STATUS                 PORTS                 NAMES
15ad7659ef2a  docker.io/tutum/hello-world:latest  /bin/sh -c php-fp...  About a minute ago  Up About a minute ago  0.0.0.0:8080->80/tcp  gracious_hoover

Si vamos al navegador y hacemos http://ip-host:8080, veremos nuestro Hello World.

Veamos otro ejemplo bastante sencillo para que veas que no hay mucha diferencia.

NGINX con un volumen persistente

Cuando corremos un NGINX para servir nuestros sitios web, si o si, debemos generar un volumen persistente para que cuando ese contenedor no se muera, no se muera nuestro sitio web, así que para eso, vamos a generar un volumen para darle persistencia a la data que hay dentro del contenedor.

$ podman run -d -p 8081:80 -v /home/ubuntu/nginx/:/usr/share/nginx/html nginx:latest

El resultado será algo como esto:

Getting image source signatures
Copying blob a95689b8e6cb done
Copying blob 1a0022e444c2 done
Copying blob bb79b6b2107f done
Copying blob 32b7488a3833 done
Copying blob 111447d5894d done
Copying config f35646e839 done
Writing manifest to image destination
Storing signatures
869b5b9a1fd85825e089215c1111d6a5553199dbb64061a9c0d7fc5af12adb3f

Con podman ps, ahora vemos que tenemos dos contenedores corriendo:

CONTAINER ID  IMAGE                               COMMAND               CREATED         STATUS             PORTS                 NAMES
869b5b9a1fd8  docker.io/library/nginx:latest      nginx -g daemon o...  18 seconds ago  Up 17 seconds ago  0.0.0.0:8081->80/tcp  distracted_proskuriakova
15ad7659ef2a  docker.io/tutum/hello-world:latest  /bin/sh -c php-fp...  12 minutes ago  Up 12 minutes ago  0.0.0.0:8080->80/tcp  gracious_hoover

Si inspeccionamos el contenedor, veremos que el volumen está montado...

$ podman inspect 'id-container'
        "Mounts": [
            {
                "Type": "bind",
                "Name": "",
                "Source": "/home/ubuntu/nginx",
                "Destination": "/usr/share/nginx/html",
                "Driver": "",
                "Mode": "",
                "Options": [
                    "rbind"
                ],
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

Para ir cerrando

Estos dos ejemplos fueron muy básicos, pero fueron para demostrar que a este nivel, el usar uno u otro no representa un cambio sustancia si es que venís usando Docker.

En otros artículos veremos algunos tweak que se le pueden/deben hacer a Podman, así como también veremos despliegues más avanzados, no solo de contenedores, sino también de pods ;). Así que estén atentos.