Desplorar contenedores Docker a escala introduce complejidad en el tráfico de enrutamiento, gestionar certificados SSL y gestionar el descubrimiento de servicios. Traefik, un moderno proxy inverso y balanceador de carga, automatiza estas tareas integrando directamente con Docker. A diferencia de los proxies tradicionales que requieren actualizaciones de archivos de configuración manual cuando un contenedor comienza o se detiene, Traplik escucha el daemon Docker y reconfigurarse en el manual de configuración de archivos.

¿Qué es Traefik?

Traefik es un proxy inverso de código abierto y balanceador de carga construido específicamente para microservicios y arquitecturas containerizzate. Admite múltiples proveedores - Docker, Kubernetes, Consul, Amazon ECS, y otros - permitiendo el descubrimiento automático de servicio y la enrutamiento dinámico. Cuando se inicia un nuevo contenedor con las etiquetas apropiadas, Traefik lo detecta instantáneamente y actualiza sus reglas de enrutamiento sin reiniciar o intervención manual.

  • Automática SSL/TLS con gestión automática de certificados mediante Encrypt (ACME).
  • Apoyo de la cartera] para limitar la tasa, autenticación, solicitar reescritura y más.
  • Monitoreo de carga] con un panel de seguridad web y métricas Prometheus.
  • Equilibración de carga] en múltiples casos de contenedores.
  • Configuración dinámica] a través de archivos, etiquetas o API.

La arquitectura de Traefik separa puntos de entrada] (puertos donde llega el tráfico), ]] redactores (reglas que corresponden a solicitudes de ingreso), y servicios[ (grupos de contenedores de backend).

Prerrequisitos

Antes de bucear en la configuración, asegúrese de que tiene lo siguiente:

  • Un servidor o una máquina local que funciona Docker Engine (versión 20.10 o posterior recomendada).
  • Familiaridad básica con los comandos Docker y conceptos de redes.
  • Nombre de dominio (para ejemplos HTTPS) y capacidad para señalar los registros DNS a su servidor.
  • Puertos 80] y 443 se abren en el cortafuegos para el tráfico de HTTP y HTTPS.

Si está usando un proveedor de nube como AWS o DigitalOcean, asegúrese de que su grupo de seguridad permite el tráfico en estos puertos.

Configuración de Docker con Traefik

Esta sección recorre los pasos fundamentales: crear una red Docker dedicada, lanzar el contenedor Traefik con la configuración adecuada, y verificar que se está ejecutando correctamente.

Crear una red de Docker

Todos los contenedores — Traefik mismo y los contenedores de aplicaciones— deben compartir la misma red Docker para la comunicación sin problemas. Crear una red de puente definida por el usuario:

docker network create traefik-net

Utilizando una red personalizada previene conflictos con la red de puentes predeterminada y permite que los contenedores se resuelvan por su nombre. Traefik utilizará etiquetas Docker para descubrir servicios, pero la conectividad de red es necesaria para que el tráfico llegue a los contenedores de aplicación.

Correr el Contenedor Traefik

Lanza Traefik con el siguiente comando. Tenga en cuenta que montamos el socket Docker para permitir que Traefik escuche eventos de contenedores, puertos de mapa 80 y 443, y atar un archivo de configuración. También exponemos el panel en el puerto 8080 (para uso interno solamente).

docker run -d \
 --name=traefik \
 --network=traefik-net \
 -p 80:80 \
 -p 443:443 \
 -p 8080:8080 \
 -v /var/run/docker.sock:/var/run/docker.sock \
 -v $PWD/traefik.yml:/traefik.yml \
 -v $PWD/acme.json:/acme.json \
 traefik:v2.9

Explanation of the options:

  • y : Exponer puntos de entrada HTTP y HTTPS.
  • : Exponga el tablero (seguro más tarde con autenticación).
  • : Proporcionar acceso a la API Docker. Esto es necesario para la detección dinámica, pero introduce implicaciones de seguridad (después de ser discutido).
  • y : Configuración estática de montaje en papel y almacenamiento de certificados SSL.

Asegurar que el archivo exista con permisos (leer/escribir sólo para root) antes de iniciar Traefik:

touch acme.json && chmod 600 acme.json

Configuración de Traefik

La configuración de Traefik se divide en dos partes: estática] configuración (generalmente en un archivo) y dinamic] configuración (de proveedores como etiquetas Docker). El archivo estático define puntos de entrada, proveedores y ajustes globales como nivel de registro y habilitación de panel.

Configuración estática (traefik.yml)

