Implementación de Reverse Proxy con Traefik en Docker Swarm
Clase 20 de 24 • Curso de Swarm
Contenido del curso
Primeros pasos
- 6

Instalación de Docker en Mac, Ubuntu y Windows
10:13 min - 7

Cómo iniciar Docker Swarm en tu máquina
08:35 min - 8

Creando servicios en Docker Swarm
05:36 min - 9

Cómo funciona docker service ps internamente
11:09 min - 10

Qué es Play with Docker para practicar
06:27 min - 11

Creando un Docker Swarm multinodo real
06:15 min
Administrando Servicios
Swarm avanzado
- 15

Cómo Docker Swarm enruta tráfico sin perder peticiones
06:56 min - 16

Docker Swarm constraints: dónde correr cada tarea
09:04 min - 17

Cómo drenar nodos en Docker Swarm sin downtime
07:56 min - 18

Redes Overlay en Docker Swarm: Comunicación entre Servicios
13:39 min - 19

Docker Stack: automatiza despliegues multinodo
10:49 min - 20

Implementación de Reverse Proxy con Traefik en Docker Swarm
Viendo ahora
Swarm productivo
Conclusiones
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.
¿Qué flags y puertos necesita Traefik?
docker service create \
--name proxy \
--constraint 'node.role==manager' \
--publish 80:80 \
--publish 9090:8080 \
--mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock \
--network proxynet \
traefik \
--docker \
--docker.swarmmode \
--docker.domain=guido.com \
--docker.watch \
--api
- 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.
¿Cómo crear servicios con etiquetas traefik.port?
# Servicio 1 en el puerto interno 3000
docker service create \
--name app1 \
--network proxynet \
--label traefik.port=3000 \
<imagen-que-escucha-en-3000>
# Servicio 2 (mismo patrón)
docker service create \
--name app2 \
--network proxynet \
--label traefik.port=3000 \
<misma-o-otra-imagen>
- 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 Swarm
curl -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 entero
docker service 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.