首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有traefik和docker的端口转发-合成

带有traefik和docker的端口转发-合成
EN

Stack Overflow用户
提问于 2020-07-30 12:18:05
回答 1查看 5.4K关注 0票数 0

我想通过货运代理提供码头写作服务。我做了很多尝试,从现在起我能做到的最好的事情如下:

首先我创建了两个网络:

代码语言:javascript
复制
docker network create frontend  # To expose traefik
docker network create backend   # To bind backend services

traefik配置是关于(开发,在:8080上启用仪表板):

代码语言:javascript
复制
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的一个分支,但它可以是其他任何东西):

代码语言:javascript
复制
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上运行,我希望通过traefik在:8090上访问它。

当我运行这两个应用程序时,traefik注册新服务并且不抱怨(没有错误,没有警告,至少从仪表板接口看,流程似乎是完整的)。

代码语言:javascript
复制
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?非常感谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-31 05:48:36

Traefik在某个端口上监听,这是使用entrypoints定义的唯一功能。您没有为这个传入请求指定网络,因为它是不相关的。traefik.docker.network仅用于在 Traefik处理传入请求后路由

所以正确的流不是http://frontend:8090 -> http://backend:8080,而是http://host:8090 -> http://backend:8080

我认为你的配置是正确的。唯一奇怪的是Host规则的使用。也许试着把它改成这样的东西:

代码语言:javascript
复制
"traefik.http.routers.chirpstack.rule=hostregexp(`{host:.+}`)"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63173014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档