viernes, 12 de febrero de 2021

Podman: contenedores docker de la mano de RedHat

Podman es un motor de contenedores (container engine) que puede ser un sustituto para Docker. Este motor ha sido desarrollado por la compañía Red Hat (ahora propiedad de IBM) y pretende ir desplazándolo poco a poco. Si ya estás acostumbrado a usar Docker tampoco te tienes que preocupar demasiado por los comandos, ya que Podman usa los mismos en su mayoría. Es decir, si para correr un contenedor tienes que usar docker run, para hacerlo con este otro proyecto tienes que usar podman run. Así de sencillo para recordar las opciones.


Podman (abreviatura de Pod Manager) es un motor de contenedores lanzado por primera vez en febrero de 2018 por la empresa de software estadounidense Red Hat, conocida principalmente por sus soluciones empresariales de alto rendimiento para diferentes proyectos de código abierto, como Red Hat Enterprise Linux (RHEL) u OpenStack. Basándose en la experiencia de Docker, en un principio estaba previsto que Podman no fuese un motor independiente, sino una herramienta de depuración sencilla para CRI-O, un plan que pronto se rechazó.

¿Qué es Podman?

Podman es un motor de contenedores (container engine) desarrollado por RedHat, y sí, si lo de motor de contenedores lo has asociado con Docker, vamos por buen camino.

Podman quiere ser la alternativa al archiconocido motor Docker para contenedores, pero nos preguntamos: ¿Qué nos ofrece RedHat con Podman? ¿Por qué deberíamos migrar a Podman? ¿Es Podman el sustituto de Docker o solo un competidor más? Es pronto para dar respuesta a todas a estas preguntas, pero en este artículo intentaremos describir cuáles son las bazas que tiene Podman para destronar al actual rey de los contenedores.

El proyecto de código abierto tiene una gran facilidad de uso, lo que es un gran atractivo. Tal es la facilidad que existe un artículo de Dan Walsh, un ingeniero de Red Hat, en el que muestra los pasos de una migración para reemplazar Docker con Podman, y eran crear un alias docker=podman

Facilidad de uso

Mientras me documentaba para escribir este artículo, me topé con una presentación del ingeniero de RedHat, Dan Walsh, en la que comenzaba diciendo cómo reemplazar Docker con Podman e indicaba cómo realizar esta migración en una serie de pasos.

El primero es ejecutar:

dnf install -y podman

Seguidamente ejecutar:

alias docker=podman


La idea es demostrar que la migración a Podman es muy sencilla, ya que los ingenieros de RedHat han prestado especial atención en usar la misma nomenclatura a la hora de ejecutar comandos de Podman. Por lo que, si eres un usuario de Docker, ya conoces la mayoría de los comandos en Podman. Así que, efectivamente, es tan sencillo como, en lugar de ejecutar docker run, ejecutar podman run, y el resultado será exactamente el mismo.

Podman: el motor de contenedores sin daemon

