使用Traefik路由路径

时间:2017-01-13 15:17:25

标签: docker docker-compose traefik

目前我正在尝试使用Traefik为一些docker容器设置一个loadbalancer / reverse代理。我在配置Treafik以使用一些前缀路径使我的应用程序可用时遇到了麻烦。基于this example,我能够使用Docker和Docker组合运行基本的Traefik配置。问题是我能够在路径上获得'whoamI'容器,但不能在我的app和其他容器中访问。

例如,我创建了一个docker-compose文件(见下文)来启动whoamI容器和五个Portainer容器(这样人们可以重新创建场景)。我希望fetch/wai的Portainer可以使用woamI。

相反,我可以访问whoamI网络服务器(通过/portainer1)而不是Portainer(通过/wai)。但是,我可以/portainer1到达Portainer。这两者之间Traefik配置的唯一区别是使用'PathStrip'而不是'Path'。然而,令人烦恼的是,我只能在导航到/portainer2时获得白页;只加载页面标题和一些html。我还启动了一个暴露给主机的Portainer容器,以验证预期的行为(一个普通的Portainer页面)。另见下图。

修改

有趣的是,我也可以通过/portainer2(但不是/portainer4/)与Portainer联系,从而产生相同的白页。导航到/portainer4/portainer2/之间的区别在于我注意到Traefik中有一些额外的日志记录(见下文)。当通过/portainer4/导航到Portainer时,日志中会显示三条额外的行,表示400状态。经过一番调查后,我发现这是因为我的浏览器试图加载其他文件(即javascript文件,favicon和样式表)。因此,当在/portainer4/访问Portainer时,我的浏览器知道它需要获取这些额外的文件并尝试这样做(导航到/portainer4/时不会发生这种情况)。在尝试自行访问文件时,例如导航到/portainer2,我会得到/portainer4/ico/favicon.ico。最后,导航到400 Bad Request时会看到/portainer2/ico/favicon.ico

基于这些结果,我想知道:

  • 为什么我无法通过/ portainer1到达Portainer,而是在 / portainer2?
  • 导航到时为什么我看不到完整的Portainer页面 / portainer2?
  • 为什么在404 page not found/portainer2/
  • 之间访问文件(例如图标)之间的行为有所不同
  • 400 Bad Request实际意味着什么以及此问题是否/如何解决此问题

我真的很欣赏正确方向的一些指示

一些截图: Different Treafik paths

搬运工-compose.yml:

/portainer4/

分别访问version: '2' services: traefik: container_name: traefik image: traefik command: --web --docker --docker.domain=docker.localhost --logLevel=DEBUG ports: - "80:80" - "8080:8080" volumes: - /var/run/docker.sock:/var/run/docker.sock - /dev/null:/traefik.toml labels: - "traefik.enable=false" whoami: image: emilevauge/whoami labels: - "traefik.backend=whoami" - "traefik.frontend.rule=Path: /wai/" portainer1: image: portainer/portainer labels: - "traefik.backend=portainer1" - "traefik.frontend.rule=Path: /portainer1/" portainer2: image: portainer/portainer labels: - "traefik.backend=portainer2" - "traefik.frontend.rule=PathStrip: /portainer2/" portainer: image: portainer/portainer ports: - "9000:9000" labels: - "traefik.enable=false" /wai/portainer1/<myIP>/portainer2//portainer3/后生成的其他Traefik日志记录:

/portainer4/

2 个答案:

答案 0 :(得分:8)

今天早上我找到了解决方案。在这种情况下,正确的方法应该是使用PathPrefixStrip规则。但是,作为mentioned here,在规则末尾放置/会破坏设置。我通过删除/规则末尾的PathPrefixStrip: /portainer4/来创建了有效的配置。所以这个docker-compose配置对我有用:

version: '2'

services:
  traefik:
    container_name: traefik2
    image: traefik
    command: --web --docker --docker.domain=docker.localhost --logLevel=DEBUG
    ports:
      - "80:80"
      - "8081:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /dev/null:/traefik.toml
    labels:
        - "traefik.enable=false"
  portainer:
    image: portainer/portainer
    labels:
      - "traefik.backend=portainer"
      - "traefik.frontend.rule=PathPrefixStrip: /portainer"

现在,当我导航到<myIP>/portainer/时,我看到了移植页面。但是,当我导航到<myIP>/portainer时,我仍然可以获得前面提到的白页。

答案 1 :(得分:7)

针对未来的Googler

不加斜杠不起作用的原因是一个现有问题

https://github.com/containous/traefik/issues/563

对于v2泊坞窗标签

      - "traefik.http.routers.portainer-secure.rule=Host(`your-domain.com`) && PathPrefix(`/portainer`)"

      - "traefik.http.routers.portainer-secure.middlewares=portainer-redirectregex, portainer-replacepathregex"

      - "traefik.http.middlewares.portainer-replacepathregex.replacepathregex.regex=^/portainer/(.*)"
      - "traefik.http.middlewares.portainer-replacepathregex.replacepathregex.replacement=/$$1"
      - "traefik.http.middlewares.portainer-redirectregex.redirectregex.regex=^(.*)/portainer$$"
      - "traefik.http.middlewares.portainer-redirectregex.redirectregex.replacement=$$1/portainer/"