Logotipo de Bitdoze

Podman vs Docker: ¿qué herramienta de contenedores elegir en 2026-2027?

Podman vs Docker 2026: seguridad, diseño rootless, precios y licencias, rendimiento y soporte de IA. Elige el motor de contenedores adecuado para tu stack hoy.

Dragos

Actualizado Publicado 41 min de lectura

Podman vs Docker: ¿qué herramienta de contenedores elegir en 2026-2027?

Podman vs Docker es la decisión de contenedores a la que se enfrentan la mayoría de quienes autoalojan en 2026. Ambos ejecutan imágenes OCI, pero difieren en arquitectura, seguridad y ahora también en coste. Podman 6 (junio de 2026) abandonó las pilas de red heredadas e hizo del modo rootless el único camino. Docker Engine 29 (noviembre de 2025) convirtió el almacén de imágenes de containerd en el predeterminado para instalaciones nuevas. Esta guía analiza qué ha cambiado, qué significa para tus servidores y cuándo elegir cada uno.

¿Qué son los contenedores?

Los contenedores empaquetan tu aplicación con todo lo que necesita: código, runtime, librerías y configuración. Todo viaja junto y se ejecuta igual donde lo despliegues.

¿Por qué usar contenedores?
  • Consistentes: mismo comportamiento en tu portátil y en producción
  • Rápidos: arrancan en segundos
  • Ligeros: comparten el SO del host, sin necesidad de una VM completa
  • Aislados: las apps no se pisan entre sí
Cómo funcionan

Los contenedores usan el kernel del SO anfitrión pero mantienen todo lo demás separado. Obtienes aislamiento sin la sobrecarga de ejecutar un sistema operativo completo para cada aplicación.

Contenedores frente a VM
  • VM: SO completo por instancia, pesadas, lentas de arrancar
  • Contenedores: SO compartido, ligeros, arranque rápido

Podman vs Docker en 2026: qué ha cambiado

Estado de las herramientas (ago 2026)

Podman 6.0 (24 de junio de 2026): versión mayor. BoltDB eliminado (solo SQLite), slirp4netns eliminado (pasta por defecto), CNI eliminado (solo Netavark), cgroups v1 eliminado, iptables eliminado, soporte para Mac Intel y Windows 10 retirado. Podman es ahora un proyecto CNCF Sandbox. Última versión: 6.1.0 (ago 2026).

Docker Engine 29 (10 de noviembre de 2025): el almacén de imágenes de containerd es el predeterminado en instalaciones nuevas, backend nftables experimental, cgroup v1 obsoleto, Docker Content Trust eliminado de la CLI. Último parche: 29.7.2 (5 de agosto de 2026). Docker Desktop ~4.86.

Cambio clave: ambas herramientas convergen en cgroups v2, nftables y redes rootless. La brecha entre ellas es más estrecha que nunca, pero los modelos de licencias y seguridad siguen divergiendo.

Ambas herramientas se mantienen activamente y publican versiones con regularidad. Los mayores cambios desde mediados de 2025:

  • La gobernanza CNCF de Podman: Red Hat donó Podman Container Tools y Podman Desktop al CNCF Sandbox en enero de 2025 (anunciado en KubeCon NA 2024). La organización de GitHub es ahora podman-container-tools. Esto importa para la neutralidad a largo plazo. Podman ya no es solo un proyecto de Red Hat. El repositorio tiene ~32,7k estrellas en GitHub.
  • El almacén de imágenes containerd de Docker: Engine 29 lo convirtió en el predeterminado en instalaciones nuevas. Usa el modelo de snapshots de containerd en lugar del driver de grafo heredado. Las instalaciones actualizadas conservan el driver heredado a menos que lo actives. La contrapartida: mejor compatibilidad con ecosistemas basados en containerd, pero potencialmente más uso de disco que overlay2 para conjuntos de imágenes idénticos. Moby (el proyecto upstream) tiene ~72k estrellas en GitHub.
  • Las redes rootless maduraron: Podman eliminó slirp4netns por completo en 6.0 (pasta es el predeterminado, ofreciendo ~8-10 Gbps frente a los ~570 Mbps de slirp4netns). Docker Engine 29.5.0 convirtió gvisor-tap-vsock en el driver de red rootless predeterminado. El viejo peaje de «rootless es lento» ha desaparecido en gran parte.
  • cgroups v1 en vías de extinción: Podman 6 eliminó el soporte de cgroups v1 por completo. Docker Engine 29 lo marcó como obsoleto (soporte al menos hasta mayo de 2029). Si aún ejecutas cgroups v1, es hora de planificar la migración.
  • Docker Content Trust eliminado de la CLI: Engine 29 quitó las banderas content-trust de la CLI. La firma de imágenes se gestiona ahora mediante otros mecanismos (atestaciones de BuildKit).

Docker vs Podman: diferencias de arquitectura

Esta es la diferencia fundamental entre las dos herramientas.

Docker: cliente-servidor
  • Cliente: escribes comandos docker
  • Servidor: el daemon se ejecuta en segundo plano como root (por defecto)
  • Cómo funciona: el cliente le pide al daemon que lo haga todo

