Publica múltiples microservicios en Docker Swarm detrás de un reverse proxy sin pelearte con los puertos. Con Traefik, enrutas por subdominios usando un solo dominio raíz, etiquetas simples y una red overlay. Aquí verás cómo desplegarlo, etiquetar servicios y probar el enrutamiento con un Host header.
¿Por qué usar un reverse proxy con Traefik en Docker Swarm?
Cuando la plataforma crece y necesitas exponer varias apps (por ejemplo: clientes.dominio.com, blog.dominio.com), publicar cada servicio en un puerto distinto deja de escalar. Un reverse proxy decide a qué servicio enviar cada petición según el nombre de dominio. Con Traefik eso se vuelve simple: detecta servicios en Swarm y los expone detrás del mismo dominio, ruteando por subdominios.
Un dominio, muchos servicios. Mismo dominio raíz; subdominios para cada app.
Sin chocar puertos. Varias apps escuchando en 3000 detrás de Traefik que recibe en 80.
Descubrimiento automático. Traefik observa eventos del Swarm y actualiza rutas.
UI de administración. Dashboard para ver frontends y backends activos.
Nota: la idea aplica a varios orquestadores, pero aquí se usa solo Swarm. No necesitas otro cluster.
¿Cómo desplegar Traefik como servicio en Swarm?
Primero conectamos todo con una red overlay y luego levantamos Traefik con los permisos justos para descubrir servicios en Swarm. Publicamos 80 para tráfico HTTP y 9090 para la UI (mapea al 8080 interno, que suele usar el visualizador de Swarm).
¿Qué red overlay crear para conectar servicios?
docker network create -d overlay proxynet
Overlay para servicios desacoplados. Los microservicios no hablan entre sí, pero sí con Traefik.
Aislamiento claro. Solo lo que agregas a la red puede ser ruteado por Traefik.
node.role==manager. Traefik necesita escuchar eventos del Swarm.
/var/run/docker.sock. Acceso al socket del daemon para descubrir servicios.
80 y 9090. HTTP público y dashboard. 9090 mapea al 8080 interno.
--docker.domain=guido.com. Dominio raíz para subdominios automáticos.
--docker.watch y --api. Descubrimiento dinámico y UI.
¿Qué ver en la UI y en el puerto 80?
Al inicio, la UI en 9090 no muestra rutas porque no hay servicios etiquetados.
En 80 verás 404 hasta que Traefik sepa a qué servicio enviar según el Host header.
¿Cómo publicar servicios y enrutar por subdominios?
Traefik usa etiquetas para saber a qué puerto interno enviar el tráfico. Conectar cada servicio a la overlay y agregar la label correcta es suficiente. El subdominio sale del nombre del servicio.
traefik.port=3000. Traefik recibe en 80 y reenvía al 3000 interno.
Nombre del servicio = subdominio. app1.guido.com y app2.guido.com.
¿Cómo probar con Host header y un solo dominio?
# Desde un nodo del Swarmcurl -H "Host: app1.guido.com" http://localhost
curl -H "Host: app2.guido.com" http://localhost
Responde el contenedor correcto según el Host header.
Si escalas un servicio, Traefik balancea entre sus tareas.
Nota sobre Play With Docker: su URL pública no es guido.com y maneja headers para redirigir tráfico; por eso las pruebas externas con Host header pueden no funcionar. Dentro del nodo, con curl, sí funciona. En un entorno productivo estándar, el enrutamiento por subdominios funciona como se espera.
¿Cómo actualizar una app en caliente?
# Cambiar la imagen de app2 sin recrear el servicio enterodockerservice update --image gildarino/swarm-networking app2
Actualizaciones rápidas. Cambias la imagen y Traefik sigue ruteando sin cambios.
¿Qué muestra el dashboard de Traefik?
Frontends. Reglas de entrada por dominio/subdominio.
Backends. Servidores destino; varios pueden escuchar en 3000 sin conflicto.
Si llamas a Swarm:3000 directamente, no sirve. Debe ser 80 con el dominio correcto para que Traefik decida.
¿Tienes dudas, tips o quieres compartir cómo ruteas por subdominios en Swarm con Traefik? Comenta y profundizamos juntos.
Lo que hace Traefik es que va a detectar que servicios hay en el swarm y los va a incorporar a su lista de reverse proxy en fucnión de algunas etiquetas que pondremos en los servicios, para que eso pase, Traefik va a tener que escuhar los eventos del Swarm, y para que Traefik pueda escuchar los eventos del Swarm va a tener que tener accesso al sokcet del Docker Deamon del Manager, por lo que debe correr en un nodo Manager.
Les dejo el comando largo para crear el servicio de Traefik. En 2021 sigue sin funcionar si no le pones un tag a la imagen de traefik, le puse la version 1.7 y me funcionó sin problema.
Sale un error si colocal la imagen sin un tag . Al parecer la última versión no funciona. Traten con la version 1.7
..... --network proxy-net traefik:1.7 --docker --docker.swarmMode --docker.domain=g u i do .com --docker.watch --api
puedo tener varios contenedores que respondan al mismo subdominio?
Hola,
¿En caso de usar Traefik como proxy inverso, cómo se recomienda manejar el balanceo de carga del Swarm, se dejaría corriendo en todos los manager y Traefik hace le resto?
y otra pregunta:
¿si generamos certificados SSL cómo recomiendan manejar la persistencia de esos certificados, usarían algún sistema de archivos distribuidos, cuál recomendarían en ese caso?
Por qué no se usa ngnx para hacer proxy reverse?
Traefik es un reverse proxy y balanceador de carga moderno que se utiliza para gestionar el tráfico hacia múltiples servicios en una infraestructura. A través de sus funcionalidades, puede dirigir las solicitudes a los contenedores adecuados en función de las reglas que defines, lo que lo hace ideal para usar en entornos como Docker Swarm. Además, permite exponer múltiples aplicaciones bajo el mismo dominio, diferenciando por subdominios o rutas. Por lo tanto, sí, Traefik actúa como un balanceador de cargas.
Trraefik lo que es, es un Similar a Nginx proxies inversos y balanceadores de carga,
Como aparte les comparto lo que dice la documentacion acerca del riesgo de acceder a socket a traves del mismo sistema como lo hacemos en la clase. En la documentacion nos comparte algunas soluciones a este riesgo de seguridad.
un genio Guido, millones de gracias.
Crack!
Porque no me funciona el traefik cuando al servicio le agrego la etiqueta port
Alguien me puede decir como hago para poder conectar mi servicio al traefik y a su vez conectarme por la ip al puerto 3000
Prueba sin publicar el puerto del servicio (eliminando -p 3000:3000 de tu comando). Esa opción indica que quieres publicar el puerto 3000 del servicio en el 3000 del cluster de VMs; pero no necesitas hacerlo porque ese servicio se expone a través de traefik
Esto se puede probar de manera local , estoy con windows ?
docker service create --name proxy --constraint=node.role==manager -p 81:80 -p 9091:8080 --net
work proxy-net traefik --docker --docker.swarmMode --docker.domain=maccevedor.com --docker.watch --api
n5n9nhgigf8ybc9zeujkea4oo
overall progress: 0 out of 1 tasks
1/1: starting
verify: Detected task failure
Operation continuing in background.
Use docker service ps to check progress.