Crear un archivo en el mismo directorio desde el que ejecuta el contenedor. A continuación se muestra un ejemplo de producción con puntos de entrada HTTP y HTTPs, configuración del proveedor Docker y Encrypt para SSL.

entryPoints:
 web:
 address: ":80"
 # Redirect HTTP to HTTPS if desired (commented out for initial setup)
 # http:
 # redirections:
 # entryPoint:
 # to: web-secure
 # scheme: https

 web-secure:
 address: ":443"

 dashboard:
 address: ":8080"

providers:
 docker:
 exposedByDefault: false # Only expose containers with traefik.enable=true
 network: traefik-net

api:
 dashboard: true
 debug: true

certificatesResolvers:
 letsencrypt:
 acme:
 email: [email protected]
 storage: /acme.json
 httpChallenge:
 entryPoint: web

log:
 level: INFO

Puntos clave:

  • Puntos de entrada : Defina los puertos nombrados. El punto de entrada utiliza el puerto 80; usa 443; utiliza 8080.
  • Proveedores]: El proveedor de Docker está configurado con — sólo se enrutarán los contenedores con la etiqueta . Esto evita la exposición accidental de servicios.
  • API & Dashboard: Permite el tablero para depurar. En producción, debe asegurar esto con el middleware de autenticación (ver sección avanzada).
  • Resolver clave: Usos Vamos a Encrypt's protocolo ACME con el reto HTTP-01. Reemplazar con su correo electrónico.
  • Nivel de log: Se establece a para una operación normal; use durante la solución de problemas.

Configuración dinámica a través de etiquetas Docker

Cuando Traefik corre con el proveedor Docker, lee etiquetas de contenedores de funcionamiento. Las etiquetas son metadatos adjuntos a contenedores que definen reglas de enrutamiento, middlewares y otros ajustes. Por ejemplo, un servicio web simple puede tener etiquetas como:

docker run -d \
 --name=app1 \
 --network=traefik-net \
 -l "traefik.enable=true" \
 -l "traefik.http.routers.app1.rule=Host(`app1.example.com`)" \
 -l "traefik.http.routers.app1.entrypoints=web-secure" \
 -l "traefik.http.routers.app1.tls.certResolver=letsencrypt" \
 my-web-image

Las etiquetas son analizadas por Traefik para construir routers, servicios y middlewares dinámicamente. Cualquier cambio en las etiquetas se produce inmediatamente sin reiniciar Traefik.

Implementación de los contenedores de aplicaciones

Ahora implementamos contenedores de aplicación reales con etiquetas que le dicen a Traefik cómo hacer ruta el tráfico. A continuación se presentan dos patrones comunes: un solo servicio de dominio y una ruta de enrutamiento para múltiples servicios.

Ejemplo 1: Servicio Web Simple con HTTPS

Supongamos que tiene un contenedor que ejecuta una aplicación web en el puerto 80 internamente. El objetivo es servirlo en . Correr:

docker run -d \
 --name=myapp \
 --network=traefik-net \
 -l "traefik.enable=true" \
 -l "traefik.http.routers.myapp.rule=Host(`myapp.example.com`)" \
 -l "traefik.http.routers.myapp.entrypoints=web-secure" \
 -l "traefik.http.routers.myapp.tls=true" \
 -l "traefik.http.routers.myapp.tls.certResolver=letsencrypt" \
 -l "traefik.http.services.myapp.loadbalancer.server.port=80" \
 my-web-app-image

Tenga en cuenta que especificamos explícitamente el puerto interno (]) porque el contenedor puede exponer múltiples puertos. Si el puerto del contenedor es correcto, Traefik puede auto-detectarlo, pero explícitamente es más seguro.

Ejemplo 2: Raza de ruta para múltiples servicios

Supongamos que usted tiene dos microservicios — y ]— ambos en el mismo dominio . Ruta a contenedor y a ].

Para el servicio API:

docker run -d \
 --name=api \
 --network=traefik-net \
 -l "traefik.enable=true" \
 -l "traefik.http.routers.api.rule=Host(`app.example.com`) && PathPrefix(`/api`)" \
 -l "traefik.http.routers.api.entrypoints=web-secure" \
 -l "traefik.http.routers.api.tls=true" \
 -l "traefik.http.routers.api.tls.certResolver=letsencrypt" \
 -l "traefik.http.services.api.loadbalancer.server.port=3000" \
 api-image

Para la parte delantera:

docker run -d \
 --name=frontend \
 --network=traefik-net \
 -l "traefik.enable=true" \
 -l "traefik.http.routers.frontend.rule=Host(`app.example.com`) && PathPrefix(`/`)" \
 -l "traefik.http.routers.frontend.entrypoints=web-secure" \
 -l "traefik.http.routers.frontend.tls=true" \
 -l "traefik.http.routers.frontend.tls.certResolver=letsencrypt" \
 -l "traefik.http.services.frontend.loadbalancer.server.port=80" \
 frontend-image

Traefik evalúa las reglas en orden de especificidad; caminos más específicos (como ) se combinan primero. Esto asegura que el backend correcto maneja cada solicitud.

Características avanzadas de Traefik

Más allá de la enrutadura básica, Traefik ofrece potentes características que aumentan la seguridad, la fiabilidad y la observabilidad.

Medios de información

Los equipos de seguridad son funciones que procesan las solicitudes antes de llegar al backend. Pueden ser encadenados y reutilizados en los routers.

  • BasicAuth: Proteger el tablero de instrumentos o un entorno de estancamiento.
  • RateLimit: Tranquiliza las solicitudes de un único IP.
  • Headers: Agrega los cabeceros de seguridad (por ejemplo, , ).
  • RedirectScheme: Fuerza HTTP a la redirección HTTPS.
  • IPWhiteList: Restringir el acceso a rangos IP específicos.

Ejemplo: Asegurar el panel Traefik con HTTP Basic Auth. Primero crear un archivo :

htpasswd -nB user | tee -a .htpasswd

A continuación, definir un middleware en un archivo de configuración dinámica (o a través de etiquetas en el contenedor Traefik) y hacer referencia al router de panel. Para la simplicidad, coloque el middleware en un archivo separado (por ejemplo, ) y carguelo a través del proveedor de archivos:

http:
 middlewares:
 dashboard-auth:
 basicAuth:
 usersFile: /etc/traefik/.htpasswd

Luego, actualice el contenedor Traefik para montar y el archivo ], y agregue una sección del proveedor de archivos en :

providers:
 file:
 filename: /dynamic.yml

Finalmente, etiqueta el router dashboard para utilizar el middleware (o definir el router dashboard en el proveedor de archivos). La documentación oficial Traefik proporciona una orientación detallada.

Equilibrio de carga

El balance de carga es automático cuando múltiples contenedores comparten el mismo nombre de servicio. Traefik distribuye las solicitudes entrantes utilizando un algoritmo de la rodaja por defecto. Puede ajustar pesos y pegajosa a través de etiquetas. Por ejemplo, el tráfico de propagación 70/30 entre dos versiones de una aplicación:

docker run -d \
 --name=myapp-v1 \
 --network=traefik-net \
 -l "traefik.http.services.myapp.loadbalancer.server.port=80" \
 -l "traefik.http.routers.myapp.rule=Host(`app.example.com`)" \
 -l "traefik.http.routers.myapp.service=myapp" \
 myapp:v1

docker run -d \
 --name=myapp-v2 \
 --network=traefik-net \
 -l "traefik.http.services.myapp.loadbalancer.server.port=80" \
 -l "traefik.http.services.myapp.loadbalancer.server.weight=30" \
 myapp:v2

Controles de salud

Traefik puede monitorear la salud de los contenedores backend y dejar de enrutarse a casos poco saludables. Configurar controles de salud en el servicio de balanceador de carga a través de etiquetas:

-l "traefik.http.services.myapp.loadbalancer.healthcheck.path=/health"
-l "traefik.http.services.myapp.loadbalancer.healthcheck.interval=10s"
-l "traefik.http.services.myapp.loadbalancer.healthcheck.timeout=3s"

Si un contenedor falla el cheque de salud, Traefik lo retira de la piscina hasta que pase de nuevo.

Monitorización con tablero de mando y métricas

El panel (disponible por defecto en el puerto 8080) proporciona visibilidad en tiempo real en routers, servicios, middlewares y salud. Para la producción, permite la integración de las métricas Prometheus:

metrics:
 prometheus:
 addEntryPointsLabels: true
 addServicesLabels: true

Luego raspa el punto final de la métrica (por defecto ) de Prometeo y visualiza con Grafana.

Beneficios de usar Traefik