Bien: centralizado, gestiona múltiples clientes, ecosistema maduro Mal: siempre consume recursos, necesita root por defecto, punto único de fallo

Podman: ejecución directa
  • Sin daemon: los comandos se ejecutan directamente mediante fork-exec
  • Por comando: cada invocación de podman es su propio proceso
  • Resultado: nada persistente en ejecución cuando no lo estás usando

Bien: cero recursos en reposo, sin punto único de fallo, rootless por defecto Mal: algunas funciones de Docker funcionan diferente, ecosistema más pequeño

Uso de recursos

Cuándo Docker Podman
En reposo ~50-100+ MB (daemon) ~0 MB (sin daemon persistente)
En ejecución Daemon + contenedores Contenedores + procesos conmon/pause de corta duración
CPU Siempre algo de base Solo cuando hay comandos activos

Las cifras anteriores son aproximaciones. La sobrecarga del daemon de Docker se amortiza entre muchos contenedores en un servidor ocupado. Si ejecutas 50 contenedores, el coste del daemon es ruido. En un portátil o un VPS pequeño con dos o tres contenedores, el modelo de cero consumo en reposo de Podman ahorra memoria real.

Por qué importa la arquitectura más allá de los recursos

La distinción daemon frente a sin daemon no es solo cuestión de memoria. Afecta a:

  • Comportamiento de arranque: el daemon de Docker debe estar en ejecución antes de que funcione cualquier comando de contenedor. Si el daemon se cae, toda la gestión de contenedores se detiene. Los comandos de Podman son independientes; que uno falle no afecta a los demás.
  • Actualizaciones del sistema: actualizar Docker requiere reiniciar el daemon, lo que interrumpe brevemente toda la gestión de contenedores. Las actualizaciones de Podman son simples reemplazos de binarios. No hace falta reiniciar ningún servicio.
  • Acceso root: el daemon de Docker necesita root por defecto. Esto significa que cualquier usuario que pueda ejecutar comandos docker tiene efectivamente root en el host (a través del socket). El modelo rootless de Podman hace que gestionar contenedores no requiera root en absoluto.

Seguridad: contenedores rootless y superficie de ataque

Podman gana en seguridad por defecto. Te explicamos por qué, y dónde ha remontado Docker.

El problema central es la arquitectura de daemon de Docker. El proceso dockerd se ejecuta como root por defecto y escucha en un socket Unix (/var/run/docker.sock). Cualquier proceso que pueda acceder a ese socket tiene control efectivo de root sobre el host. Por eso las guías de seguridad te dicen que nunca montes el socket de Docker dentro de contenedores. Es equivalente a darle root del host al contenedor.

Podman no tiene daemon. Cada comando podman es un proceso independiente que hace fork, ejecuta el contenedor y termina. No hay ningún proceso root persistente al que atacar.

Docker

Configuración por defecto:

  • El daemon se ejecuta como root
  • Comprometer el daemon es comprometer el sistema
  • docker cp ha tenido históricamente bugs de escape al host

Existe el modo rootless (desde Engine 20.10):

  • No es el predeterminado en servidores Linux
  • Requiere configuración extra (uidmap, slirp4netns/pasta)
  • Engine 29.5.0 convirtió gvisor-tap-vsock en el driver de red rootless predeterminado, una mejora real
  • Algunas funciones siguen limitadas en rootless (Swarm, ciertos modos de red)

Podman

Rootless por defecto:

  • Ejecuta contenedores como usuario normal desde el primer momento
  • Sin proceso root persistente que explotar
  • Mapeo de espacios de nombres de usuario: el root del contenedor se mapea a tu usuario normal

Ventaja de arquitectura:

  • Sin daemon = sin objetivo root siempre activo
  • Cada comando está aislado. Un contenedor comprometido no te entrega el daemon

Conclusión sobre seguridad

Podman es más seguro por defecto. Docker se puede reforzar con el modo rootless, pero requiere configuración extra y tiene contrapartidas. Para un operador en solitario en un VPS Linux, el modelo rootless por defecto de Podman es una cosa menos que configurar correctamente.

Si ejecutas contenedores con usuarios no root dentro del contenedor (como deberías), consulta nuestra guía para añadir usuarios a contenedores Docker.

Ejemplos modernos de CVE

El viejo ejemplo de referencia era CVE-2019-5736 (escape de contenedor runc). Sigue siendo historia relevante, pero 2025-2026 produjo mejores ejemplos:

Ambas herramientas comparten runc

La familia de escapes por escritura en /proc de runc de 2025 (CVE-2025-31133, CVE-2025-52565, CVE-2025-52881) afectó tanto a Docker como a Podman. Comparten el runtime runc. Corregido en Docker Engine 28.5.2 y Podman 5.7.0. La conclusión: cuando un componente de runtime compartido tiene una vulnerabilidad, la arquitectura (daemon root frente a rootless) determina el radio de impacto.

Problemas de Docker específicos de 2026: bugs de escape de docker cp (CVE-2026-41567/41568/42306, ejecución de código como root en el host mediante descompresión de archivos), problema de seccomp AF_ALG (CVE-2026-31431) y una serie de CVE de Docker Desktop que incluyen vulnerabilidades de Model Runner (CVE-2026-28400, CVE-2026-33990, CVE-2026-5817/5843).

