Ir al contenido principal

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

Docker Compose v5 llegó con un Go SDK oficial, delegación del builder a Docker Bake y los primeros pasos hacia la orquestación de stacks de IA. Docker ya no es solo contenedores: es la plataforma donde corren los agentes.

Luis Miguel García Briz7 min de lectura
Compartir
Docker en 2026: Compose v5, MCP Toolkit, Model Runner y todo lo que ha cambiado
Cargando audio...

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.

yaml
# 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.json

El 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:

go
// 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.

bash
# 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 2024

Docker para proyectos web: el stack completo#

yaml
# 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: bridge

Docker 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:

yaml
# 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:

bash
# 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:

yaml
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:
      - llm

Dockerfile 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
# 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:

yaml
# 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 .env

Volú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.

Avisos sin ruido

Nuevas herramientas, cuando salgan.

Deja tu email y te aviso cuando publique calculadoras, herramientas o aprendizajes técnicos relevantes.

Este aviso llega a [email protected] para gestionarlo manualmente. Sin spam ni listas raras. Puedes darte de baja cuando quieras desde desuscribirte.