Comparativa: Traefik vs Caddy para enrutamiento HTTPS en entornos Docker

Por · Publicado el · Actualizado el · 8 min de lectura

Contenedores marítimos de colores formando arcos contra el cielo azul
Composición limpia y simbólica para contenedores y orquestación Docker Foto: Jan van der Wolf / Pexels

Esta comparativa de Traefik vs Caddy para enrutamiento HTTPS en entornos Docker se centra en lo que importa a los equipos DevOps: descubrimiento automático, HTTPS con Let's Encrypt, middlewares, métricas y operación. Verás diferencias prácticas, ejemplos mínimos y criterios claros para decidir cuál encaja mejor en tu stack actual.

Alcance de la comparativa y perfiles de uso

El foco es enrutamiento HTTP/HTTPS, terminación TLS y balanceo para múltiples contenedores en un host Docker. No cubrimos Kubernetes. El análisis considera automatización, simplicidad operativa y extensibilidad.

Perfiles típicos: equipos que usan Docker Compose, Portainer o orquestación propia y quieren HTTPS automático con el mínimo retrabajo. Si aún estás montando el entorno, revisa antes cómo instalar Docker y Compose.

Prerequisitos comunes: DNS apuntando al servidor, puertos 80/443 abiertos y red Docker compartida entre proxy y aplicaciones.

  • Equipos con múltiples servicios por host y dominios distintos.
  • Entornos CI/CD que recrean contenedores con frecuencia.
  • Necesidad de métricas y logs fiables para troubleshooting.
  • Requisito de HTTP/2 y HTTP/3/QUIC para reducir latencia.

Configuración y descubrimiento en Docker

La principal diferencia está en el modelo de configuración y en el descubrimiento de servicios desde Docker. Traefik tiene un provider Docker nativo con enrutamiento por labels. Caddy usa Caddyfile/JSON; para descubrimiento automático vía labels es común emplear un plugin (ej.: caddy-docker-proxy) o la generación de configuración.

Si prefieres declarar todo en el Compose con labels y tener reload inmediato al iniciar/detener contenedores, Traefik suele ser más directo. Si quieres un archivo único y legible de reglas HTTP, el Caddyfile resulta muy atractivo.

Aspecto Traefik Caddy
Descubrimiento Docker Nativo por labels (provider Docker) Mediante Caddyfile/JSON; el descubrimiento automático requiere plugin/generador
Estilo de configuración Estática + dinámica (YAML/TOML + labels) Caddyfile simple o JSON vía API de administración
Recarga en caliente Eventos de Docker y archivos (sin caída) Recarga por API/CLI; el Caddyfile es fácil de revisar
Plugins Ecosistema de middlewares y providers Ecosistema sólido; muchos recursos vía módulos
Curva de aprendizaje Labels y conceptos de routers/services/middlewares La DSL del Caddyfile es concisa y legible

HTTPS automático y gestión de certificados

Ambos automatizan certificados con ACME/Let's Encrypt. Traefik integra resolvers y almacena el acervo en archivo/volume. Caddy también emite y renueva automáticamente; el almacenamiento es local por defecto y puede configurarse.

Los desafíos ACME soportados: HTTP‑01 y TLS‑ALPN‑01 son habituales en ambos. Para DNS‑01, Traefik ofrece integraciones; en Caddy, el DNS‑01 requiere un módulo de proveedor DNS. Garantiza DNS correcto, puertos 80/443 y reloj (clock) sincronizado para evitar fallos.

Si necesitas entender la base de Let's Encrypt, consulta una guía introductoria antes de montar el proxy.

  • TLS por dominio y SAN, con renovación automática.
  • Redirección HTTP→HTTPS y HSTS configurables.
  • SNI para múltiples hosts en la misma IP.
  • HTTP/2 y HTTP/3/QUIC disponibles.

Enrutamiento, middlewares y balanceo

Traefik ofrece enrutamiento por host, path, headers, métodos y más, con middlewares listos (rate limit, compresión, headers, auth forward). Caddy tiene matchers y handlers potentes en el Caddyfile; muchos recursos avanzados vienen vía módulos.

Para balanceo, ambos soportan múltiples backends y políticas con pesos. TLS passthrough es nativo en Traefik; en Caddy, características L4 y passthrough requieren un módulo específico. Transformaciones más complejas pueden afectar el throughput.

  • Reescrituras, strip prefix y redirects.
  • Headers de seguridad y CSP vía middlewares/handlers.
  • Autenticación básica e integración con SSO mediante forward-auth.
  • Canary/blue‑green con pesos por servicio.

Observabilidad, logs y resolución de problemas

Traefik exporta métricas Prometheus de forma nativa y tiene access logs estructurados. Caddy ofrece logs detallados y puede exportar métricas vía módulo Prometheus. Ambos funcionan bien con stacks de observabilidad en Docker.

Para monitorizar latencia, tasa de errores y certificados, intégralo con Prometheus y Grafana. Logs estructurados ayudan a rastrear correlaciones por request-id. No dejes métricas sin retención, eso dificulta el RCA.

  • Métricas: latencia P95/P99, tasa de 5xx, tráfico por host.
  • Logs de acceso con campos útiles (host, path, upstream, tiempo).
  • Health checks activos para evitar enviar tráfico a backends degradados.
  • Tracing distribuido vía middlewares/plugins cuando aplique.