Problemas de Podman específicos de 2026: CVE-2026-57231 de fuga de entorno (entradas Env malformadas filtran variables del host), escape de ADD/COPY en builds CVE-2026-44517 y el bug de truncado de Quadlet CVE-2026-19730 (corregido en 6.1.0).

Ambas herramientas tienen CVE. La diferencia: la arquitectura sin daemon y rootless por defecto de Podman limita lo que un atacante puede alcanzar. Un escape de contenedor en Podman te deja en un espacio de nombres de usuario, no como root en el host.

Qué significa esto en la práctica

Para un operador en solitario que ejecuta contenedores en un VPS, el modelo de seguridad importa más que cualquier CVE individual. Los CVE se parchean. La arquitectura permanece.

Con la configuración por defecto de Docker, un escape de contenedor le da al atacante root en el host porque el daemon se ejecuta como root. Con el modelo rootless de Podman, un escape de contenedor le da al atacante acceso a un espacio de nombres de usuario. Sigue siendo malo, pero significativamente menos malo que root en el host.

El modo rootless de Docker cierra esta brecha, pero no es el predeterminado y requiere configuración extra (uidmap, configuración de red, algunas funciones desactivadas). Si estás dispuesto a hacer el trabajo, Docker rootless es una opción real. Si quieres valores seguros por defecto sin configuración, Podman es la respuesta.

Rendimiento: qué dicen realmente los benchmarks

Comprobación de la realidad

No existe un benchmark único y autorizado para Docker frente a Podman en 2026. Las pruebas de la comunidad muestran que las diferencias son pequeñas a escala de un solo contenedor. Elige en función de seguridad, funciones y coste, no por diferencias de tiempo de arranque que no vas a notar.

Esto es lo que sabemos realmente:

Métrica Docker Podman Notas
Arranque ~1-1,5 s ~0,8-1 s Podman gana por poco; la diferencia es insignificante para servicios de larga duración
Velocidad de build Rápida (BuildKit) Comparable (Buildah) Ambos soportan multi-etapa y caché
Memoria en reposo ~50-100+ MB (daemon) ~0 MB (sin daemon) Importa en un VPS pequeño, no en servidores ocupados
Redes rootless ~5-8 Gbps (gvisor-tap-vsock) ~8-10 Gbps (pasta) Ambos muy por delante del viejo slirp4netns (~570 Mbps)
Uso de disco Mayor con el almacén de imágenes containerd (predeterminado en Engine 29) Overlay estándar Trampa real en discos pequeños

Las cifras de redes rootless son estimaciones de pruebas de la comunidad (sanj.dev, junio de 2026; discusiones en r/podman), no benchmarks de laboratorio. Tus resultados variarán según el hardware y la carga de trabajo.

El único punto de rendimiento que realmente importa a los operadores: el almacén de imágenes containerd de Docker Engine 29 puede usar más disco que overlay2 para las mismas imágenes. En un disco raíz de VPS de 40 GB, es algo a vigilar.

Velocidad de build

Ambas herramientas construyen imágenes lo bastante rápido como para que no notes la diferencia en el trabajo diario. Docker usa BuildKit (integrado en el daemon desde Engine 23). Podman usa Buildah (independiente, sin daemon). Ambos soportan builds multi-etapa, caché de capas y etapas de build paralelas.

Dónde importa la velocidad de build: pipelines de CI que construyen imágenes grandes con muchas capas. En la práctica, el cuello de botella suele ser la E/S de red (descargar imágenes base) o el tiempo de compilación, no la herramienta de build de contenedores en sí.

Densidad de contenedores

En un servidor ocupado con decenas de contenedores, la sobrecarga del daemon de Docker se amortiza hasta casi cero por contenedor. El modelo por comando de Podman hace que cada contenedor tenga un pequeño proceso conmon, pero son ligeros. A densidad alta de contenedores (más de 50), la diferencia es insignificante. La verdadera limitación es siempre la carga de la aplicación, no el runtime de contenedores.

Coste y licencias: Docker Desktop y Docker Hub

Esta es la sección que la mayoría de los artículos comparativos se saltan, y es la que más importa si pagas por algo. El modelo de licencias es la mayor diferencia entre las dos herramientas desde una perspectiva de negocio: Docker tiene uno, Podman no.

Licencia de Docker Desktop

Docker Desktop es gratis para: uso personal, educación, open source no comercial y pequeñas empresas (menos de 250 empleados Y menos de 10 M$ de ingresos anuales). Si superas cualquiera de los dos umbrales, necesitas una suscripción de pago. Docker Engine y la CLI son Apache-2.0 y siempre gratis: solo necesitas licencia para Desktop (la GUI + gestor de VM).

Precios de Docker (ago 2026)

Plan Precio Pulls de Docker Hub Desktop incluido
Personal 0 $ 200 pulls/6 horas Sí (límites del nivel gratuito)
Pro 9 $/usuario/mes (anual) Ilimitados Sí
Team 15 $/usuario/mes (anual) Ilimitados Sí
Business 24 $/usuario/mes Ilimitados Sí

