Podman en Ubuntu: Construcción y ejecución de contenedores con Dockerfile (Guía práctica para principiantes)

目次

1. Introducción

La evolución de la tecnología de contenedores y por qué es importante

En los últimos años, la importancia de la tecnología de contenedores ha aumentado rápidamente en el desarrollo y operaciones de aplicaciones. En particular, la capacidad de garantizar la reproducibilidad alineando los entornos de desarrollo y producción ha recibido un gran apoyo entre los ingenieros.

Docker ha sido durante mucho tiempo la solución dominante en este ámbito, pero en los últimos años, Podman ha surgido como una alternativa potente. Podman ofrece una CLI (interfaz de línea de comandos) casi idéntica a la de Docker, al tiempo que brinda ventajas clave como una arquitectura sin daemon, operación ligera y ejecución sin privilegios de root sin requerir privilegios de administrador.

¿Por qué “Podman + Dockerfile + Ubuntu”?

Este artículo explica las operaciones modernas de contenedores en Linux combinando tres elementos esenciales: Podman, Dockerfile y Ubuntu.

  • Ubuntu es una distribución Linux ampliamente utilizada, adecuada tanto para principiantes como para usuarios avanzados,
  • Dockerfile sirve como plano para construir imágenes de contenedores,
  • Y Podman es una herramienta de próxima generación que permite una gestión de contenedores más flexible y segura.

Con la creciente concienciación sobre la seguridad, usar Podman con Dockerfile en Ubuntu se ha convertido en una opción popular tanto para desarrolladores individuales como para entornos empresariales.

Propósito y público objetivo

El objetivo de este artículo es explicar cuidadosamente cómo crear Dockerfiles y generar contenedores prácticos usando Podman en Ubuntu.

Este artículo está dirigido a lectores como:

  • Aquellos con experiencia en Docker que estén interesados en Podman
  • Usuarios de Ubuntu que deseen gestionar contenedores de forma segura
  • Ingenieros que planean adoptar la tecnología de contenedores en su trabajo
  • Principiantes que quieran probar a escribir Dockerfiles y construir imágenes con Podman

Además del uso básico, este artículo también cubre consejos de solución de problemas, diferencias clave con Docker y estrategias de migración.

2. ¿Qué es Podman?

Visión general básica de Podman

Podman (Pod Manager) es una herramienta de gestión de contenedores de próxima generación desarrollada por la comunidad liderada por Red Hat. Al igual que Docker, puede crear, ejecutar y gestionar contenedores compatibles con OCI (Open Container Initiative), pero su filosofía de diseño y arquitectura difieren significativamente.

La característica más notable es que Podman no requiere un daemon. Esto permite una operación ligera y segura. Podman también soporta el modo sin privilegios (rootless), lo que permite a usuarios normales gestionar contenedores sin escalada de privilegios. Su compatibilidad de CLI con Docker es muy alta, lo que hace que la migración sea sencilla.

Características clave de Podman

A continuación se presentan algunas de las principales características de Podman:

Arquitectura sin daemon

Podman no depende de un proceso daemon en segundo plano para gestionar contenedores. Esto permite un uso más eficiente de los recursos sin servicios de fondo innecesarios.

Soporte sin privilegios (usuario no administrador)

Podman permite que usuarios no administradores inicien y gestionen contenedores. Esto mejora enormemente la seguridad en entornos multiusuario o de servidor y reduce significativamente los riesgos de seguridad.

CLI compatible con Docker

Podman utiliza casi la misma estructura de comandos que Docker. Por ejemplo, los siguientes comandos de Docker funcionan casi idénticamente en Podman:

podman build -t myimage .
podman run -it myimage bash

Como resultado, los usuarios de Docker pueden migrar con mínima fricción.

Funcionalidad de Pods

Podman incorpora el concepto de “Pod” de Kubernetes, permitiendo que varios contenedores se gestionen como una única unidad lógica. Esto hace que Podman sea altamente compatible con Kubernetes y permite transiciones fluidas del desarrollo local a entornos en la nube.

Compatibilidad con Ubuntu

Aunque Podman es ampliamente adoptado en Fedora y distribuciones basadas en RHEL, también se ejecuta de manera estable en Ubuntu. Se puede instalar desde repositorios oficiales con una configuración relativamente simple. Desde Ubuntu 20.04 LTS, el soporte de paquetes ha mejorado significativamente, reduciendo la barrera de entrada.

3. Instalando Podman en Ubuntu

Antes de Comenzar: Requisitos Previos

Antes de instalar Podman en Ubuntu, primero verifica la versión de tu Ubuntu. Podman se recomienda oficialmente para Ubuntu 20.04 LTS o posterior. En versiones anteriores, los paquetes requeridos podrían no estar disponibles en los repositorios oficiales.

