【问题标题】:Traefik docker config path-based routing with rewritingTraefik docker config 基于路径的路由和重写
【发布时间】:2021-11-29 16:39:20
【问题描述】:

traefik 的 2 天大新手,需要帮助了解 istm 是 traefik v2 中基本的第一个 docker 提供程序配置...

我试过搜索文档,但不知道该怎么做。

我想要像这样的 docker 容器

  • app1
  • app2
  • app3

并通过 traefik 通过 url 访问这些内容

  • http://app.mydomain.com/app1
  • http://app.mydomain.com/app2
  • http://app.mydomain.com/app3

但是应用程序本身不喜欢这些额外的路径,所以我想从访问路径中去掉前缀,这样应用程序就看不到它们了。

如果我访问http://app.mydomain.com/app2/foo,我希望容器app2 获取请求http://{container.ip.addr}}/foo

作为一个复制者,我知道部分有效的配置在我的 traefik docker-compose.yml 中有以下内容:

version: "3"
services:
  traefik:
    image: "traefik:v2.5.4"
    command:
      - --entrypoints.web.address=:80
      - --providers.docker=true
      - --api
      - --api.insecure=true
      - --api.dashboard=true
      - --providers.file.directory=/etc/traefik/dynamic
      - --providers.docker.defaultRule=Host(`app.mydomain.com`) && PathPrefix(`/{{ index .Labels "com.docker.compose.service" }}`)
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

  app1:
    image: containous/whoami:v1.3.0
  app2:
    image: containous/whoami:v1.3.0
  app3:
    image: containous/whoami:v1.3.0

127.0.0.1 app.mydomain.com 添加到\etc\hosts 后,对http://app.mydomain.com/app{1,2,3}/foo 进行curl 处理,这会路由到正确的服务,但他们收到的请求路径是/app1/foo/app2/foo/app3/foo,而我想要他们都得到/foo

我觉得我希望能够将以下内容添加到 docker-compose 中的命令行参数中:

--providers.docker.middleware.default-stripprefix.stripprefix.prefixes=`/{{ index .Labels "com.docker.compose.service" }}`

但它不起作用(错误:command traefik error: failed to decode configuration from flags: field not found, node: middleware

我找不到任何说明正确命令行参数可能是什么的文档。

我在想它可能需要在一个动态配置文件中(我已经看到这太搞乱 tls 配置了,但在这个阶段想把所有这些都排除在复制之外!)但似乎又不能找到默认中间件的正确配置。

我可以找到很多引用(并让它工作),我必须在每个容器的标签中指定它,但我更愿意在 traefik 配置本身中使用一次性条目默认它。

这两天我一直在为此苦恼。我试过搜索文档站点、这个社区和 googleverse,但没有运气。对我来说,这似乎是一个“101”配置! :-)

请有人帮助我不仅解决我的问题,还可以选择教我如何在文档站点中自己找到解决方案。我已经看到很多关于 doc 网站很好的提及,但对于 v2 而言,它们对我来说似乎很少。

【问题讨论】:

    标签: docker traefik


    【解决方案1】:

    好的,所以我会发布我的答案,以防有人发现并想知道。

    中间件需要在 Traefik dynamic 配置文件中定义。

    这可以在 static 配置文件的端点规范中引用。

    一旦我需要一个单独的文件来进行动态配置,我决定也使用一个文件来进行静态配置,而不是命令行参数。

    所以3文件解决方案是:

    docker-compose.yml

    version: "3"
    services:
      traefik:
        image: "traefik:v2.5.4"
        ports:
          - "80:80"
          - "8080:8080"
        volumes:
          - "/var/run/docker.sock:/var/run/docker.sock:ro"
          - "{path}/traefik.yml:/etc/traefik/traefik.yml:ro"
          - "{path}/dynamic.yml:/etc/traefik/dynamic.yml:ro"
    
      app1:
        image: containous/whoami:v1.3.0
      app2:
        image: containous/whoami:v1.3.0
      app3:
        image: containous/whoami:v1.3.0
    

    traefik.yml

    api:
      insecure: true
      dashboard: true
    providers:
      docker:
        defaultRule: "Host(`app.mydomain.com`) && PathPrefix(`/{{ index .Labels \"com.docker.compose.service\" }}`)"
      file:
        filename: "/etc/traefik/dynamic.yml"
    entrypoints:
      web:
        address: ":80"
        http:
          middlewares:
            - root-stripprefix@file
    

    dynamic.yml

    http:
      middlewares:
        root-stripprefix:
          stripPrefixRegex:
            regex:
              - "/[^/]+"
    

    动态配置指定了一个 StripPrefix 中间件——我实际上使用了 StripPrefixRegex 来抓取路径第一部分中的任何内容,而无需指定它。

    然后,此中间件与 Web 端点相关联,因此它适用于所有使用它的东西。

    这相当简单地解决了这个问题,但在能够到达那里之前,这是一个了解 Traefik 文档和配置系统的过程。如果需要更多详细信息,我已在 this post 中更详细地记录了旅程。

    关于现实世界的容器间连接的额外说明...

    另请注意,在一个更真实的示例中,使用单独的 docker-compose 文件,有必要通过将详细信息附加到每个 docker-compose 文件来允许 traefik 和 app 容器通过连接到同一网络进行通信,例如:

    service:
      app1:
    ...
        networks:
          - proxy
    networks:
      proxy:
        external: true
        name: proxy
    

    在第一次使用一次性命令docker network create proxy 创建网络之后。

    我再次更详细地写了这个想法 - 请参阅this post

    希望这可以帮助某人至少节省我在这方面花费的一些时间。

    【讨论】:

      猜你喜欢
      • 2014-09-07
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多