Pro costaba 5 $ antes de la subida de precios de diciembre de 2024. Team pasó de 9 $ a 15 $. Los precios se mueven: verifica en docker.com/pricing antes de comprometerte.

Límites de pulls de Docker Hub: los cargos por consumo de pulls se cancelaron a partir del 1 de abril de 2025. Los planes de pago tienen pulls ilimitados. El nivel Personal gratuito tiene 200 pulls por 6 horas (la documentación dice esto; la página de precios dice «100 pulls/h»: hay una discrepancia, así que consulta la documentación). Los pulls sin autenticar están limitados a 100 por IPv4 por 6 horas.

Para quienes autoalojan un puñado de contenedores, estos límites rara vez son un problema. Donde se notan: pipelines de CI que descargan imágenes con frecuencia, o equipos que ejecutan muchos servicios que se reinician a menudo. La solución es simple: autentica tus pulls (duplica tu límite) o usa un espejo a través de GHCR o un registro autoalojado.

Docker también ofrece Docker Hardened Images (DHI): imágenes base mínimas con casi cero CVE, SBOM y procedencia SLSA L3. El nivel gratuito es útil para despliegues conscientes de la seguridad; el nivel Select de pago empieza en 5k $/repo (solo empresas).

Podman: totalmente open source (Apache-2.0), proyecto CNCF Sandbox, sin restricciones de licencia. Úsalo como quieras. Sin precios por asiento, sin umbrales de ingresos, sin límites de pulls. Si ejecutas contenedores en un VPS, el único coste es el propio servidor: un hosting VPS asequible como Hetzner u opciones de VPS económicas como Hostinger lo mantienen por debajo de 5 €/mes para una configuración pequeña.

Los precios de los VPS subieron en todo el mercado en 2026: si estás replanteándote un servidor alquilado, mira qué cambió y cuándo gana un mini PC.

  • ¿Ejecutas contenedores en un VPS? El motor siempre es gratis en ambas herramientas. La licencia de Docker Desktop solo importa en estaciones de trabajo.
  • Consejo de CI/CD: autentica tus pulls de Docker Hub en CI (docker login): los límites anónimos son más estrictos. O descarga a través de GHCR o de un registro autoalojado para evitar por completo los límites de Hub.
  • Un hosting VPS económico como Hetzner o Hostinger mantiene bajos tus costes de alojamiento de contenedores: la elección del motor no afectará a tu factura de hosting.

Compose: Docker Compose frente a Podman Compose

Docker Compose es el estándar del sector para definir aplicaciones multi-contenedor. Es maduro, está bien documentado y está en todas partes. Si ejecutas varios servicios que necesitan comunicarse entre sí (app web + base de datos + caché + proxy inverso), Docker Compose es cómo la mayoría define ese stack.

La historia de compose en Podman ha mejorado. podman compose es ahora un wrapper que puede invocar el binario real de docker-compose (si está instalado) o recurrir a podman-compose (una reimplementación en Python). El proyecto podman-compose sigue las funciones de Docker Compose mediante una hoja de compatibilidad: los casos comunes funcionan, los casos límite pueden necesitar ajustes.

El consejo práctico: si estás en un servidor Linux con systemd, plantéate si necesitas compose en absoluto. Quadlet (cubierto en la siguiente sección) te da gestión de contenedores nativa de systemd sin la capa de compose. Para estaciones de trabajo de desarrollo, Docker Compose sigue siendo el camino de menor resistencia.

Docker Compose

  • Maduro, completo, estándar del sector
  • docker compose up -d simplemente funciona con la mayoría de archivos
  • Soporte de gestión de secretos (ver gestión de secretos en Docker Compose)
  • Funciona con Docker Desktop en todas las plataformas

Podman Compose

  • podman compose puede invocar el docker-compose real: lo mejor de ambos mundos
  • podman-compose cubre los casos comunes; los archivos complejos pueden necesitar ajustes
  • En hosts Linux con systemd, Quadlet es la alternativa recomendada (ver siguiente sección)
  • Sin dependencia de daemon: cada invocación de compose es independiente

Compatibilidad de Compose

Si tienes archivos de Docker Compose complejos con contextos de build, múltiples redes o funciones avanzadas, pruébalos con podman compose antes de cambiar. Usar el wrapper con el binario real de docker-compose evita la mayoría de problemas. Para servidores Linux con systemd, Quadlet suele encajar mejor que cualquiera de las dos herramientas compose.

Podman Quadlet: contenedores como servicios systemd

Esta es la función que convierte a Podman en la elección correcta para servidores Linux autoalojados. Quadlet te permite definir contenedores como archivos de unidad de systemd: systemd gestiona el ciclo de vida (arranque, parada, reinicio al boot, logging) sin necesitar el daemon de Docker ni compose.

Si alguna vez has escrito un archivo de servicio de systemd, ya sabes cómo funciona Quadlet. Defines un archivo .container, systemd lo recoge y lo gestionas con systemctl como cualquier otro servicio.

Aquí va un ejemplo real:

ini
# /etc/containers/systemd/myapp.container
[Unit]
Description=My nginx app

[Container]
Image=docker.io/library/nginx:1.27
PublishPort=8080:80
Volume=myapp-data:/usr/share/nginx/html
AutoUpdate=registry