Puedes verificar la versión de Ubuntu usando el siguiente comando:

lsb_release -a

La instalación de Podman requiere privilegios de sudo. Incluso si planeas usar Podman en modo sin root, se requieren privilegios de administrador durante la instalación.

Instalando Podman desde el Repositorio Oficial de Ubuntu

En versiones recientes de Ubuntu como 20.04 o 22.04, Podman se puede instalar fácilmente usando APT.

sudo apt update
sudo apt install -y podman

Después de la instalación, verifica que Podman se instaló correctamente comprobando la versión:

podman --version

Instalando la Versión Más Reciente Usando el PPA Oficial

La versión de Podman incluida en el repositorio predeterminado de Ubuntu a menudo está ligeramente desactualizada. Si deseas usar las características más recientes, puedes instalar Podman desde el PPA oficial.

. /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 update
sudo apt install -y podman

Este método te permite usar las versiones más recientes de Podman equivalentes a las de los sistemas Red Hat y Fedora.

Prueba de Funcionalidad Básica de Podman

Después de la instalación, realiza una prueba simple para confirmar que Podman funciona correctamente:

podman info

Este comando muestra la configuración de Podman, la versión y las características compatibles como el modo sin root.

También puedes probar la ejecución de contenedores ejecutando una imagen oficial de Alpine Linux:

podman run --rm -it alpine sh

Si el shell se inicia exitosamente, Podman está funcionando correctamente.

4. Conceptos Básicos de Dockerfile y Uso con Podman

¿Qué es un Dockerfile?

Un Dockerfile es un plano utilizado para construir imágenes de contenedores. Es un archivo de texto que define instrucciones como la imagen base a usar, qué paquetes instalar y qué archivos copiar.

Basado en este archivo, herramientas de contenedores como Podman y Docker pueden construir automáticamente un entorno consistente.

Instrucciones comunes de Dockerfile incluyen:

FROM ubuntu:22.04
RUN apt update && apt install -y curl
COPY ./app.sh /usr/local/bin/app.sh
CMD ["bash", "/usr/local/bin/app.sh"]

Este ejemplo instala paquetes en una imagen base de Ubuntu, copia un script y define el comando de ejecución predeterminado.

Usando Dockerfile con Podman

Podman puede construir imágenes de contenedores a partir de Dockerfiles de la misma manera que Docker.

1. Preparando el Directorio del Proyecto

Crea la siguiente estructura de directorio:

project/
├── Dockerfile
└── app.sh

El archivo app.sh puede contener un script simple:

#!/bin/bash
echo "Hello from Podman container!"

Haz que el script sea ejecutable:

chmod +x app.sh

2. Construyendo la Imagen con Podman

Ejecuta el siguiente comando en el directorio que contiene el Dockerfile:

podman build -t mypodmanapp .

Esto crea una imagen de contenedor nombrada mypodmanapp.

3. Verificando la Imagen Construida

Puedes listar las imágenes disponibles con:

podman images

4. Ejecutando el Contenedor

Inicia un contenedor usando la imagen construida:

podman run --rm mypodmanapp

Si se configura correctamente, se mostrará la salida Hello from Podman container!.

Dockerfile vs Containerfile

En Podman, los archivos que utilizan la sintaxis de Dockerfile también pueden llamarse Containerfile. Esta denominación refleja un deseo de terminología independiente de Docker.

No hay diferencia funcional entre Dockerfile y Containerfile. Ambos son completamente compatibles con Podman.

podman build -f Containerfile -t myimage .

Puedes especificar el nombre del archivo explícitamente usando la opción -f.

5. Ejemplo Práctico: Creando un Contenedor Basado en Ubuntu

Creando un Dockerfile Basado en Ubuntu

A partir de aquí, recorreremos un ejemplo práctico, paso a paso, de crear un Dockerfile basado en Ubuntu y construir y ejecutar una imagen de contenedor usando Podman.

Primero, crea el siguiente Dockerfile simple:

FROM ubuntu:22.04

RUN apt update && \
    apt install -y curl && \
    apt clean

COPY hello.sh /usr/local/bin/hello.sh
RUN chmod +x /usr/local/bin/hello.sh

CMD ["/usr/local/bin/hello.sh"]

Este Dockerfile realiza las siguientes acciones:

  • Usa la imagen oficial de Ubuntu 22.04 como base
  • Instala el paquete curl
  • Copia hello.sh del host al contenedor
  • Establece hello.sh como el script de ejecución predeterminado

Siguiente, crea un script de shell simple llamado hello.sh:

#!/bin/bash
echo "Hello, this output is from a Podman container!"

