Cómo instalar Traefik con Docker Compose
Índice de contenidos
- Puntos clave
- ¿Qué hace Traefik como proxy inverso?
- Requisitos previos
- Preparar la estructura de directorios
- Configurar Traefik (traefik.yml)
- Generar credenciales para el panel
- Crear la red Docker y el archivo docker-compose.yml
- Arrancar Traefik
- Preguntas frecuentes
- ¿Traefik y Nginx Proxy Manager son la misma herramienta?
- ¿Puedo usar Traefik sin Let's Encrypt?
- ¿Por qué el panel de Traefik queda accesible sin pedir contraseña?
- Conclusión
- Fuentes
Actualizado: 2026-07-17
Traefik es un proxy inverso que descubre automáticamente los contenedores Docker mediante etiquetas y renueva sus certificados TLS con Let's Encrypt sin intervención manual. Para instalarlo con Docker Compose se define su configuración estática en traefik.yml, se generan credenciales de autenticación básica para el panel y se levanta el contenedor conectado a una red Docker dedicada.
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.
Requisitos previos
- Docker instalado en Ubuntu 20.04.
- Docker Compose instalado en Ubuntu 20.04 (el plugin
docker compose, no el binario antiguodocker-compose). - Un dominio con registros DNS apuntando a la IP del servidor.
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.
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.