Ejemplo rápido: Traefik con labels de Docker (HTTPS automático)

Ejemplo mínimo con Traefik 2.x y una app containerizada. Sustituye el dominio y asegura que el DNS apunta y los puertos 80/443 están abiertos. El certResolver usa ACME para Let's Encrypt y persiste en un volume. Útil en Docker Compose.

Si estás empezando con Docker/Compose, revisa la instalación y buenas prácticas antes de ejecutar en producción.

version: "3.8"

services:
  traefik:
    image: traefik:v2.10
    command:
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - [email protected]
      - --certificatesresolvers.le.acme.storage=/letsencrypt/acme.json
      - --certificatesresolvers.le.acme.httpchallenge=true
      - --certificatesresolvers.le.acme.httpchallenge.entrypoint=web
      - --api.dashboard=true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - traefik_letsencrypt:/letsencrypt
    labels:
      - "traefik.enable=true"

  app:
    image: yourorg/yourapp:latest
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.app.rule=Host(`app.example.com`)"
      - "traefik.http.routers.app.entrypoints=websecure"
      - "traefik.http.routers.app.tls.certresolver=le"
      - "traefik.http.services.app.loadbalancer.server.port=3000"

volumes:
  traefik_letsencrypt: {}

Ejemplo rápido: Caddy con Caddyfile + Docker

Caddy emite y renueva certificados automáticamente. En el ejemplo, un Caddyfile simple hace proxy al contenedor "app" en la red compartida. Para descubrimiento automático por labels, usa un módulo adecuado. Revisa el firewall y asegúrate de que el dominio resuelve al host.

version: "3.8"

services:
  caddy:
    image: caddy:2
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config

  app:
    image: yourorg/yourapp:latest
    expose:
      - "3000"

volumes:
  caddy_data: {}
  caddy_config: {}

# Caddyfile (salvar al lado del compose)
# app.example.com {
#   reverse_proxy app:3000
# }

Criterios de elección rápidos y trade-offs

Si tu flujo está orientado a labels en Docker Compose y quieres descubrimiento inmediato sin plugins, Traefik suele encajar mejor. Si valoras un archivo de configuración legible, directo y fácil de versionar, el Caddyfile es un punto a favor de Caddy.

En entornos con fuertes requisitos de métricas Prometheus out‑of‑the‑box y rate limiting incorporado, Traefik sale adelante. Para escenarios HTTP complejos con reglas claras y concisas, Caddy simplifica la lectura y la revisión de PRs.

Ambas opciones sirven en producción; la operación y el tooling de tu equipo deben guiar la decisión.

  • Elige Traefik cuando: las labels en Compose son estándar, necesitas provider Docker nativo, métricas Prometheus inmediatas, TLS passthrough sin plugins.
  • Elige Caddy cuando: quieres un Caddyfile claro, HTTP/3 maduro, módulos bajo demanda y reglas HTTP legibles para revisión.
  • Ambos satisfacen producción; prioriza la operativa del equipo.

Preguntas frecuentes

¿Traefik o Caddy es más sencillo para Docker Compose?

Si prefieres declarar enrutamiento por labels en el propio docker-compose, Traefik suele ser más directo. Si quieres centralizar reglas en un archivo humano‑legible, el Caddyfile simplifica mucho la revisión y el versionado.

¿Ambos gestionan Let's Encrypt automáticamente?

Sí. Traefik y Caddy automatizan emisión y renovación vía ACME. Usa HTTP‑01 o TLS‑ALPN‑01. Para DNS‑01, Traefik ofrece integraciones; en Caddy es necesario añadir el módulo del proveedor DNS. Asegura DNS y puertos 80/443 abiertos.

¿Soportan HTTP/3 (QUIC)?

Sí. Traefik y Caddy ya soportan HTTP/3/QUIC. Verifica compatibilidad del cliente, sistema y red. Si hay proxies intermedios, HTTP/3 puede degradar a HTTP/2, lo que sigue aportando mejoras de latencia.

¿Puedo recargar la configuración sin caer conexiones?

Sí. Ambos soportan recarga dinámica de configuración. Traefik reacciona a eventos de Docker y archivos. Caddy aplica cambios vía API/CLI o recargando el Caddyfile, manteniendo conexiones activas siempre que sea posible.

¿Cómo exponer métricas para Prometheus?

Traefik exporta métricas Prometheus nativamente. En Caddy, usa el módulo de métricas Prometheus. En ambos, recoge con Prometheus y visualiza en Grafana paneles para latencia, errores y tráfico por host.

¿Puedo usar TLS passthrough?

En Traefik, TLS passthrough está soportado de forma nativa. En Caddy, esta función requiere un módulo específico de capa 4. Usa passthrough solo cuando necesites enrutar TLS sin terminación, ya que limita inspección y funciones a nivel HTTP.

¿Necesitas decidir entre Traefik y Caddy para tu Docker?

Describe tu escenario, dominios y requisitos de observabilidad. Podemos evaluar rápidamente el encaje, riesgos y un plan de migración seguro.

Hablemos de tu stack

Ver también