Actualizado: 2026-07-17

Instalar Traefik con Docker Compose implica tres pasos: preparar la configuración estática de Traefik (proxy inverso que descubre automáticamente los contenedores Docker mediante etiquetas y renueva certificados TLS sin intervención manual), generar credenciales para proteger su panel de control y levantar el contenedor con Docker Compose (herramienta que define y arranca varios contenedores desde un único fichero YAML). En unos 20 minutos el proxy queda operativo, con HTTPS automático gestionado por Let’s Encrypt.

Puntos clave

  • Traefik descubre servicios Docker automáticamente: no hace falta reiniciar nada al añadir un contenedor nuevo, basta con etiquetarlo.
  • La gestión de certificados SSL con Let’s Encrypt es automática: solicitud, renovación y almacenamiento sin intervención manual.
  • El panel de Traefik no incluye autenticación propia; conviene protegerlo con autenticación básica antes de exponerlo a internet.
  • La comunicación entre Traefik y los contenedores circula por una red Docker dedicada, separada del resto del sistema.
  • Los routers y los entrypoints se definen por etiquetas, así que añadir un servicio nuevo al stack no exige tocar la configuración central de Traefik.

¿Qué hace Traefik como proxy inverso?

Un proxy inverso recibe las peticiones externas y las reenvía al contenedor correcto. Traefik organiza ese trabajo en tres piezas: los entrypoints (los puertos en los que escucha tráfico, normalmente el 80 para HTTP y el 443 para HTTPS), los routers (las reglas que deciden, según el dominio o la ruta de la petición, a qué servicio va cada una) y las labels o etiquetas (los metadatos que se añaden a cada contenedor en el docker-compose.yml para decirle a Traefik cómo debe enrutarlo, sin tocar la configuración central). Sobre esa base añade:

  • Descubrimiento automático: lee las etiquetas Docker en tiempo real y actualiza su tabla de enrutamiento sin reinicios.
  • TLS automático: negocia certificados con Let’s Encrypt mediante el desafío HTTP-01 o DNS-01.
  • Middleware: redirecciones, autenticación básica, límite de peticiones y cabeceras de seguridad configurables por etiqueta.
  • Panel web: interfaz visual para inspeccionar routers, servicios y certificados activos.
Diagrama de proxy inverso: el cliente se conecta al proxy que reenvía la petición al servidor interno apropiado

Requisitos previos

Preparar la estructura de directorios

Creamos el directorio de trabajo, el fichero acme.json donde Traefik guardará los certificados, y el fichero de configuración estática:

mkdir -p docker/traefik/traefik-data
touch docker/traefik/traefik-data/acme.json
chmod 600 docker/traefik/traefik-data/acme.json
nano docker/traefik/traefik-data/traefik.yml

El permiso 600 en acme.json es obligatorio: Traefik rechaza el fichero al arrancar si otros usuarios tienen acceso de lectura sobre él.

Configurar Traefik (traefik.yml)

Dentro de traefik.yml escribimos la configuración estática: los entrypoints, el proveedor Docker y el resolutor de certificados. Cambia la dirección de correo para que Let’s Encrypt pueda avisar de la caducidad de los certificados:

api:
  dashboard: true

entryPoints:
  web:
    address: ":80"
  websecure:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false

certificatesResolvers:
  myresolver:
    acme:
      email: tu@email.com
      storage: acme.json
      httpChallenge:
        entryPoint: web

Con exposedByDefault: false, Traefik solo enruta hacia los contenedores que tengan explícitamente la etiqueta traefik.enable=true. Esto evita exponer por accidente servicios internos que no deberían salir a internet.

Generar credenciales para el panel

El panel de Traefik no incluye autenticación propia, así que conviene protegerlo con autenticación básica (usuario y contraseña que el navegador envía en cada petición HTTP). Generamos el hash de la contraseña con htpasswd:

sudo apt-get install apache2-utils
echo $(htpasswd -nb USUARIO CONTRASENA) | sed -e s/\$/\$\$/g

El doble escape del signo $ ($$) es necesario porque Docker Compose interpreta un $ suelto como el inicio de una variable de entorno dentro del YAML; sin el escape, el hash se corrompe y la autenticación falla.

Crear la red Docker y el archivo docker-compose.yml

