Перенаправление портов с помощью traefik и docker-compose

Я хотел бы обслуживать службу создания докеров через traefik с переадресацией портов. У меня было много попыток, и лучшее, чего я смог достичь, описано ниже:

Сначала я создаю две сети:

docker network create frontend  # To expose traefik
docker network create backend   # To bind backend services

Конфигурация traefik примерно такая (разработка, дашборд включен на :8080):

version: "3.6"

services:
  proxy:
    image: traefik:latest
    restart: unless-stopped
    command:
      - "--log.level=DEBUG"
      - "--api"
      - "--api.dashboard"
      - "--api.insecure"
      - "--providers.docker"
      - "--providers.docker.exposedbydefault=false"
      # Service entrypoint:
      - "--entrypoints.lora-server.address=:8090"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=frontend"
      - "traefik.http.routers.traefik.entrypoints=traefik"
      - "traefik.http.routers.traefik.service=api@internal"
    networks:
      - backend
      - frontend
    ports:
      - "8080:8080"
      - "8090:8090"

networks:
  frontend:
    external: true
  backend:
    external: true

Серверная служба описана здесь (форк от ChripStack, но это может быть что угодно):

version: "3"

services:
  # [...]
  chirpstack-application-server:
    image: chirpstack/chirpstack-application-server:3
    networks:
      - backend
    volumes:
      - ./configuration/chirpstack-application-server:/etc/chirpstack-application-server
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=backend"
      - "traefik.http.routers.chirpstack.entrypoints=lora-server"
      - "traefik.http.routers.chirpstack.rule=Host(`{host:}`)"
      - "traefik.http.routers.chirpstack.service=chirpstack-application-server@docker"
      - "traefik.http.services.chirpstack-application-server.loadbalancer.server.port=8080"
# [...]
networks:
  backend:
    external: true

Служба также изначально работает на :8080, и я хотел бы получить к ней доступ на :8090 через traefik.

Когда я запускаю оба приложения, traefik регистрирует новую службу и не жалуется (ни ошибок, ни предупреждений, поток кажется завершенным, по крайней мере, из интерфейса панели инструментов).

time="2020-07-30T11:47:47Z" level=debug msg="Creating middleware" middlewareType=Pipelining serviceName=chirpstack-application-server@docker entryPointName=lora-server routerName=chirpstack@docker middlewareName=pipelining
time="2020-07-30T11:47:47Z" level=debug msg="Creating load-balancer" entryPointName=lora-server routerName=chirpstack@docker serviceName=chirpstack-application-server@docker
time="2020-07-30T11:47:47Z" level=debug msg="Creating server 0 http://192.168.112.9:8080" entryPointName=lora-server routerName=chirpstack@docker serviceName=chirpstack-application-server@docker serverName=0
time="2020-07-30T11:47:47Z" level=debug msg="Added outgoing tracing middleware chirpstack-application-server@docker" middlewareName=tracing entryPointName=lora-server routerName=chirpstack@docker middlewareType=TracingForwarder

введите здесь описание изображения введите здесь описание изображения

Но я не смог получить доступ к сервису, при попытке подключиться http://host:8090 получаю ошибку 404.

Насколько я понимаю, кажется, что traefik не знает, как он должен завершить поток между двумя сетями: http://frontend:8090 -> http://backend:8080 (потому что я нигде не упоминал об этом).

Что мне нужно изменить в моей конфигурации, чтобы она заработала? Как я могу указать traefik, что он должен направлять HTTP-трафик с frontend:8090 на backend:8080? Ваша помощь очень ценится.


person jlandercy    schedule 30.07.2020    source источник


Ответы (1)


Traefik прослушивает какой-то порт, это единственное, что определено с помощью entrypoints. Вы не указываете сеть для этих входящих запросов, потому что это не связано. traefik.docker.network используется только для маршрутизации после обработки Traefik входящих запросов.

Так что правильный поток не http://frontend:8090 -> http://backend:8080, а http://host:8090 -> http://backend:8080.

Я думаю, что ваша конфигурация правильная. Единственное, что кажется странным, это использование правила Host. Может быть, попробовать изменить его на что-то вроде этого:

"traefik.http.routers.chirpstack.rule=hostregexp(`{host:.+}`)"
person dmaixner    schedule 31.07.2020