Traefik simplifica los flujos de trabajo de despliegue de contenedores de manera que los proxies inversos tradicionales no pueden coincidir:

  • Zero-touch routing: Los nuevos contenedores se descubren y enrutan automáticamente sin reiniciar los archivos de configuración proxy o editando.
  • SSL integrada: Vamos a cifrar la integración automatiza la expedición y renovación de certificados, reduciendo errores de sobrecabezamiento manual y caducidad de certificados.
  • Layer 7 routing: Apoyo para el prefijo del camino, host, encabezados, parámetros de consulta y combinaciones complejas de reglas.
  • Ecosistema de microdirectrices: Conjunto rico de intermediarios integrados para la seguridad, la transformación y el agitamiento.
  • Multi-provider support: Use Docker, Kubernetes, Consul, o incluso configuración sencilla basada en archivos — Traefik se adapta.
  • Observabilidad: El tablero de instrumentos, los registros y las métricas ayudan a diagnosticar rápidamente los problemas de enrutamiento.

Estos beneficios se traducen en ciclos de despliegue más rápidos, menos errores de configuración y escalado más fácil. Cuando se reproduce un contenedor, Traefik automáticamente carga-equilibra en todas las instancias; cuando un contenedor se bloquea, el proxy inverso detiene inmediatamente el envío de tráfico a él.

Problemas comunes

Incluso con la automatización de Traefik, pueden surgir problemas. A continuación se presentan frecuentes obstáculos y sus soluciones.

  • Contenedor que no aparece en las rutas: Verifique que el contenedor está conectado a la misma red Docker () y tiene la etiqueta . También confirme no está bloqueando.
  • Certificado SSL no obtenido: Asegurar que su dominio se resuelva a la IP pública del servidor. Compruebe que el puerto 80 es accesible para el desafío HTTP-01. Si utiliza un desafío DNS, configure el proveedor correctamente. Compruebe los registros Traefik para errores de ACME.
  • Dashboard unreachable: El panel se sirve en el puerto 8080 por defecto. Si usted cambió el nombre de punto de entrada o el puerto, ajustar las etiquetas para el router de panel de control. También se asegura que se establece en el config estático.
  • Reglas de salida que no coinciden: Traefik evalúa las reglas en orden de cadena . Si dos routers coinciden con la misma solicitud, se utiliza la regla más específica. Use para combinar las condiciones. Reglas de prueba con e inspeccione el panel.
  • 502 Bad Gateway: Esto indica que Traefik no puede llegar al contenedor de backend. Asegurar que el contenedor escuche en el puerto especificado en y que la red del contenedor permite el tráfico de Traefik (ambos deben estar en la misma red de sobrevirajes o puente).

Siempre empieza con cuando se resuelven problemas para ver las decisiones detalladas de enrutamiento.

Consideraciones de seguridad

El funcionamiento de Traefik con el montaje de tomas de Docker presenta un riesgo inherente: si un atacante obtiene el control del contenedor Traefik, pueden manipular el daemon Docker.

  • Restricting access to the Docker socket: Use soluciones proxy de socket como para filtrar llamadas API.
  • Relanzar Traefik como usuario no raíz] con capacidades limitadas (utilizar y soltar ).
  • Redes de aislamiento: No conecte Traefik a la misma red que contenedores no confiados.
  • Activar la autenticación para el tablero de instrumentos ] y utilizar HTTPS para los puntos finales de administración.
  • Actualizaciones regionales: Mantenga Traefik y su imagen base hasta la fecha.

Además, configura reglas de cortafuegos para restringir el acceso al puerto 8080 sólo desde IPs internas (por ejemplo, su VPN).

Comparación con otros ejes inversos

Traefik no es el único proxy reverso para Docker; Nginx y HAProxy son alternativas populares. Aquí es como se destaca Traefik:

  • vs. Nginx: Nginx requiere una gestión manual de archivos de configuración o herramientas como nginx-proxy. Traefik proporciona integración nativa Docker sin scripts adicionales. Nginx tiene un soporte comunitario más amplio y es más ligero para configuraciones sencillas, pero la reconfiguración dinámica de Traefik es superior para entornos de rápida evolución.
  • vs. HAProxy: HAProxy se destaca en el equilibrio y rendimiento de carga TCP crudo, pero carece de un descubrimiento automático de servicio integrado y de integración en Encrypt. Traefik es más opinado y más fácil de configurar para HTTP/HTTPS en un ecosistema containerizzato.
  • vs. Caddy]: Caddy también cuenta con HTTPS automático y configuración sencilla, pero Traefik ofrece soporte de middleware más rico y un dashboard. Caddy es más sencillo para implementaciones de un solo contenedor; Traefik es mejor para microservicios.

Para los equipos que utilizan Docker Compose o Kubernetes, la integración de los proveedores de Traefik reduce significativamente la carga operacional.

Conclusión

[LT] Traef [Frek] [Frek] [Frek] [Frek] [Frek]] [Frek]] [Frek]] [Frek]] [Frek]] [Frek]] [Frek]] [Frek]]