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
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 -qqsudo 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:
git clone https://github.com/docker/awesome-compose/tree/master/wordpress-mysql
cd wordpress-mysql
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 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
Descargar una imagen:
# Download an image$ podman image pull docker.io/library/httpd
# Start a container from the image$ podman container run -dt docker.io/library/httpd
podman run -dt -p 8080:80 nginx
# Check running containers$ podman container ls
# 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
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