[Service]
Restart=always

[Install]
WantedBy=default.target

Luego:

bash
systemctl daemon-reload
systemctl start myapp
systemctl status myapp    # verify it's running
journalctl -u myapp -f    # follow logs

Lista todas las unidades Quadlet con podman quadlet ls.

¿Por qué Quadlet?

systemd gestiona el ciclo de vida del contenedor: políticas de reinicio, ordenación de arranque, agregación de logs vía journald, sin un daemon persistente ni sobrecarga de compose. Así es como se ejecutan contenedores en producción en un VPS Linux. Docker no tiene equivalente nativo (usarías generadores de systemd de terceros o unidades systemd para compose).

Novedades en Podman 6: instalación rediseñada (sigue archivos en subdirectorios), claves UID=/GID=/Options= en volúmenes, clave AppArmor e ImageVolume= en 6.1. Si ejecutas paneles de servidor autoalojados o cualquier servicio de larga duración en una máquina Linux, merece la pena aprender Quadlet.

Quadlet frente a Docker Compose en producción

Para un operador en solitario que ejecuta servicios en un VPS Linux, la elección se reduce a qué gestiona el ciclo de vida:

  • Docker Compose: ejecutas docker compose up -d y esperas que siga funcionando. Para persistencia al arranque, necesitas una unidad systemd que llame a compose, o una política de reinicio en cada contenedor. Los logs van al driver de logs de Docker.
  • Quadlet: systemd posee el ciclo de vida del contenedor de forma nativa. Restart=always es una directiva de systemd. Los logs van a journald. La ordenación de arranque funciona con After= y Wants=. Sin daemon, sin binario compose, sin scripts wrapper.

Si ya usas systemd para todo lo demás en tu servidor (y deberías), los contenedores Quadlet encajan perfectamente. Un systemctl status más que consultar, un journalctl -u más para seguir logs. Ninguna herramienta nueva que aprender.

Actualización: Podman 6 es una migración, no un parche

Cambios que rompen compatibilidad

Podman 6 no es una actualización directa desde 5.x. Elimina varios subsistemas por completo. Si ejecutas Podman 5 en servidores de producción, lee esto antes de actualizar. La actualización se parece más a pasar de Python 2 a 3 que a un parche rutinario: la superficie de la API cambió, los backends heredados desaparecieron y algunos flujos de trabajo necesitan ajuste.

Qué eliminó Podman 6

  • BoltDB: reemplazado por SQLite (la auto-migración ocurre al reiniciar desde Podman 5.8+)
  • slirp4netns: reemplazado por pasta (predeterminado desde 5.0; ahora es la única opción)
  • CNI: reemplazado por Netavark (predeterminado desde 4.0; ahora es la única opción)
  • cgroups v1: se requiere cgroups v2
  • iptables: solo nftables
  • Soporte de Mac Intel: quédate en Podman 5.x si tienes un Mac Intel
  • Windows 10: se requiere Windows 11

Lista de comprobación previa a la actualización

  • Confirma cgroups v2: stat -fc %T /sys/fs/cgroup debería devolver cgroup2fs
  • Detén todas las VM de podman machine antes de actualizar
  • En Hyper-V: ejecuta podman machine reset antes de la actualización
  • Busca referencias a CNI o slirp4netns en tus configuraciones
  • La semántica de podman volume prune cambió (ahora como Docker: solo volúmenes anónimos; usa --all para el comportamiento anterior; --dry-run para previsualizar)
  • Las VM de podman machine en Linux deben recrearse tras la actualización (los montajes de volúmenes ahora usan systemd)

Verificación tras la actualización

bash
podman info --format '{{.Version}} {{.Host.Security}} {{.Host.NetworkBackend}}'
# expect: 6.x, rootless, netavark

podman system check
# storage/DB integrity check

stat -fc %T /sys/fs/cgroup
# should return: cgroup2fs

Podman Desktop 1.29 (julio de 2026) soporta Podman 6 y recomienda borrar los datos en actualizaciones de 5 a 6.

Cómo es la migración en la práctica

En Fedora o RHEL, la actualización suele ser una operación del gestor de paquetes:

bash
# Fedora
sudo dnf upgrade podman

# Check the version
podman --version
# expect: podman version 6.x.x

La migración de BoltDB a SQLite ocurre automáticamente al reiniciar si vienes de Podman 5.8+. Si estás en una versión 5.x más antigua, actualiza primero a 5.8, reinicia y luego actualiza a 6.

El mayor punto de dolor en la práctica: podman volume prune. En Podman 5, eliminaba todos los volúmenes sin usar. En 6, coincide con el comportamiento de Docker: solo volúmenes anónimos. Usa podman volume prune --all para el comportamiento anterior, y --dry-run para previsualizar qué se eliminaría.

Migrar de Docker a Podman

Si pasas de Docker a Podman en un servidor Linux, la CLI es mayormente compatible. Los comandos básicos son idénticos: run, build, ps, images, exec, logs. Las diferencias aparecen en los detalles: redes, volúmenes e integración de herramientas.

