Docker en 2026: Compose v5, MCP Toolkit, Model Runner y todo lo que ha cambiado

Docker cumplió en 2024 diez años siendo la herramienta estándar para contenedores en desarrollo. En 2026, la historia no es solo contenedores: Docker se está convirtiendo en la plataforma donde se despliegan y orquestan stacks de IA, servidores MCP y modelos locales. Docker Compose v5, lanzado con la especificación Mont Blanc en diciembre de 2025, el MCP Toolkit integrado en Docker Desktop, el Model Runner para ejecutar LLMs localmente y Docker Engine 29 son los cambios más relevantes de los últimos meses.
Esta guía cubre lo que realmente ha cambiado y cómo afecta al trabajo diario de un desarrollador que usa Docker en proyectos web y de IA.
Docker Compose v5: lo que cambia de verdad
Docker Compose v5 (especificación Mont Blanc, diciembre 2025) trae tres cambios arquitecturales importantes.
El builder interno desaparece: Docker Bake toma el control
El cambio más técnico es que Compose v5 elimina su builder interno y delega todos los builds a Docker Bake. Esto significa builds más rápidos con mejor caché, soporte nativo para builds multi-plataforma (AMD64 + ARM64 en un solo comando) y acceso a todas las features avanzadas de BuildKit.
# compose.yaml — v5 con watch mode y build mejorado
services:
web:
build:
context: .
dockerfile: Dockerfile
platforms:
- linux/amd64
- linux/arm64
develop:
watch:
- action: sync
path: ./src
target: /app/src
- action: rebuild
path: package.jsonEl modo watch con sync es especialmente útil: sincroniza los cambios de archivos en tiempo real sin reconstruir el contenedor, y solo hace rebuild cuando cambia algo que realmente lo requiere (como package.json).
Go SDK oficial: Compose como librería
Compose v5 incluye un Go SDK oficial que permite integrar la funcionalidad de Compose directamente en aplicaciones Go sin depender del CLI:
// Ejemplo: integrar Compose en una herramienta de CI propia
package main
import (
"context"
"github.com/compose-spec/compose-go/v2/compose"
)
func main() {
ctx := context.Background()
// Cargar y validar el compose.yaml
project, err := compose.Load(ctx, compose.Options{
WorkingDir: "./mi-proyecto",
ConfigPaths: []string{"compose.yaml"},
})
if err != nil {
panic(err)
}
// Levantar los servicios programáticamente
err = compose.Up(ctx, project, compose.UpOptions{
Detach: true,
})
}Esto es especialmente útil para herramientas de DevOps internas que necesitan gestionar stacks de Compose sin hacer shell out al CLI.
Sintaxis actualizada: compose.yaml en lugar de docker-compose.yml
Aunque ambos nombres siguen siendo válidos, la convención oficial en 2026 es compose.yaml (sin el prefijo docker- y con extensión .yaml). Compose v5 busca en este orden: compose.yaml, compose.yml, docker-compose.yaml, docker-compose.yml.
# Comandos actualizados en Compose v5
docker compose up -d # Levantar en background
docker compose watch # Hot reload en desarrollo
docker compose down -v # Bajar y eliminar volúmenes
docker compose logs -f web # Seguir logs de un servicio
docker compose ps # Estado de los servicios
docker compose exec web sh # Shell en un contenedor
# NUNCA usar el comando antiguo con guión
# docker-compose está completamente deprecado desde 2024Docker para proyectos web: el stack completo
# compose.yaml — stack web en producción con Next.js + Supabase local
services:
web:
build:
context: .
target: production # Multi-stage build
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- NEXT_PUBLIC_SUPABASE_URL=http://kong:8000
depends_on:
supabase-db:
condition: service_healthy
restart: unless-stopped
supabase-db:
image: supabase/postgres:15.1.0.147
volumes:
- postgres_data:/var/lib/postgresql/data
- ./supabase/seed.sql:/docker-entrypoint-initdb.d/seed.sql
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./certs:/etc/nginx/certs:ro
depends_on:
- web
restart: unless-stopped
volumes:
postgres_data:
networks:
default:
driver: bridgeDocker MCP Toolkit: contenedores para servidores MCP
Una de las novedades más relevantes de Docker Desktop en 2026 es el MCP Toolkit: una forma de levantar servidores MCP como contenedores, con catálogo de servidores verificados directamente en Docker Hub.
La idea es simple: en lugar de instalar y configurar servidores MCP de forma manual, los levantas como contenedores con Docker Compose:
# compose.yaml — stack con servidores MCP para desarrollo IA
services:
mcp-github:
image: mcp/github:latest
environment:
- GITHUB_TOKEN=${GITHUB_TOKEN}
ports:
- "3100:3100"
mcp-postgres:
image: mcp/postgres:latest
environment:
- DATABASE_URL=postgresql://postgres:password@db:5432/mydb
depends_on:
- db
ports:
- "3101:3101"
mcp-filesystem:
image: mcp/filesystem:latest
volumes:
- ./proyecto:/workspace:ro # Solo lectura por seguridad
ports:
- "3102:3102"Desde Claude Desktop o Cursor, apuntas a estos servidores MCP locales y el agente tiene acceso a GitHub, tu base de datos y tu sistema de archivos, todo corriendo en contenedores aislados con los permisos que tú defines.
Docker Model Runner: LLMs locales sin configuración
Docker Model Runner permite ejecutar modelos de lenguaje localmente con una API compatible con OpenAI, sin configurar Ollama ni gestionar dependencias de GPU manualmente:
# Descargar y ejecutar un modelo
docker model pull llama3.2:3b
docker model run llama3.2:3b
# Listar modelos disponibles
docker model list
# La API está disponible en localhost:12434
curl http://localhost:12434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "llama3.2:3b",
"messages": [{"role": "user", "content": "Hola, ¿cómo estás?"}]
}'En Compose, puedes integrarlo directamente en el stack:
services:
llm:
provider:
type: model
options:
model: llama3.2:3b
embeddings: true # Activar soporte para embeddings
mi-app:
build: .
environment:
- LLM_URL=http://model-runner.docker.internal:12434
depends_on:
- llmDockerfile multi-stage: el patrón que más impacto tiene
El Dockerfile multi-stage sigue siendo el patrón con mayor retorno en cualquier proyecto que use Docker. Reduce el tamaño de la imagen de producción drásticamente:
# Dockerfile — multi-stage para Next.js
FROM node:20-alpine AS base
WORKDIR /app
COPY package*.json ./
# Etapa de dependencias
FROM base AS deps
RUN npm ci --frozen-lockfile
# Etapa de build
FROM base AS builder
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build
# Etapa de producción — solo lo necesario
FROM node:20-alpine AS production
WORKDIR /app
ENV NODE_ENV=production
# Copiar solo los artefactos necesarios
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
COPY --from=builder /app/public ./public
# Usuario no root por seguridad
RUN addgroup -g 1001 -S nodejs && adduser -S nextjs -u 1001
USER nextjs
EXPOSE 3000
CMD ["node", "server.js"]Esta configuración produce una imagen de producción de ~150MB frente a los 2-3GB de una imagen sin optimizar.
Errores comunes en 2026
Seguir usando `docker-compose` con guión. Está completamente deprecado. Todos los entornos modernos (GitHub Actions, Vercel, CI en general) ya usan docker compose con espacio. Actualiza tus scripts y documentación.
No usar health checks. El depends_on sin condición de health check no garantiza que el servicio dependiente esté realmente listo. Siempre añade health checks y usa condition: service_healthy.
Secrets en variables de entorno en el compose.yaml. Las contraseñas y API keys en environment: en el compose.yaml se exponen en el historial de Docker y en docker inspect. Usa secrets: de Compose o variables de entorno del host con .env:
# Mal — expone el secreto
services:
db:
environment:
- POSTGRES_PASSWORD=mi-password-secreta
# Bien — usa el fichero .env que está en .gitignore
services:
db:
environment:
- POSTGRES_PASSWORD=${DB_PASSWORD} # Viene del .envVolúmenes sin nombre para datos persistentes. Los volúmenes anónimos se eliminan con docker compose down -v. Los volúmenes con nombre persisten. Para datos de base de datos, siempre usa volúmenes con nombre.
Conclusión
Docker en 2026 no es solo la herramienta para "que funcione en cualquier máquina". Es la plataforma donde corre el stack completo: tu aplicación, tu base de datos, tus servidores MCP y tus modelos de IA locales. Docker Compose v5 con su nuevo Go SDK y la delegación a Docker Bake hace los builds más eficientes. El MCP Toolkit simplifica la gestión de servidores de IA. Y el Model Runner democratiza el uso de LLMs locales sin conocimientos de infraestructura de ML.
Si tienes proyectos que todavía usan docker-compose con guión o que no tienen multi-stage builds, esos son los dos cambios que más retorno te van a dar con menos esfuerzo.