Otorga permisos de ejecución al script:

chmod +x hello.sh

Construyendo la Imagen con Podman

Una vez que los archivos estén listos, construye la imagen usando el siguiente comando:

podman build -t ubuntu-hello .

La opción -t ubuntu-hello asigna un nombre de etiqueta a la imagen, y el . final especifica el directorio que contiene el Dockerfile.

Si la construcción se completa exitosamente, la imagen se almacenará localmente.

podman images

Puedes usar este comando para verificar que la imagen fue creada.

Ejecutando y Verificando la Imagen Construida

Ejecuta un contenedor desde la imagen recién construida usando el siguiente comando:

podman run --rm ubuntu-hello

Salida de ejemplo:

Hello, this output is from a Podman container!

La opción --rm elimina automáticamente el contenedor después de la ejecución, lo que la hace ideal para fines de prueba.

Opcional: Ejecutando un Contenedor Interactivo

Si deseas interactuar directamente con el contenedor, puedes iniciarlo con la opción -it y lanzar Bash:

podman run -it ubuntu-hello bash

Esto te permite usar el contenedor como un entorno de desarrollo ligero basado en Ubuntu.

6. Características y Consejos Útiles de Podman

Fortalezas de Podman: Flexibilidad y Seguridad

Mientras mantiene la compatibilidad con Docker, Podman ofrece características que permiten operaciones de contenedor más flexibles y seguras. Esta sección introduce características prácticas y consejos que son especialmente útiles en flujos de trabajo diarios.

Operación Segura con Modo Sin Root

Una de las características más poderosas de Podman es el modo sin root, que permite a usuarios regulares iniciar, detener y gestionar contenedores sin privilegios de administrador.

Puedes ejecutar contenedores sin sudo como se muestra a continuación:

podman run -it ubuntu bash

Debido a que esta operación está confinada al directorio home del usuario, se minimiza el impacto a nivel del sistema. El modo sin root es particularmente útil en servidores compartidos y entornos de desarrollo.

Inicio Automático con Integración de systemd

Podman soporta integración nativa con systemd, permitiendo que los contenedores se ejecuten automáticamente como servicios de Linux.

Puedes generar una unidad de servicio systemd para un contenedor usando el siguiente comando:

podman generate systemd --name mycontainer --files --restart-policy=always

Este comando crea archivos de unidad bajo ~/.config/systemd/user/. Después de la generación, habilita y inicia el servicio de la siguiente manera:

systemctl --user daemon-reexec
systemctl --user enable --now container-mycontainer.service

Esta configuración asegura que los contenedores se inicien automáticamente al arrancar el sistema.

Gestión de Múltiples Contenedores con podman-compose

Además de gestionar contenedores individuales, Podman soporta orquestación de múltiples contenedores. Al usar podman-compose, puedes lograr una funcionalidad similar a Docker Compose.

Instala podman-compose usando pip:

pip install podman-compose

Dado que es en gran medida compatible con archivos docker-compose.yml, a menudo puedes reutilizar configuraciones existentes.

Iniciar servicios es tan simple como ejecutar:

podman-compose up -d

Esto te permite reproducir entornos de desarrollo completos de manera instantánea incluso al usar Podman.

Comandos y Consejos Adicionales Útiles

Limpieza de Imágenes y Contenedores No Utilizados

podman system prune -a

Este comando elimina contenedores no utilizados, imágenes y archivos temporales, ayudando a mantener tu almacenamiento limpio.

Habilitación de Autocompletado de Comandos (bash/zsh)

Puedes instalar soporte para autocompletado de comandos con el siguiente paquete:

sudo apt install podman-docker

Esto habilita el autocompletado de comandos similar a Docker para Podman, mejorando la productividad.

7. Guía de Migración: De Docker a Podman

Por Qué la Migración a Podman Está Ganando Atención

Docker ha sido sinónimo de tecnología de contenedores durante mucho tiempo, pero en los últimos años, un cambio hacia Podman como una alternativa más ligera y segura ha ganado impulso. En particular, Red Hat Enterprise Linux (RHEL) y Fedora han reducido el soporte para Docker y han adoptado Podman como el motor de contenedores predeterminado, lo que ha impulsado a muchas organizaciones a considerar la migración.

Esta sección explica pasos prácticos y consideraciones importantes para migrar de manera fluida de Docker a Podman.

Compatibilidad de Comandos Entre Docker y Podman

Podman mantiene un alto nivel de compatibilidad de CLI con Docker, lo que permite que la mayoría de los comandos se reemplacen directamente sin modificaciones.

DockerPodman
docker build -t myapp .podman build -t myapp .
docker run -it myapppodman run -it myapp
docker imagespodman images
docker pspodman ps

