Guía de Traefik con Docker 2026: El Proxy Inverso Definitivo
TUTORIAL 11 min read fordnox

Guía de Traefik con Docker 2026: El Proxy Inverso Definitivo

Configura Traefik con Docker para SSL automático, descubrimiento de servicios y balanceo de carga. Guía completa para despliegues modernos con contenedores.


Guía de Traefik con Docker: Proxy Inverso Automático

Traefik es el proxy inverso nativo de la nube. Descubre tus contenedores Docker y enruta automáticamente el tráfico hacia ellos — con certificados SSL gratuitos.

¿Qué es Traefik?

Traefik se sitúa delante de tus servicios:

Internet → Traefik → Contenedor A (app.dominio.com)
                  → Contenedor B (api.dominio.com)
                  → Contenedor C (admin.dominio.com)

Características principales:

¿Por qué Traefik en lugar de Nginx?

CaracterísticaTraefikNginx
Integración con DockerNativaConfiguración manual
Auto SSLIncorporadoRequiere Certbot
Descubrimiento de serviciosAutomáticoManual
Recarga de configuraciónEn calienteRequiere reinicio
Curva de aprendizajeModeradaMenor
RendimientoExcelenteExcelente

Traefik gana en entornos Docker. Nginx para configuraciones estáticas (consulta nuestra guía de proxy inverso con Nginx).

Requisitos del VPS

Traefik es ligero:

Las especificaciones de tu VPS dependen de tus servicios, no de Traefik. Consulta nuestra guía del mejor VPS para Docker para recomendaciones de dimensionamiento.

Configuración Básica

Paso 1: Crear la Red

docker network create traefik-public

Paso 2: Crear el Directorio de Configuración de Traefik

mkdir -p /opt/traefik
cd /opt/traefik

Paso 3: Crear Docker Compose

# docker-compose.yml
version: '3.8'

services:
  traefik:
    image: traefik:v3.0
    container_name: traefik
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    ports:
      - 80:80
      - 443:443
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik.yml:/traefik.yml:ro
      - ./acme.json:/acme.json
      - ./config:/config:ro
    networks:
      - traefik-public
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.rule=Host(`traefik.yourdomain.com`)"
      - "traefik.http.routers.traefik.entrypoints=websecure"
      - "traefik.http.routers.traefik.tls.certresolver=letsencrypt"
      - "traefik.http.routers.traefik.service=api@internal"
      - "traefik.http.routers.traefik.middlewares=auth"
      - "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$xxxxx"

networks:
  traefik-public:
    external: true

Paso 4: Crear la Configuración de Traefik

# traefik.yml
api:
  dashboard: true
  insecure: false

entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https

  websecure:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
    network: traefik-public
  file:
    directory: /config
    watch: true

certificatesResolvers:
  letsencrypt:
    acme:
      email: you@yourdomain.com
      storage: /acme.json
      httpChallenge:
        entryPoint: web

Paso 5: Crear el Almacenamiento de Certificados

touch acme.json
chmod 600 acme.json
mkdir config

Paso 6: Generar la Contraseña del Panel de Control

htpasswd -nb admin your-secure-password
# Resultado: admin:$apr1$...
# Usa esto en docker-compose.yml, duplicando los signos $

Paso 7: Iniciar Traefik

docker compose up -d

Accede al panel de control: https://traefik.yourdomain.com

Añadir Servicios

Ejemplo: Nginx

# En un docker-compose.yml separado
version: '3.8'

services:
  nginx:
    image: nginx:alpine
    container_name: nginx
    restart: unless-stopped
    networks:
      - traefik-public
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.nginx.rule=Host(`www.yourdomain.com`)"
      - "traefik.http.routers.nginx.entrypoints=websecure"
      - "traefik.http.routers.nginx.tls.certresolver=letsencrypt"

networks:
  traefik-public:
    external: true

¡Eso es todo! Traefik descubre el contenedor y:

Ejemplo: Aplicación Node.js

services:
  api:
    build: .
    container_name: api
    networks:
      - traefik-public
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api.rule=Host(`api.yourdomain.com`)"
      - "traefik.http.routers.api.entrypoints=websecure"
      - "traefik.http.routers.api.tls.certresolver=letsencrypt"
      - "traefik.http.services.api.loadbalancer.server.port=3000"