La migración suele ser directa para configuraciones simples. Para entornos complejos con muchos servicios, pipelines de CI y herramientas que dependen de funciones específicas de Docker, reserva un día de pruebas.

bash
# The simplest migration
alias docker=podman

# Test your containers
podman run -d --name test nginx
podman ps
podman logs test

Compatibilidad del socket

Muchas herramientas (Testcontainers, VS Code Dev Containers, scripts de CI) esperan un socket de Docker. Podman puede proporcionar uno:

bash
systemctl enable --now podman.socket
# Option 1: symlink
ln -sf /var/run/podman/podman.sock /var/run/docker.sock
# Option 2: environment variable
export DOCKER_HOST=unix:///var/run/podman/podman.sock

Ojo con

Trampas de la migración

  • host.docker.internal (Docker) frente a host.containers.internal (Podman): nombres de host diferentes para alcanzar el host desde dentro de un contenedor
  • Publicación de puertos rootless: los puertos por debajo de 1024 necesitan configuración extra (o ejecutarse como root)
  • Permisos de volúmenes con espacios de nombres de usuario/uidmap: los archivos creados por root dentro del contenedor pueden aparecer con un UID alto en el host
  • Los archivos compose con funciones avanzadas pueden necesitar ajustes para podman-compose
  • Audita los scripts que tengan rutas de docker.sock fijadas antes de cambiar

Para una inmersión más profunda sobre el uso seguro de contenedores para cargas de trabajo de IA, consulta ejecutar herramientas CLI de IA de forma segura en Docker o Podman.

Compatibilidad con CI/CD

Tanto GitHub Actions como GitLab CI soportan Podman. GitHub Actions tiene jobs de contenedor de Podman, Buildah y Skopeo disponibles. Esto importa para la seguridad: con Podman no necesitas Docker-in-Docker (DinD) ni contenedores privilegiados en CI: cada paso de build se ejecuta como un proceso independiente. Sin daemon dentro de daemon, sin modo privilegiado, sin exposición del socket de Docker en tu pipeline.

Si ejecutas GitLab CI con Docker, el enfoque estándar usa un contenedor DinD privilegiado. Con Podman, puedes ejecutar builds rootless sin modo privilegiado. La contrapartida: necesitas configurar Podman en tu runner de CI, lo que añade configuración. Para la mayoría de equipos, Docker en CI ya funciona y el coste de migración no merece la pena a menos que la seguridad sea un requisito estricto.

Cargas de trabajo de IA: Docker Model Runner frente a Podman AI Lab

Ambas herramientas soportan ahora ejecutar modelos de IA localmente en contenedores, pero con enfoques diferentes. Es un área que avanza rápido: tanto Docker como Podman lanzaron funciones importantes de IA en 2025-2026, y el panorama seguirá cambiando. Si estás evaluando contenedores para cargas de trabajo de IA, la elección depende de tu hardware y de si ya estás invertido en un ecosistema.

