Configuración de Docker Swarm, el archivo traefik-stack.yaml tiene la configuaración básica necesaria para hacer funcionar al proxy reverso, y un ejemplo con un servicio sonso en whoami-stack.yaml.
version: '3' | |
services: | |
reverse-proxy: | |
image: traefik:v2.2 | |
command: | |
- --api.insecure=true | |
- --api.dashboard=true | |
- --providers.docker=true | |
- --providers.docker.swarmMode=true | |
- --providers.docker.exposedbydefault=false | |
- --providers.docker.network=proxy | |
- --entrypoints.http.address=:80 | |
- --entrypoints.https.address=:443 | |
ports: | |
# The HTTP port | |
- "80:80" | |
- "443:443" | |
volumes: | |
# So that Traefik can listen to the Docker events | |
- /var/run/docker.sock:/var/run/docker.sock | |
networks: | |
- proxy | |
deploy: | |
placement: | |
constraints: | |
- node.role == manager | |
labels: | |
- "traefik.enable=true" | |
- "traefik.http.routers.api.rule=Host(`dashboard.traefik.localhost`)" | |
- "traefik.http.routers.api.service=api@internal" | |
- "traefik.http.routers.api.entrypoints=http" | |
- "traefik.http.services.api.loadbalancer.server.port=80" | |
networks: | |
proxy: | |
external: true |
version: '3' | |
services: | |
whoami: | |
# A container that exposes an API to show its IP address | |
image: containous/whoami | |
networks: | |
- proxy | |
deploy: | |
labels: | |
- "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)" | |
- "traefik.enable=true" | |
- "traefik.http.routers.whoami.entrypoints=http" | |
- "traefik.http.services.whoami.loadbalancer.server.port=80" | |
networks: | |
proxy: | |
external: true |
Teniendo los archivos de configuración listos, debemos ejecutar los siguientes comandos para levantar el cluster.
1 2 3 |
docker network create --driver=overlay proxy docker stack deploy -c traefik-stack.yaml traefik docker stack deploy -c whoami-stack.yaml whoami |
Ahora expliquemos un poco…
Como habran notado la magia para publicar servicios realmente esta en la siguiente sección, en los labels que le pongo al servicio dentro de deploy:
1 2 3 4 5 6 |
deploy: labels: - "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)" - "traefik.enable=true" - "traefik.http.routers.whoami.entrypoints=http" - "traefik.http.services.whoami.loadbalancer.server.port=80" |
En la linea "traefik.http.routers.whoami.rule=Host(whoami.localhost)"
lo que hacemos decirle a que URL va a responder.
En la linea "traefik.enable=true"
le informamos a Traefik que nos interesa publicar este servicio. Esto es necesario ya que en la configuración de Traefik pusimos de que no queremos que tome todos los servicios publicados por default.
Ahora cuando dice "traefik.http.routers.whoami.entrypoints=http"
le estamos diciendo que debe escuchar el puerto 80 (lo configuramos en el archivo traefik-stack.yaml:16) en el host y por último "traefik.http.services.whoami.loadbalancer.server.port=80"
nos dice que puerto debemos mapear del contenedor/servicio.