networks:
  traefik-public:
    external: true

Nota: loadbalancer.server.port especifica el puerto del contenedor.

Middleware

Autenticación Básica

labels:
  - "traefik.http.middlewares.auth.basicauth.users=user:$$hashed$$password"
  - "traefik.http.routers.admin.middlewares=auth"

Limitación de Velocidad

labels:
  - "traefik.http.middlewares.ratelimit.ratelimit.average=100"
  - "traefik.http.middlewares.ratelimit.ratelimit.burst=50"
  - "traefik.http.routers.api.middlewares=ratelimit"

Lista Blanca de IPs

labels:
  - "traefik.http.middlewares.ipwhitelist.ipwhitelist.sourcerange=192.168.1.0/24,10.0.0.0/8"
  - "traefik.http.routers.admin.middlewares=ipwhitelist"

Cabeceras

labels:
  - "traefik.http.middlewares.security.headers.stsSeconds=31536000"
  - "traefik.http.middlewares.security.headers.stsIncludeSubdomains=true"
  - "traefik.http.middlewares.security.headers.contentTypeNosniff=true"
  - "traefik.http.middlewares.security.headers.frameDeny=true"

Redirección

labels:
  - "traefik.http.middlewares.redirect.redirectregex.regex=^https://old.domain.com/(.*)"
  - "traefik.http.middlewares.redirect.redirectregex.replacement=https://new.domain.com/$${1}"

Compresión

labels:
  - "traefik.http.middlewares.compress.compress=true"
  - "traefik.http.routers.web.middlewares=compress"

Múltiples Dominios

Mismo Contenedor

labels:
  - "traefik.http.routers.web.rule=Host(`domain1.com`) || Host(`domain2.com`)"

Con Redirección

labels:
  - "traefik.http.routers.www.rule=Host(`www.domain.com`)"
  - "traefik.http.routers.www.middlewares=redirect-to-apex"
  - "traefik.http.middlewares.redirect-to-apex.redirectregex.regex=^https://www\\.(.+)"
  - "traefik.http.middlewares.redirect-to-apex.redirectregex.replacement=https://$${1}"

Balanceo de Carga

Múltiples Contenedores

services:
  api:
    image: myapi
    deploy:
      replicas: 3
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api.rule=Host(`api.domain.com`)"

Traefik balancea automáticamente la carga entre las réplicas.

Sesiones Persistentes

labels:
  - "traefik.http.services.api.loadbalancer.sticky.cookie=true"
  - "traefik.http.services.api.loadbalancer.sticky.cookie.name=server_id"

Comprobaciones de Salud

labels:
  - "traefik.http.services.api.loadbalancer.healthcheck.path=/health"
  - "traefik.http.services.api.loadbalancer.healthcheck.interval=10s"

Enrutamiento Basado en Rutas

labels:
  - "traefik.http.routers.api.rule=Host(`domain.com`) && PathPrefix(`/api`)"
  - "traefik.http.routers.web.rule=Host(`domain.com`) && PathPrefix(`/`)"

Eliminar Prefijo de Ruta

labels:
  - "traefik.http.middlewares.strip-api.stripprefix.prefixes=/api"
  - "traefik.http.routers.api.middlewares=strip-api"

/api/users se convierte en /users para el backend.

Certificados Comodín

Para *.domain.com:

# traefik.yml
certificatesResolvers:
  letsencrypt:
    acme:
      email: you@domain.com
      storage: /acme.json
      dnsChallenge:
        provider: cloudflare
# docker-compose.yml
environment:
  - CF_API_EMAIL=you@domain.com
  - CF_API_KEY=your-api-key

Luego usa:

labels:
  - "traefik.http.routers.web.tls.certresolver=letsencrypt"
  - "traefik.http.routers.web.tls.domains[0].main=domain.com"
  - "traefik.http.routers.web.tls.domains[0].sans=*.domain.com"

Configuración Basada en Archivos

Para servicios no Docker, usa el proveedor de archivos:

# /opt/traefik/config/external.yml
http:
  routers:
    external-service:
      rule: "Host(`external.domain.com`)"
      service: external-service
      tls:
        certResolver: letsencrypt

  services:
    external-service:
      loadBalancer:
        servers:
          - url: "http://192.168.1.100:8080"

Traefik observa el directorio de configuración y recarga automáticamente.

Métricas y Monitorización

Habilitar Métricas

# traefik.yml
metrics:
  prometheus:
    entryPoint: metrics
    buckets:
      - 0.1
      - 0.3
      - 1.2
      - 5.0

entryPoints:
  metrics:
    address: ":8082"

Panel de Grafana

Usa el ID de panel 11462 para métricas de Traefik. Para una configuración completa de monitorización con Grafana, consulta nuestra guía dedicada.

Registros de Acceso

# traefik.yml
accessLog:
  filePath: "/var/log/traefik/access.log"
  format: json
  filters:
    statusCodes:
      - "400-599"
  bufferingSize: 100

Monta el directorio de registros:

volumes:
  - ./logs:/var/log/traefik

Solución de Problemas

Contenedor No Descubierto

  1. Verifica la red:
docker network inspect traefik-public
  1. Verifica las etiquetas:
docker inspect container_name | grep -A 50 Labels
  1. Comprueba traefik.enable=true

SSL No Funciona

  1. Revisa el registro de ACME:
docker logs traefik 2>&1 | grep -i acme
  1. Verifica los permisos de acme.json (600)

  2. Asegúrate de que el puerto 80 esté abierto para el desafío HTTP

502 Bad Gateway

  1. Verifica que el contenedor esté en ejecución
  2. Comprueba que el puerto sea correcto en las etiquetas
  3. Revisa los registros del contenedor

Ver la Configuración Activa

El panel de control muestra todos los routers, servicios y middlewares. O bien:

curl http://localhost:8080/api/http/routers

Lista de Verificación para Producción

Mejor VPS para Traefik

Traefik en sí es muy ligero. Dimensiona según tus servicios:

ProveedorPlanPrecioIdeal Para
HetznerCX21€5.395-10 servicios
HostingerKVM1$4.99Configuración económica
VultrVC2$12Alcance global

Preguntas Frecuentes

¿Traefik o Nginx Proxy Manager?

Traefik para configuraciones nativas de Docker. NPM para configuraciones más simples basadas en interfaz gráfica.

¿Cuántos servicios puede manejar Traefik?

Cientos fácilmente. Está diseñado para microservicios a escala.

¿Es seguro Traefik?

Sí. No expongas la API sin autenticación. Mantenlo actualizado.

¿Puedo migrar desde Nginx?

Sí. La migración gradual es posible — ejecuta ambos temporalmente.

¿Traefik soporta HTTP/3?

Sí, a partir de la v3.0. Habilítalo en la configuración del entrypoint.

Resumen

Traefik automatiza lo que configurarías manualmente en Nginx:

TareaNginxTraefik
Añadir servicioEditar config, recargarAñadir etiquetas
Obtener SSLEjecutar certbotAutomático
Balancear cargaConfigurar upstreamAutomático
Eliminar servicioEditar config, recargarDetener contenedor

Para despliegues con Docker, Traefik es la opción moderna. Configúralo una vez, añade servicios con etiquetas para siempre. Para un flujo de trabajo de despliegue completo, combínalo con Docker Compose.

~/traefik-docker-guide/get-started

Ready to get started?

Get the best VPS hosting deal today. Hostinger offers 4GB RAM VPS starting at just $4.99/mo.

Get Hostinger VPS — $4.99/mo

// up to 75% off + free domain included

// related topics

traefik docker configuración traefik docker proxy inverso traefik ssl enrutamiento de contenedores

// related guides

Andrius Putna

Andrius Putna

I am Andrius Putna. Geek. Since early 2000 in love tinkering with web technologies. Now AI. Bridging business and technology to drive meaningful impact. Combining expertise in customer experience, technology, and business strategy to deliver valuable insights. Father, open-source contributor, investor, 2xIronman, MBA graduate.

// last updated: February 8, 2026. Disclosure: This article may contain affiliate links.