Por qué Docker v29 rompe los stacks existentes — y por qué ahora
Una agencia que gestiona una flota de VPS de clientes vive en una tenaza particular: la actualización aguas arriba (Docker, Ubuntu, Debian) llega desde fuera, con independencia de quién administre el servidor. Cuando un VPS de cliente recibe apt upgrade sin control, tres rupturas ocurren al mismo tiempo.
Primera ruptura — versión mínima de API. Docker Engine v29 eleva la versión mínima de API a 1.44. Los clientes que todavía funcionan con el antiguo docker-compose v1 standalone (binario /usr/local/bin/docker-compose) fallan de inmediato: su código cliente está compilado para versiones de API anteriores, y el daemon rechaza la conexión con un mensaje de incompatibilidad.
Segunda ruptura — backend de red nftables. Docker v29 activa nftables por defecto en lugar de iptables para gestionar las reglas de cortafuegos de las redes Docker. Los scripts de terceros que inspeccionan directamente las cadenas iptables (scripts de monitorización, cortafuegos a medida, algunas reglas UFW) ya no ven las reglas Docker — no porque hayan desaparecido, sino porque ahora viven en nftables.
Tercera ruptura — almacén de imágenes containerd. El backend de almacenamiento de las imágenes pasa al almacén containerd. En opt-in desde v29, será el valor por defecto en v30. En un servidor migrado, las imágenes existentes siguen accesibles, pero la ruta de caché cambia, lo que puede sorprender a los scripts que inspeccionan /var/lib/docker/image directamente.
La objeción clásica — «nuestros clientes gestionan sus VPS ellos mismos» — no protege. La ruptura llega desde fuera, y es a la agencia a quien llama el cliente cuando su sitio deja de responder.
Lo que esta guía le permite hacer
- Detectar la versión de API en tensión entre su cliente
dockery el daemon del VPS, antes de que el próximo comando produzca un error críptico. - Identificar en 30 segundos si un VPS todavía funciona con
docker-composev1 standalone — el binario obsoleto desde Docker Desktop 3.6 y retirado de los paquetes oficiales. - Migrar al plugin
docker composev2 con los dos comandos exactos, y luego verificar que susdocker-compose.ymlexistentes funcionan sin cambios de sintaxis. - Comprender el impacto de nftables en sus stacks: lo que sigue funcionando (las redes Docker), lo que puede romperse (sus scripts que leen iptables) y el comando de diagnóstico que lo aclara.
- Activar o aplazar el almacén containerd según su calendario de migración, con la clave de configuración exacta y el comando de verificación.
- Evaluar la compatibilidad de Dockge, Portainer y CasaOS App Store con v29, para no descubrir la incompatibilidad durante una incidencia de cliente.
- Preparar los VPS de sus clientes para que el próximo
apt upgradesea un evento planificado, no una urgencia nocturna.
Requisitos previos antes de empezar
Esta guía se aplica a cualquier VPS Ubuntu 22.04/24.04 o Debian 11/12 en el que Docker Engine esté instalado desde los repositorios oficiales de Docker Inc. (no el paquete docker.io de la distribución). Necesita un acceso SSH root o sudo. No se requiere ninguna interrupción de servicio para los pasos de diagnóstico; la migración del plugin compose necesita unos segundos durante los cuales los comandos docker compose no están disponibles. Prevea un snapshot del VPS antes de modificar /etc/docker/daemon.json si activa el almacén containerd — la restauración en caso de problema lleva menos de cinco minutos con un buen VPS que ofrezca snapshots bajo demanda.
Paso 1 — Diagnosticar la versión de API
Verificar la versión de API del cliente y del daemon
En cada VPS que vaya a auditar, ejecute los dos comandos siguientes:
docker version --format '{{.Client.APIVersion}}' docker version --format '{{.Server.APIVersion}}'Si la versión del cliente es inferior a
1.44y el daemon funciona en v29, obtendrá un error en los próximos comandos. El umbral1.44es el mínimo aceptado por Docker Engine v29: un cliente compilado para1.43o anterior falla conError response from daemon: client version 1.43 is too old. Minimum supported API version is 1.44, please upgrade your client.Si ambas líneas muestran
1.44o más, su cliente es compatible. Pase al paso siguiente.Detectar la presencia de docker-compose v1 standalone
El comando
docker-composecon guion y el comandodocker composesin guion no son lo mismo. El v1 es un binario Python autónomo; el v2 es un plugin Go integrado en la CLI de Docker.which docker-compose && docker-compose --versionSi el comando devuelve una ruta en
/usr/local/bin/o/usr/bin/con una versión1.x.x, tiene el binario standalone obsoleto. Tras la actualización a Docker v29, ese binario devuelvedocker-compose: command not foundsi el paquete ha sido retirado, o el error de API descrito arriba si todavía está presente.docker compose versionSi este comando devuelve
Docker Compose version v2.x.x, el plugin v2 ya está presente. Ambos pueden convivir temporalmente, pero el objetivo es usar únicamente el plugin v2.
Paso 2 — Migrar de docker-compose v1 al plugin v2
Retirar el binario v1 e instalar el plugin
apt remove docker-compose apt install docker-compose-pluginEn un VPS Debian o Ubuntu que use los repositorios oficiales de Docker Inc. (
download.docker.com), el paquetedocker-compose-pluginestá disponible sin configuración adicional. Siapt remove docker-composerespondePackage not found, el binario se instaló manualmente: localícelo conwhich docker-composey elimine el archivo.Verificación posterior a la migración:
docker compose version # Docker Compose version v2.36.0Verificar la compatibilidad sintáctica de sus archivos Compose existentes
La gran mayoría de los archivos
docker-compose.ymlescritos para v1 funcionan sin modificación con el plugin v2. Las únicas rupturas de sintaxis afectan a las directivasversion:superiores a"3.8"(ignoradas en v2, no bloqueantes) y a la opción--compatibility(retirada). Valide sus archivos existentes:docker compose configEste comando resuelve las variables de entorno, valida la sintaxis y muestra la configuración resuelta. Una salida sin errores significa que su archivo es compatible.
Si su equipo usa scripts de shell con
docker-compose(con guion), ponga un alias de compatibilidad en el/etc/bash.bashrcdel VPS:alias docker-compose='docker compose'Este alias no resuelve los scripts que llaman a
docker-composecon ruta absoluta desde un cron o un servicio systemd — audítelos.
Paso 3 — Entender y adaptarse al cambio de backend de red nftables
Verificar que las redes Docker siguen funcionando
La buena noticia:
docker networkfunciona correctamente con nftables. El tráfico entre contenedores, el NAT y la exposición de puertos siguen funcionando. Lo que cambia es la herramienta subyacente que escribe las reglas.docker network lsSus redes bridge existentes siguen apareciendo en la lista. Para comprobar que un contenedor recibe tráfico en el puerto esperado, pruebe directamente:
curl -s http://localhost:8080/healthSi la respuesta es correcta, el plano de datos de Docker funciona con independencia del backend.
Diagnosticar el impacto en sus scripts iptables
El problema aparece cuando un script de terceros (monitorización, Ansible, reglas UFW) inspecciona
iptablespara comprobar que las reglas Docker están presentes:iptables -L DOCKER 2>&1Con el backend nftables, esa cadena está vacía o ausente. El script devuelve un error mientras Docker funciona perfectamente. No es una avería de Docker — es su herramienta de auditoría, que ya no mira en el sitio correcto.
Para inspeccionar las reglas reales:
nft list ruleset | grep -A 20 'docker'Si sus scripts de monitorización o sus playbooks Ansible comprueban la presencia de reglas iptables específicas de Docker, adáptelos para consultar nftables en lugar de deducir de ahí una avería.
Si tiene reglas UFW personalizadas que interactúan con las reglas Docker, consulte la documentación de Docker sobre el modo
DOCKER-USER— existe tanto en nftables como en iptables, pero la sintaxis para añadir reglas difiere. El artículo [pare-feu-ufw-vps](/blog/pare-feu-ufw-vps) cubre UFW de forma general; para la interacción específica de Docker v29, consulte las notas de la versión oficial.
Paso 4 — Evaluar y activar el almacén de imágenes containerd
Verificar el driver de almacenamiento actual
docker info | grep 'Storage Driver'En un VPS actualizado a v29 sin cambios de configuración, obtendrá normalmente
Storage Driver: overlay2. El almacén containerd es opt-in en v29 — no se activa automáticamente. Será el valor por defecto en v30.Si ve
Storage Driver: overlayfs(señal de que alguien ya ha activado el backend containerd), el almacén está activo.Activar el almacén containerd (opt-in, recomendado antes de v30)
Para activar el almacén containerd en v29 y preparar la migración antes de que se imponga en v30, añada la clave siguiente en
/etc/docker/daemon.json:{ "features": { "containerd-snapshotter": true } }Reinicie el daemon:
systemctl restart dockerVerificación:
docker info | grep 'Storage Driver' # Storage Driver: overlayfsPunto de atención: las imágenes existentes descargadas bajo
overlay2siguen disponibles, pero las nuevas capas se escriben en el formato containerd. Si necesita volver atrás, elimine la clave y reinicie — las imágenes del nuevo formato dejarán de ser accesibles sin el backend containerd. Por eso se recomienda un snapshot antes de este paso.
Compatibilidad de las herramientas de terceros con Docker Engine v29
Desplace la tabla
| Herramienta | Estado de compatibilidad con v29 | Acción recomendada |
|---|---|---|
| **Dockge** (hasta 1.4.1 incluido) | No compatible: el daemon de Dockge llama a rutas de API retiradas en v29. El panel ya no arranca tras la actualización de Docker. | Actualizar Dockge a la versión 1.4.2 o superior, que apunta a la API v1.44. Revisar las notas de versión de Dockge antes de un `apt upgrade` en un VPS que lo aloje. |
| **Portainer** (Community Edition < 2.21) | Parcialmente compatible: la interfaz funciona, pero los entornos Docker standalone pueden mostrar errores en las vistas de red. La versión 2.21 corrige las llamadas nftables. | Actualizar Portainer con `docker pull portainer/portainer-ce:latest` y luego `docker compose up -d` antes de actualizar Docker Engine. |
| **CasaOS App Store** | Compatibilidad parcial documentada: las apps desplegadas siguen funcionando, pero el gestor de apps puede señalar errores al inspeccionar las imágenes si el almacén containerd está activado. No hay versión correctiva anunciada a fecha de 2026-08. | Mantener el almacén containerd en opt-out (valor por defecto en v29) en los VPS con CasaOS hasta que haya una versión correctiva. Probar en un entorno de copia antes de cualquier actualización. |
Pruebe la migración en un snapshot antes de tocar la producción
Un VPS con acceso root y snapshots permite validar cada paso de esta migración sin riesgo. Cree un snapshot llamado avant-docker-v29, realice la migración completa, valide sus stacks y elimine después el snapshot. Si algo sale mal por el camino, la restauración devuelve el VPS a su estado inicial en menos de cinco minutos. Es exactamente el uso que cubren los snapshots bajo demanda: probar una actualización de sistema arriesgada en una copia exacta, no en la producción del cliente.
Resolución de problemas — errores reales y remedios
Los tres escenarios siguientes cubren la mayoría de las incidencias observadas durante migraciones a Docker v29 en flotas de VPS.
Escenarios de error frecuentes
Error: `client version X.XX is too old. Minimum supported API version is 1.44`
Causa: el binario
docker-composev1 standalone sigue presente e intenta comunicarse con el daemon v29.Remedio:
apt remove docker-compose apt install docker-compose-plugin docker compose versionSi el binario se instaló manualmente (fuera de apt), búsquelo:
which docker-compose rm /usr/local/bin/docker-composeError: `docker-compose: command not found` tras `apt upgrade`
Causa: el paquete
docker-compose(v1) fue retirado durante la actualización, y el plugin v2 no se instaló.Remedio:
apt install docker-compose-pluginCompruebe después que sus scripts que llaman a
docker-compose(con guion) usan ahoradocker compose(sin guion), o ponga el alias de sistema.Error: `iptables: No chain/target/match by that name` en un script de monitorización
Causa: su script inspecciona la cadena
DOCKERen iptables, pero Docker v29 con nftables ya no la escribe ahí.Remedio: sustituya la comprobación iptables por una comprobación nftables:
nft list ruleset | grep -c 'docker'Si el recuento es mayor que cero, las reglas Docker están presentes en nftables. O use
docker network inspect bridgepara comprobar el estado del plano de datos directamente desde Docker, sin depender del backend de red.Dockge ya no arranca tras la actualización
Causa: Dockge 1.4.1 y anteriores llaman a rutas de API ausentes en Docker Engine v29.
Remedio:
cd /opt/dockge docker compose pull docker compose up -dSi el tag
latestde la imagen de Dockge ya está en 1.4.2 o superior, este comando basta. Si no, edite eldocker-compose.ymlde Dockge para apuntar al tag de la versión correctiva antes de relanzarlo.Los contenedores ya no responden en sus puertos tras reiniciar el daemon
Causa: en el primer reinicio de
dockerden modo nftables, las reglas de NAT se reescriben en el backend correcto, pero algunas distribuciones tienen un conflicto entre el servicioiptables-legacyy nftables que retrasa la puesta en marcha de las reglas.Remedio:
systemctl stop docker systemctl disable iptables systemctl start dockerCompruebe después que los contenedores se han reiniciado correctamente (
docker compose up -d) y que los puertos están expuestos (docker ps --format 'table {{.Names}}\t{{.Ports}}').
Preparar su flota para evitar la próxima incidencia
Una migración a Docker v29 bien llevada no es un acontecimiento aislado — es la ocasión de instaurar los reflejos que evitan la próxima urgencia nocturna.
Bloquee la versión de Docker en apt. En los VPS de clientes, impida que Docker se actualice automáticamente durante los apt upgrade no supervisados:
apt-mark hold docker-ce docker-ce-cli containerd.ioDesbloquee (apt-mark unhold) únicamente cuando esté listo para migrar, después de haber probado en un snapshot.
Automatice la auditoría de la flota. Un playbook Ansible que verifique la versión de API de Docker en cada VPS se escribe en menos de una hora y le da un cuadro de mando de la exposición de su flota antes de cada versión mayor de Docker. El artículo [ansible-automatiser-serveurs-vps](/blog/ansible-automatiser-serveurs-vps) cubre la implantación de este tipo de inventario.
Integre la migración de Docker en su rutina de parches. El procedimiento descrito aquí — snapshot, verificación de API, migración de compose, prueba de nftables, validación de los stacks — se documenta como runbook y se repite en cada versión mayor. El artículo [routine-correctifs-apps-self-hosted](/blog/routine-correctifs-apps-self-hosted) ofrece una estructura para industrializar estos gestos en una flota de VPS.
Pruebe sus stacks en un entorno de copia. Un VPS de staging con snapshot le permite reproducir exactamente el contexto de un VPS de cliente, repetir la migración y validar los stacks antes de intervenir en producción. Es lo que hacen posible, a escala de una agencia, los VPS con acceso root y snapshots bajo demanda.