Creamos la red Docker dedicada por la que circulará el tráfico entre Traefik y los contenedores backend; cualquier servicio que quieras exponer deberá unirse a esta misma red. Para entender mejor cómo funcionan las redes de Docker, consulta la guía sobre redes en Docker: bridge, host y personalizadas.

docker network create traefik-proxy
cd docker/traefik
nano docker-compose.yml

Contenido del fichero docker-compose.yml. Sustituye USUARIO:HASH, traefik.ejemplo.com y el correo por tus propios valores:

services:
  traefik:
    image: traefik:v3.3
    container_name: traefik
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - traefik-proxy
    ports:
      - 80:80
      - 443:443
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik-data/traefik.yml:/traefik.yml:ro
      - ./traefik-data/acme.json:/acme.json
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.entrypoints=web"
      - "traefik.http.routers.traefik.rule=Host(`traefik.ejemplo.com`)"
      - "traefik.http.middlewares.traefik-auth.basicauth.users=USUARIO:HASH"
      - "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https"
      - "traefik.http.routers.traefik.middlewares=traefik-https-redirect"
      - "traefik.http.routers.traefik-secure.entrypoints=websecure"
      - "traefik.http.routers.traefik-secure.rule=Host(`traefik.ejemplo.com`)"
      - "traefik.http.routers.traefik-secure.middlewares=traefik-auth"
      - "traefik.http.routers.traefik-secure.tls=true"
      - "traefik.http.routers.traefik-secure.tls.certresolver=myresolver"
      - "traefik.http.routers.traefik-secure.service=api@internal"

networks:
  traefik-proxy:
    external: true

Nota sobre las versiones: desde Traefik v3, la clave version de Docker Compose ya no hace falta (el CLI moderno la ignora), y el nombre del resolutor de certificados (myresolver) debe coincidir exactamente entre el traefik.yml y la etiqueta tls.certresolver del router.

Logotipo de Let's Encrypt, la autoridad certificadora gratuita que Traefik usa para renovar certificados TLS de forma automatica

Arrancar Traefik

Levantamos el contenedor en modo desacoplado (se ejecuta en segundo plano, sin ocupar la terminal):

docker compose up -d

Accedemos al panel desde el navegador:

https://traefik.ejemplo.com/

El panel muestra los routers, servicios y certificados activos. Para añadir un servicio nuevo al stack basta con añadir las etiquetas traefik.* adecuadas a su contenedor: Traefik lo detecta automáticamente, sin reinicios. Si prefieres administrar los contenedores desde una interfaz web en lugar de la línea de comandos, la guía de cómo instalar Portainer con Docker Compose cubre esa alternativa.

Preguntas frecuentes

¿Traefik y Nginx Proxy Manager son la misma herramienta?

No. Los dos son proxies inversos, pero Nginx Proxy Manager se administra desde una interfaz web con formularios, mientras que Traefik se configura mediante etiquetas en el propio docker-compose.yml y detecta los cambios sin reiniciar nada.

¿Puedo usar Traefik sin Let’s Encrypt?

Sí. El bloque certificatesResolvers es opcional: si lo omites, Traefik sigue enrutando tráfico HTTP con normalidad, pero tendrás que gestionar tus propios certificados o servir solo por el puerto 80.

¿Por qué el panel de Traefik queda accesible sin pedir contraseña?

Porque la autenticación depende de la etiqueta basicauth del middleware traefik-auth: si esa etiqueta falta, o el router seguro no la aplica en middlewares, el panel se sirve sin credenciales.

Conclusión

Traefik reduce la fricción operativa del proxy inverso en Docker: descubre contenedores nuevos por etiqueta, renueva los certificados TLS sin intervención manual y expone un panel para inspeccionar routers y servicios activos. La clave de una instalación segura es proteger el panel con autenticación básica y no aplicar la etiqueta traefik.enable=true a ningún contenedor que no deba salir a internet. La versión en inglés de esta guía está disponible en How to Install Traefik with Docker Compose.

Fuentes

  1. Documentación oficial de Traefik
  2. Let’s Encrypt
  3. Documentación de Docker Compose
  4. documentación de htpasswd (Apache)

Ruta: Self-hosting con Docker: de cero a producción