No más demonios gordos (#nobigfatdaemons)

Como sabes, Docker sí que tiene su demonio asociado. Ese demonio es único y centralizado, lo que quiere decir que mientras más contenedores uses, su complejidad irá creciendo y haciéndose más y más pesado. Por eso Red Hat ha decidido crear esta otra herramienta para corregir esa desventaja.

En Podman se han descentralizado los componentes para la gestión de contenedores y así evitar ese ensanchamiento del demonio como ocurre en Docker. Esos componentes individuales solo son usados cuando sean necesarios, lo que dejará un menor consumo de recursos.

Además de esa ventaja tiene otra gran ventaja. Podman puede gestionar contenedores de la misma forma que Docker, pero también puede hacerlo con Pods, es decir, las unidades que se usan en Kubernetes. La diferencia esencial entre un contenedor y un Pod es que cada Pod puede contener a su vez más de un contenedor.

Es una referencia al servicio (daemon en inglés) de Docker. Como sabemos, Docker es una herramienta maravillosa, con infinidad de ventajas y opciones. Es capaz de manejar todo lo referente a nuestros contenedores: red, almacenamiento, ejecución, motorización, etc., y todo esto lo gestiona el mismo servicio de Docker, lo cual puede traer algunas desventajas, ya que mientras más contenedores usemos, más grande y complejo se hace el servicio de Docker.

Es por esto que RedHat ha decidido desarrollar su herramienta sin depender de un servicio, y esta es la principal diferencia entre Docker y Podman.

Podman no necesita un gran servicio (daemon) para funcionar; han descentralizado todos los componentes necesarios para la gestión de contenedores y los han individualizado en componentes más pequeños que se utilizarán solo cuando sean necesarios. Esta descentralización nos ofrece un gran número de ventajas que veremos más adelante.

Podman: ¿Pods o Contenedores?

Podman tiene un nombre muy descriptivo, y sí, cuando hablamos de Pods nos referimos a esas mismas unidades que usamos en el mundo de Kubernetes.

Podman es capaz de ejecutar contenedores exactamente de la misma forma en que lo hace Docker, pero también es capaz de ejecutar Pods.

Para los que no estén familiarizados con el mundo de Kubernetes pronto tendremos un artículo hablando de ello en más profundidad, pero antes podemos aclarar que un Pod es la unidad de medida mínima en Kubernetes. La diferencia fundamental es que un Pod puede contener más de un contenedor. Sobre todo se hace uso de un contenedor principal acompañado de uno o más “side cars containers” corriendo en el mismo Pod que el contenedor principal, para “ayudarlo” con la tarea principal para la que fue diseñado.

Si os suena a magia negra, por ahora quedaos con que un Pod es una unidad en la que puede haber uno o más contenedores; ya profundizaremos más en estos conceptos.

Imaginaos que cada una de las focas del logo de Podman es un contenedor; entonces lo que tenemos es un Pod.


Gestión de imágenes

Podman usa una herramienta basada en scopio para la inspección y gestión de imágenes de tipo OCI.

Con Podman podemos inspeccionar imágenes OCI sin necesidad de descargarlas, y aún mejor, podemos tomar elementos de un repositorio y moverlo a otro directamente sin que esta imagen pase por nuestro dispositivo; no tendríamos que descargar la imagen para poder inspeccionar o usar sus componentes.

Aunque Podman es capaz de construir imágenes de forma muy similar a Docker con el comando Podman build, el equipo de Redhat también nos ofrece otra herramienta llamada buildah.




Buildah es una herramienta para gestión de imágenes que está muy ligada al uso de Podman. Entre sus características nos permite manipular una imagen o un contenedor corriendo para crear nuevas imágenes, montar el directorio raíz de un contenedor para su manipulación o crear nuevas imágenes en formato tradicional o OCI. Si quieres saber un poco más sobre Buildah aquí os dejamos el enlace a su repositorio oficial.

Podman es rootless (seguridad en Podman)

Gracias a la arquitectura modular de Podman, no es necesario correr nuestros contenedores como root. Esto es una gran ventaja, ya que podemos ejecutar nuestros contenedores con diferentes usuarios que tengan diferentes privilegios y sin riesgo de que alguien tenga acceso al servicio de contenedores y pueda ejecutar contenedores como usuario root, y haga estragos en nuestros servidores.

Lo que Podman hace cuando se ejecuta como un usuario non-root es crear un directorio en el directorio home del usuario y almacenar allí toda la información de las imágenes y contenedores que tiene este usuario. Por lo que, si por ejemplo hacemos un podman images con nuestro usuario non-root, mostrará solo las imágenes que este usuario ha creado o descargado.

Otra ventaja de Podman es que es capaz de usar separación de UIDs utilizando namespaces, lo cual nos da una capa extra de aislamiento a la hora de correr nuestros contenedores.

En cuanto a seguridad, la infiltración en el servicio de Docker es incluso más peligrosa que obtener privilegios root (sudo).

Cuando obtenemos permisos de administración (sudo) y hacemos algo en el sistema, siempre se registra en el log de auditoría del sistema, siempre deja rastros que seguir. Pero si accedemos al servicio de Docker y lo hacemos desde un contenedor que obtenga privilegios y nos deshacemos de este contenedor, es prácticamente imposible saber lo que hemos hecho; no se guarda en ningún log ni queda ningún registro de nuestros actos. Lo cual presenta a Podman como una herramienta más segura.

Integración con Systemd

Podman nos permite correr contenedores que tengan habilitado Systemd por defecto, sin ninguna modificación.

Soporta activación de socket, por lo que podemos utilizar systemd para configurar un socket y tener acceso a una API remota a través de la cual comunicarnos con Podman. Se han desarrollado una serie de librerías Python para poder implementar integraciones y comunicarnos con la API remota de Podman.

De hecho, ya hay una aplicación llamada Pypodman desarrollada en Python, que es capaz de ejecutar todo lo que ejecuta Podman localmente, pero de forma remota, comunicándose con la API remota, lo cual abre un mundo de posibilidades.

Conclusiones

No hay una conclusión clara sobre si Podman es un reemplazo a Docker o si conseguirá destronar al rey de los contenedores.

Docker tiene ventajas contra Podman; en primer lugar la distribución y aceptación que tiene, o herramientas como Docker swarm, docker-compose, etc. Ahora mismo, si queremos orquestar contenedores en Podman, nuestra alternativa es usar Kubernetes o, como preferiría RedHat, usar Openshift usando cri-o que es el runtime que utiliza Podman.

Lo que sí sabemos es que RedHat está apostando con fuerza en el mundo de los contenedores, desde la adquisición de CoreOS para su uso en la plataforma Openshift, hasta el desarrollo de Podman, que actualmente es el motor de contenedores por defecto en RedHat 8 y CentOS 8.


Instalar Podman en Linux

Podman es un software para ejecutar contenedores de Linux. En las distribuciones de Linux como CentOS, Ubuntu o Debian se instala de forma rápida y sencilla. En la mayoría de los casos, los paquetes de instalación pueden encontrarse directamente en la gestión de paquetes del respectivo software e instalarse usando los comandos de terminal típicos del sistema.

Debian, Ubuntu, Raspbian

sudo apt-get update -qq 
sudo apt-get -qq -y install podman

Fedora, CentOS, Amazon Linux 2, RHEL 7

sudo yum -y install podman

OpenSUSE

sudo zipper install podman

Iniciar servicio podman

sudo systemctl start podman.socket

Verificar si funciona:

$ sudo curl -H "Content-Type: application/json" --unix-socket /var/run/docker.sock http://localhost/_ping

 Tienes ejemplos de contenedores con docker-compose en:

Simplemente tienes que clonar el contenedor

git clone https://github.com/docker/awesome-compose/tree/master/wordpress-mysql

Entrar al directorio:

cd wordpress-mysql

Editar fichero configuración

nano docker-compose.yaml

E inicia el contenedor con:

sudo docker-compose up -d


Para pararlo:

sudo docker-compose down 

¿Cómo funciona la gestión de imágenes de contenedor con Podman?

En lo que respecta a las características y la sintaxis, Podman se basa en Docker. Por eso, al configurar el contenedor deseado puedes acceder a la gran biblioteca de imágenes de Docker listas para su uso, que también se conoce como Docker Hub. Con la ayuda del comando pull podrás descargar las imágenes de las aplicaciones que desees como, por ejemplo, la última versión de Ubuntu:

podman pull hub.docker.com/_/ubuntu:latest

La ruta oficial de almacenamiento de cada una de las imágenes es la ruta de acceso local /.local/share/containers/, en la que cada usuario tiene su propio espacio de nombre. Así, la configuración del contenedor propio, por ejemplo, está separada de la configuración root. Con el siguiente comando conseguirás una vista general de las imágenes guardadas en el disco duro local:

podman images

Si lo que deseas es una lista de las imágenes root, deberás escribir el típico comando de Linux sudo:

sudo podman images 


Podman y Máquinas Virtuales (VM) + Contenedores

Podman también la opción de emular una máquina virtual Fedora CoreOS con qmeu

Básicamente descarga la versión más nueva de Fedora (34) y la ejecuta, nos podemos conectar vía SSH. También permite utilizar docker-compose y de momento no tiene interfaz gráfica, pero puedes usar CockPit.

$ podman machine init

 O ponerle un nombre mejor:

podman machine init mivm

Iniciar la VM

podman machine start

Ver las máquinas virtuales.

# List machines

$ podman machine list

Parar una VM

# Stop machine

$ podman machine stop

Quitar una:

# Remove machine

$ podman machine rm


Entrar vía SSH a una VM

# SSH into machine

$ podman machine ssh

 

Especificar las cpus  y la memoria RAM (en MB) al iniciar la VM

# Start a machine with fixed CPU/Memory resources

$ podman machine start --cpus=2 --memory=2048

Especificar tamaño disco:

$ podman machine init --disk-size 50

Montar volunen:

$ podman machine init -v /Users:/mnt/Users 

ponerle un nombre:

# Start a machine with a fixed name (this way you can have multiple machines)

$ podman machine start MACHINE_NAME

Ficheros de configuración:

  • ~/.config podman machine configuration file
  • ~/.local podman machine disk image
  • ~/.ssh podman machine private and public key

Ejemplos:

Comandos Contenedores


  • podman pull my-image:latest
  • podman run my-image:latest --name my-container
  • podman ps
  • podman rm my-container


Ejemplos:

Descargar una imagen: 

# Download an image
$ podman image pull docker.io/library/httpd
Iniciar un conenedor en una imagen:
# Start a container from the image
$ podman container run -dt docker.io/library/httpd 
Ejecutar nginx (Puerto host 8080 y puerto 80 contenedor)
podman run -dt -p 8080:80 nginx
Ver los contenedores:

# Check running containers
$ podman container ls
Parar contenedor:

# Stop a running container
$ podman container stop CONTAINER_ID

Ver listado contenedores:

# podman ps -a

Ejecutar bash

# podman exec -it ID bash

Ejecutar httpd

podman run -d quay.io/centos7/httpd-24-centos7

 Ver redes:

podman network ls

Por defecto se guardan las imágenes donde diga el fichero de configuración:

/etc/containers/storage.conf 

Pero podemos especificar dónde descargar la imagen con -root:

podman --root /var/lib/mycontainers pull fedora

 Permisos de la carpeta:

$ sudo chmod -R a+rx /var/lib/mycontainers

No hay comentarios:

Publicar un comentario