Cómo instalar Traefik con Docker Compose
Actualizado: 2026-05-03
Traefik[1] es un proxy inverso y edge router diseñado para entornos de contenedores. A diferencia de soluciones como nginx o HAProxy que requieren recargar configuración manualmente, Traefik descubre automáticamente los servicios Docker mediante etiquetas (labels) y gestiona la adquisición y renovación de certificados SSL con Let’s Encrypt[2] de forma automática. Este artículo explica cómo desplegarlo con Docker Compose.
Puntos clave
- Traefik descubre servicios Docker automáticamente — no requiere recargar configuración al añadir contenedores.
- La gestión de certificados SSL con Let’s Encrypt es automática: solicitud, renovación y almacenamiento sin intervención manual.
- El dashboard de Traefik no tiene autenticación nativa; es indispensable protegerlo con básica HTTP antes de exponerlo.
- La comunicación entre Traefik y los servicios se realiza a través de una red virtual Docker dedicada.
¿Qué hace Traefik como proxy inverso?
Un proxy inverso recibe peticiones externas y las enruta hacia el servicio interno correcto. Traefik añade sobre este rol básico:
- Descubrimiento automático: lee etiquetas Docker en tiempo real y actualiza su tabla de routing 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, rate limiting y headers de seguridad configurables por etiqueta.
- Dashboard 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.
- Un dominio con registros DNS apuntando al servidor.
Preparar la estructura de directorios
Creamos el directorio de trabajo, el fichero acme.json para almacenar certificados, y el fichero de configuración estática de Traefik:
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.ymlEl permiso 600 en acme.json es obligatorio — Traefik rechaza el fichero si otros usuarios tienen acceso de lectura.
Configurar Traefik (traefik.yml)
Dentro del fichero traefik.yml incluimos la configuración estática. Cambiar la dirección de correo para que Let’s Encrypt envíe avisos de caducidad de certificados:
api:
dashboard: true
entryPoints:
http:
address: ":80"
https:
address: ":443"
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
certificatesResolvers:
http:
acme:
email: tu@email.com
storage: acme.json
httpChallenge:
entryPoint: httpCon exposedByDefault: false, Traefik solo enruta a los contenedores que tengan explícitamente la etiqueta traefik.enable=true. Esto evita exponer accidentalmente servicios internos.
Generar credenciales para el dashboard
El dashboard de Traefik no incluye autenticación propia — debemos protegerlo con Basic Auth. Generamos el hash de contraseña con htpasswd:
sudo apt-get install apache2-utils
echo $(htpasswd -nb USUARIO CONTRASEÑA) | sed -e s/\$/\$\$/gEl doble escape de $ ($$) es necesario porque Docker Compose interpreta $ como inicio de variable de entorno en los ficheros YAML.
Crear la red Docker y el docker-compose.yml
Creamos la red virtual dedicada para Traefik:
docker network create traefik-proxy
cd docker/traefik
nano docker-compose.ymlContenido del fichero docker-compose.yml. Sustituir USUARIO:HASH, traefik.ejemplo.com y el email por los valores correspondientes:
version: '3'
services:
traefik:
image: traefik:v2.4.2
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=http"
- "traefik.http.routers.traefik.rule=Host(`traefik.ejemplo.com`)"
- "traefik.http.middlewares.traefik-auth.basicauth.users=USUARIO:CONTRASEÑA_HASH"
- "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https"
- "traefik.http.routers.traefik.middlewares=traefik-https-redirect"
- "traefik.http.routers.traefik-secure.entrypoints=https"
- "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=http"
- "traefik.http.routers.traefik-secure.service=api@internal"
networks:
traefik-proxy:
external: trueArrancar Traefik
Levantamos el contenedor en modo desacoplado:
docker-compose up -dAccedemos al dashboard desde el navegador:
https://traefik.ejemplo.com/El dashboard mostrará los routers, servicios y certificados activos. Para añadir un nuevo servicio al stack, basta con añadir las etiquetas traefik.* apropiadas al contenedor — Traefik lo detectará automáticamente sin reinicios.
Para profundizar en gestión de servicios Docker, el post sobre Docker Compose en Ubuntu 20.04 cubre el flujo de trabajo completo de orquestación.
Conclusión
Traefik elimina la fricción operativa del proxy inverso en entornos Docker: el descubrimiento automático, los certificados gestionados y el routing por etiquetas permiten publicar nuevos servicios en segundos. La clave de la configuración segura es proteger el dashboard con Basic Auth y no exponer servicios sin la etiqueta traefik.enable=true.