Esto hace posible cambiar a Podman sin alterar tu flujo de trabajo, lo que es una de sus mayores ventajas.

Logrando Compatibilidad Total con podman-docker

Si los scripts existentes, pipelines de CI/CD o herramientas asumen la presencia del comando docker, puedes instalar el paquete podman-docker para que Podman actúe como un reemplazo directo.

sudo apt install podman-docker

Después de la instalación, el comando docker se convierte en un enlace simbólico a Podman:

which docker
# → /usr/bin/docker → symbolic link to podman

Esto permite que los scripts basados en Docker existentes se ejecuten en Podman sin modificaciones.

Reemplazando docker-compose con podman-compose

Para proyectos que usan Docker Compose para definir entornos de múltiples contenedores, podman-compose proporciona una alternativa compatible.

Aunque la compatibilidad es generalmente alta, ten en cuenta las siguientes limitaciones:

  • Algunas opciones de Compose (como depends_on) pueden no ser compatibles o comportarse de manera diferente
  • Pueden existir diferencias en el registro de eventos y el comportamiento de las verificaciones de salud

Para configuraciones típicas como una combinación de servidor web y base de datos, la migración suele ser directa.

Migración de Imágenes y Volúmenes

Las imágenes de Docker almacenadas localmente no pueden ser accedidas directamente por Podman. Debes volver a descargarlas o exportarlas e importarlas.

Opción 1: Volver a Descargar Imágenes con Podman

podman pull ubuntu:22.04

Opción 2: Exportar desde Docker e Importar en Podman

# Export from Docker
docker save myimage > myimage.tar

# Import into Podman
podman load < myimage.tar

Esto permite reutilizar imágenes construidas con Docker en Podman.

Consideraciones Adicionales para la Migración

  • Diferencias en la operación sin root: Docker típicamente asume el uso de root, mientras que Podman está diseñado para operación sin root
  • Arquitectura de daemon: Podman es sin daemon, lo que cambia la forma en que se gestionan los procesos en segundo plano
  • Ubicaciones de almacenamiento de registros y datos difieren y deben revisarse durante la migración

8. Preguntas Frecuentes (FAQ)

P1. ¿Cuál es la diferencia principal entre Podman y Docker?

R1. La diferencia más significativa es que Podman funciona sin un daemon. Esto permite una operación más ligera y segura. Podman también admite el modo sin privilegios (rootless), lo que permite gestionar contenedores sin escalado de privilegios. La compatibilidad de la CLI con Docker es muy alta.

P2. ¿Cuál es la diferencia entre Dockerfile y Containerfile?

R2. No hay ninguna diferencia funcional. Ambos archivos describen instrucciones de construcción de contenedores usando una sintaxis idéntica.
El nombre Containerfile se prefiere en proyectos compatibles con OCI para evitar la terminología específica de Docker. En la práctica, Dockerfile funciona perfectamente con Podman.

P3. ¿Se puede usar Docker Compose con Podman?

R3. Docker Compose no es compatible directamente, pero puedes usar podman-compose como alternativa. Interpreta archivos docker-compose.yml en un entorno Podman.

Algunas opciones como depends_on son limitadas, por lo que se recomienda probar en configuraciones complejas.

P4. ¿Podman funciona de forma estable en Ubuntu?

R4. Sí. Podman funciona de forma estable en Ubuntu 20.04 LTS y versiones posteriores. Está disponible en los repositorios oficiales de Ubuntu y puede instalarse fácilmente usando apt. Para versiones más recientes, también es una opción usar un PPA.

P5. ¿Existen limitaciones al usar el modo sin privilegios?

R5. El modo sin privilegios restringe ciertas operaciones privilegiadas y la vinculación a puertos por debajo del 1024. Sin embargo, estas limitaciones a menudo pueden sortearse mediante reenvío de puertos. Para la mayoría de los casos de uso, el modo sin privilegios es totalmente práctico.

P6. ¿Puede Podman extraer las mismas imágenes que Docker Hub?

R6. Sí. Podman puede extraer imágenes de Docker Hub por defecto. En algunos entornos, puede ser necesario especificar explícitamente el registro y el espacio de nombres:

podman pull docker.io/library/ubuntu

Podman también admite otros registros como Quay.io y GitHub Container Registry.

P7. ¿Es Podman adecuado para entornos de producción?

R7. Sí. Podman incluye características requeridas para uso en producción, como conceptos de pods compatibles con Kubernetes e integración con systemd. En entornos sensibles a la seguridad, Podman puede ser una mejor opción que Docker.

Podman ya es el motor de contenedores predeterminado en RHEL y Fedora y tiene una amplia adopción en producción.

侍エンジニア塾