Docker Model Runner

  • GA desde septiembre de 2025
  • LLM empaquetados como artefactos OCI en Docker Hub
  • Backend llama.cpp con API compatible con OpenAI (http://localhost:1234/v1)
  • Funciona en Docker Desktop (Apple Silicon, NVIDIA, ARM) y en Linux vía Docker CE
  • Soporte de la clave de nivel superior models: en Compose
  • Mayor productización: los modelos son artefactos Docker de primera clase

Podman AI Lab

  • Extensión de Podman Desktop
  • Se distribuye con Podman Desktop: totalmente autocontenido
  • Podman 6.0 añadió soporte de GPU AMD a --gpus (antes solo NVIDIA)
  • Sin instalación adicional más allá de Podman Desktop
  • Menos productizado que el enfoque de Docker, pero sin dependencia de proveedor

Contenedores con GPU

Ambas herramientas soportan GPU NVIDIA. Podman 6 añadió soporte de GPU AMD vía --gpus, lo cual es significativo si usas hardware AMD. Para inferencia local práctica, también puedes autoalojar Ollama con Docker Compose: funciona con ambos motores.

Ambas son gratis y evolucionan rápido. Model Runner de Docker está más pulido para el flujo de trabajo «descarga un modelo, ejecútalo». Podman AI Lab es más simple si ya estás en Podman Desktop. Ninguna requiere suscripción de pago para inferencia local.

Cuál elegir para cargas de trabajo de IA

Si ejecutas LLM locales en una estación de trabajo Mac o Windows, Docker Model Runner es la opción más madura: los modelos empaquetados en OCI en Docker Hub y la API compatible con OpenAI facilitan la integración con herramientas existentes. La clave models: de Compose te permite definir modelos junto a tus servicios.

Si estás en Linux y ya usas Podman, AI Lab te da una experiencia autocontenida sin incorporar Docker Desktop. El soporte de GPU AMD en Podman 6 es un diferenciador real si usas hardware AMD: el soporte de --gpus de Docker ha sido históricamente prioritario para NVIDIA.

Para inferencia de IA en producción en un VPS, ninguna de las dos herramientas es la respuesta: usarías algo como Ollama con Docker Compose o un servidor de inferencia dedicado. Las funciones Model Runner y AI Lab son principalmente para desarrollo local y experimentación.

¿Qué herramienta de contenedores deberías elegir?

La decisión se reduce a tus prioridades: tamaño del ecosistema, valores de seguridad por defecto, coste de licencias y dónde ejecutas los contenedores.

Elige Docker cuando:
  • Aprendes contenedores: mejor documentación, más tutoriales, más fácil de empezar
  • En Windows o Mac: Docker Desktop es cómodo (ojo con la licencia si estás en una organización grande)
  • Necesitas el ecosistema: herramientas, integraciones, soporte en la nube: Docker está en todas partes
  • Tu equipo ya lo usa: el coste de migración no merece la pena si Docker te funciona
  • Docker Swarm: si usas Swarm para orquestación
  • Montas un servidor casero: el ecosistema de los mejores contenedores Docker para un servidor casero es enorme
Elige Podman cuando:
  • La seguridad importa: rootless por defecto, sin daemon, menor superficie de ataque
  • Tienda Linux: funciona muy bien en Linux, especialmente con systemd y Quadlet
  • Camino a Kubernetes: los pods de Podman se mapean directamente a pods de Kubernetes
  • Consciente de los recursos: cero memoria en reposo, sin sobrecarga de daemon
  • Stack Red Hat / RHEL: viene por defecto en Fedora y RHEL
  • Sensible al coste: totalmente open source, sin restricciones de licencia: despliega en un VPS Linux con hosting VPS asequible y sin facturas sorpresa

Nuevo en contenedores

Empieza con Docker. Mejores materiales de aprendizaje, más ayuda de la comunidad, Docker Desktop te da una GUI. Siempre puedes cambiar a Podman más tarde cuando entiendas lo básico. El ecosistema de los mejores contenedores Docker para un servidor casero es enorme y está bien documentado.

Enfoque en seguridad

Usa Podman. Rootless por defecto es una ventaja real. Sin daemon ejecutándose como root hay menos superficie de ataque. Los equipos de seguridad y los auditores de cumplimiento lo aprecian. Si despliegas en un VPS Linux, Podman con Quadlet te da gestión de contenedores nativa de systemd sin ataduras de licencias.

Entornos mixtos

Usa ambos. Docker para desarrollo en Windows/Mac. Podman para producción en servidores Linux. El formato OCI significa que los contenedores construidos con un motor funcionan en el otro. Es lo que yo hago: Docker Desktop en Mac para desarrollo, Podman con Quadlet en VPS Linux para producción. El truco de alias docker=podman hace la transición fluida en el lado del servidor.

Comandos habituales

Los comandos básicos son idénticos entre Docker y Podman. Es intencionado: Podman se construyó como reemplazo directo de la CLI de Docker.

bash
# These work identically with docker or podman
docker run -d --name web nginx          # Background container
docker build -t myapp .                 # Build image
docker ps                               # List running containers
docker images                           # List images
docker exec -it web bash                # Shell into container
docker logs web                         # View container logs
docker compose up -d                    # Start compose stack
bash
# Podman-specific
podman machine init                     # Create a VM (Mac/Windows)
podman machine start                    # Start the VM
podman machine stop                     # Stop the VM
podman pod create --name mypod          # Create a pod
podman pod ps                           # List pods
podman generate kube mypod > pod.yaml   # Export as Kubernetes YAML
podman quadlet ls                       # List Quadlet units
podman system check                     # Check storage integrity
podman system reset                     # Reset all Podman data (destructive)

Los comandos podman machine solo son relevantes en Mac y Windows: gestionan la VM de Linux en la que se ejecuta Podman. En Linux, Podman se ejecuta de forma nativa.

Comandos de verificación
bash
# Check Docker version and config
docker version --format '{{.Server.Version}}'
docker info --format '{{.Driver}} {{.FirewallBackend}}'

# Check Podman version and config
podman info --format '{{.Version}} {{.Host.Security}} {{.Host.NetworkBackend}}'
podman system check                     # Storage/DB integrity

Para la referencia completa de comandos, consulta más de 60 comandos de Docker que debes conocer.

Verificar tu configuración

Tras instalar o actualizar, verifica que todo funciona:

bash
# Docker
docker version --format '{{.Server.Version}}'      # expect 29.x
docker info --format '{{.Driver}} {{.FirewallBackend}}'  # check storage driver and firewall

# Podman
podman info --format '{{.Version}} {{.Host.Security}} {{.Host.NetworkBackend}}'
# expect: 6.x, rootless, netavark
podman system check                                 # storage/DB integrity

Resolución de problemas y trampas

Estos son los problemas con los que los operadores se topan realmente en producción. No teóricos: provienen de informes de la comunidad, issues de GitHub y discusiones en foros.

Uso de disco del almacén de imágenes containerd

Docker Engine 29 convirtió el almacén de imágenes containerd en el predeterminado para instalaciones nuevas. Los informes de la comunidad indican que puede usar más disco que overlay2 para conjuntos de imágenes idénticos (capas base comprimidas duplicadas). En un VPS pequeño, esto importa.

Comprueba si lo estás usando: docker info --format '{{.Driver}}'

Exclúyete (las instalaciones existentes conservan el heredado por defecto; las nuevas reciben containerd): edita /etc/docker/daemon.json:

json
{ "features": { "containerd-snapshotter": false } }

Comprueba el uso de disco: docker system df muestra cuánto espacio usan imágenes, contenedores y volúmenes. Compara con du -sh /var/lib/docker/ para ver la huella real en disco.

Si te estás quedando sin disco, consulta recuperar espacio en disco de /var/lib/docker/overlay2.

Cambios de red en Docker (28/29)

Docker Engine 28.0.0 reescribió las reglas de red de iptables. Algunos operadores tuvieron problemas con requisitos del kernel de ipset, MAC aleatorias en interfaces de contenedor y cambios en el comportamiento de publicación de puertos. Engine 29 añadió soporte experimental de nftables (dockerd --firewall-backend=nftables): aún no está listo para producción, pero está en camino.

Verifica tu backend de firewall: docker info --format '{{.FirewallBackend}}'

Si Docker se está saltando tus reglas de firewall, consulta arreglar Docker cuando se salta tu firewall. Es una trampa común: Docker manipula iptables directamente, lo que puede entrar en conflicto con reglas de UFW o firewalld.

Compatibilidad del socket

Las herramientas que dependen de docker.sock (Testcontainers, VS Code Dev Containers, muchos scripts de CI) pueden funcionar con Podman mediante activación por socket:

bash
systemctl enable --now podman.socket
# Option 1: symlink (works but environment variable is cleaner)
ln -sf /var/run/podman/podman.sock /var/run/docker.sock
# Option 2: environment variable (preferred)
export DOCKER_HOST=unix:///var/run/podman/podman.sock

Ojo con host.docker.internal (Docker) frente a host.containers.internal (Podman): nombres de host diferentes para alcanzar el host desde dentro de un contenedor. Los scripts que tengan fijado el nombre de host de Docker se romperán.

Prueba tu configuración del socket:

bash
curl -s --unix-socket /var/run/podman/podman.sock http://localhost/_ping
# Should return: OK
Trampas de puertos y volúmenes rootless
  • Puertos privilegiados: los contenedores rootless no pueden vincularse a puertos por debajo de 1024 por defecto. Usa sysctl net.ipv4.ip_unprivileged_port_start=80 o publica en un puerto superior y pon un proxy.
  • uidmap: los archivos creados por root dentro de un contenedor rootless se mapean a un UID alto en el host. Esto causa problemas de permisos con bind mounts. Revisa /etc/subuid y /etc/subgid para tu usuario.
  • Permisos de volúmenes: si un contenedor escribe como root en un bind mount, los archivos pertenecen al UID mapeado de tu usuario, no a root. Planifica tu estrategia de volúmenes en consecuencia.
Bug de truncado de Quadlet (CVE-2026-19730)

Podman 6.0 tenía un bug en podman quadlet install --replace: al reemplazar un archivo de unidad más largo por uno más corto quedaba basura residual del archivo antiguo. Esto causaba fallos silenciosos: la unidad systemd generada tenía contenido corrupto. Corregido en Podman 6.1.0.

Si iteras sobre archivos Quadlet, revisa las unidades generadas tras cada cambio:

bash
systemctl daemon-reload
systemctl cat myapp.service   # verify the generated unit looks correct

Conclusión

Ambas herramientas funcionan. Ambas se mantienen activamente. Ambas ejecutan contenedores OCI. Las diferencias son reales pero no son bloqueantes: puedes lanzar software de producción con cualquiera de las dos.

Docker es la elección más segura para aprender, para desarrollo en Windows/Mac y para equipos que necesitan el mayor ecosistema. El coste de la licencia solo afecta a organizaciones grandes: para uso personal y de pequeña empresa, Docker Desktop es gratis. El ecosistema no tiene rival: cada proveedor de nube, cada sistema de CI, cada tutorial asume Docker primero.

Podman es la mejor elección para servidores Linux, despliegues conscientes de la seguridad y cualquiera que no quiera un daemon root ejecutándose 24/7. Quadlet lo hace especialmente bueno para servicios autoalojados gestionados por systemd. La gobernanza CNCF le da credibilidad a largo plazo más allá del patrocinio de Red Hat.

El panorama general

Docker y Podman no son las únicas opciones. containerd con nerdctl proporciona una CLI compatible con Docker respaldada por el runtime containerd (que Docker Engine 29 ahora usa internamente). Rancher Desktop (todavía en mantenimiento activo a agosto de 2026) te da un entorno compatible con Docker en Mac y Windows con Kubernetes integrado. El ecosistema es más grande que dos herramientas.

Yo uso Docker en mi Mac para desarrollo porque Docker Desktop es cómodo. Uso Podman en servidores Linux porque no quiero un daemon root en ejecución y Quadlet encaja en mi flujo de trabajo con systemd.

Elige lo que encaje en tu situación. Siempre puedes cambiar después: la compatibilidad OCI significa que tus contenedores funcionan en cualquiera de los dos motores. Lo importante es elegir uno, aprenderlo bien y lanzar tu software. El motor de contenedores es fontanería: a tus usuarios no les importa cuál usas.

¿Buscas aplicaciones en contenedores? Echa un vistazo a la sección de autoalojadas de toolhunt.net.