Gestión de imágenes con Podman

Las imágenes son la base de cualquier contenedor. Podman trabaja con el estándar OCI (Open Container Initiative), lo que significa que puedes usar imágenes de Docker Hub, Quay.io, registros privados y cualquier registro compatible. Veamos los comandos esenciales para gestionarlas.

Buscar, descargar y listar imágenes

# Buscar imágenes en un registro (por defecto Docker Hub)
podman search nginx
podman search --limit 10 alpine

# Descargar una imagen sin ejecutarla
podman pull nginx:alpine
podman pull docker.io/library/ubuntu:22.04
podman pull quay.io/podman/hello

# Listar imágenes descargadas localmente
podman images

# Ver información detallada de una imagen
podman inspect nginx:alpine

# Eliminar una imagen
podman rmi nginx:alpine

# Eliminar todas las imágenes no utilizadas
podman image prune -a

A diferencia de Docker, Podman no requiere un daemon que gestione las descargas. podman pull descarga la imagen directamente en el almacenamiento local del usuario, respetando el aislamiento rootless. Esto significa que dos usuarios en el mismo sistema pueden tener sus propias copias de la misma imagen, sin interferencias.

Volúmenes: datos persistentes fuera del contenedor

Los contenedores son efímeros; al eliminarlos se pierde toda la información escrita en su sistema de archivos. Para datos persistentes se usan volúmenes o bind mounts. Podman gestiona volúmenes de forma nativa.

# Crear un volumen
podman volume create datos-web

# Listar volúmenes
podman volume ls

# Inspeccionar un volumen (ubicación real en el disco)
podman volume inspect datos-web

# Montar el volumen en un contenedor
podman run -d --name web-con-volumen -v datos-web:/usr/share/nginx/html:Z -p 8081:80 nginx:alpine

# Escribir datos en el volumen desde el host
echo "<h1>Hola desde Podman volumen</h1>" > $(podman volume inspect datos-web --format '{{.Mountpoint}}')/index.html

# Eliminar un volumen (no debe estar en uso)
podman volume rm datos-web

# Eliminar todos los volúmenes no usados
podman volume prune

La opción :Z en el montaje es importante en sistemas con SELinux (Fedora, RHEL, CentOS): reetiqueta el volumen para que el contenedor pueda acceder a él. En Debian/Ubuntu sin SELinux no es estrictamente necesaria, pero es buena práctica incluirla para portabilidad.

Redes: conectar contenedores entre sí

Podman permite crear redes virtuales para que los contenedores se comuniquen entre sí de forma aislada. Por defecto, Podman usa slirp4netns para rootless, pero al crear una red personalizada se usa pasta (más rápido y estable).

# Crear una red personalizada
podman network create mi-red

# Listar redes disponibles
podman network ls

# Inspeccionar configuración de la red
podman network inspect mi-red

# Conectar un contenedor a la red al crearlo
podman run -d --name app1 --network mi-red alpine sleep 3600

# Conectar un contenedor existente a la red
podman network connect mi-red app2

# Desconectar un contenedor de la red
podman network disconnect mi-red app1

# Eliminar una red (sin contenedores conectados)
podman network rm mi-red

# Eliminar todas las redes no usadas
podman network prune

Los contenedores dentro de la misma red pueden resolverse por nombre. Por ejemplo, si tienes app1 y app2 en mi-red, desde app1 puedes hacer ping a app2 directamente. Esto es ideal para aplicaciones multicontenedor como una base de datos y un servidor web.

Ejemplo práctico: WordPress con MySQL

Armemos un ejemplo completo usando volúmenes y redes para WordPress + MySQL:

# Crear red y volúmenes
podman network create wp-net
podman volume create wp-db-data
podman volume create wp-files

# Ejecutar MySQL
podman run -d --name wp-db \
  --network wp-net \
  -v wp-db-data:/var/lib/mysql:Z \
  -e MYSQL_ROOT_PASSWORD=secreta \
  -e MYSQL_DATABASE=wordpress \
  -e MYSQL_USER=wpuser \
  -e MYSQL_PASSWORD=wppass \
  docker.io/library/mysql:8.0

# Ejecutar WordPress
podman run -d --name wp-app \
  --network wp-net \
  -v wp-files:/var/www/html:Z \
  -p 8082:80 \
  -e WORDPRESS_DB_HOST=wp-db \
  -e WORDPRESS_DB_USER=wpuser \
  -e WORDPRESS_DB_PASSWORD=wppass \
  -e WORDPRESS_DB_NAME=wordpress \
  docker.io/library/wordpress:latest

# Verificar que ambos están corriendo
podman ps

# Probar acceso a WordPress
curl http://localhost:8082

Este patrón de red + volúmenes es el que luego se traduce fácilmente a Kubernetes usando pods nativos de Podman. De hecho, Podman permite exportar el pod completo como un manifiesto YAML de Kubernetes con podman generate kube.

Resumen

  • Imágenes: pull, search, images, rmi, prune — gestión completa del almacenamiento local.
  • Volúmenes: volume create, ls, rm, prune — datos persistentes fuera del contenedor.
  • Redes: network create, ls, connect, disconnect, rm — comunicación aislada entre contenedores.
  • Ejemplo real: WordPress + MySQL en dos contenedores, conectados por red y con datos persistentes en volúmenes separados.

Con estos conceptos ya puedes montar entornos multicontenedor completos con Podman. En artículos futuros exploraremos Podman Compose, pods nativos y la integración con systemd para servicios persistentes.