首页 文章

使用Traefik路由Traefik UI

提问于
浏览
1

我是Docker和Traefik的新手,所以我决定和他们一起玩 . 我试着按照这个数字海洋教程:https://www.digitalocean.com/community/tutorials/how-to-use-traefik-as-a-reverse-proxy-for-docker-containers-on-ubuntu-16-04

我正在尝试运行一个简单的traefik docker容器,并通过traefik重定向访问端口8080上的Web UI,I.E,我想在https://myhost/traefik访问traefik UI

我没有域名,所以我不想使用主机规则与Traefik重定向 . 相反,我想使用PathPrefixStrip规则 .

这是我的文件 run_traefik.sh

#!/bin/bash

docker run \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v $PWD/traefik.toml:/traefik.toml \
  -v $PWD/acme.json:/acme.json \
  -p 80:80 \
  -p 443:443 \
  -l traefik.port=8080 \
  -l traefik.backend=traefik_dashboard \
  -l "traefik.frontend.rule=PathPrefixStrip:/traefik/" \
  --network proxy_network \
  --name traefik \
  traefik:1.3.6-alpine --web --docker --docker.domain=docker.localhost --logLevel=DEBUG

这是我的 traefik.toml 文件:

defaultEntryPoints = ["http", "https"]

[web]
adress = ":8080"
    [web.auth.basic]
    users = ["admin:$apr1$lVhuCVSI$JrCUdpV0PmduJ1b7FzhrX1"]


[entryPoints]
  [entryPoints.http]
  adress = ":80"

  [entryPoints.https]
  adress = ":443"
    [entryPoints.https.tls]

[acme]
email = "myemail@provider.com"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
onDemand = false

[acme.httpChallenge]
entryPoint = "http"

[docker]
domain = "docker"
endpoint = "unix:///var/run/docker.sock"
watch = true

为了让LE工作,我还是 touch acme.jsonchmod 600 acme.json .

这是我的问题:

当我尝试访问https://myhost/traefik时,我被重定向到https://myhost/dashboard/,所以我得到了404 NOT FOUND错误 .

奇怪的是,当我尝试访问https://myhost/traefik/dashboard/#/时,它将我重定向到https://myhost/dashboard/#/所以它运作良好

但我不想指定完整的路径!当我在docker run中暴露端口8080并尝试访问http://myhost:8080时,我被重定向到没有问题http://myhost:8080/dashboard/#/

我不知道如何配置Traefik以便https://myhost/traefik将我重定向到https://myhost:8080/dashboard/#/而不会失败....

我正在使用Traefik v1.5.1 / cancoillotte和Docker版本17.12.0-ce,构建c97c6d6


更新:

我现在正在使用 run_traefik.sh

#!/bin/bash

docker run \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v $PWD/traefik.toml:/traefik.toml \
  -v $PWD/acme.json:/acme.json \
  -p 80:80 \
  -p 443:443 \
  --network proxy_network \
  --name traefik \
  traefik:1.5.1-alpine --web --docker --docker.domain=docker.localhost --logLevel=DEBUG

这个 traefik.toml

defaultEntryPoints = ["http", "https"]

[entryPoints]
 [entryPoints.http]
 adress = ":80"
 [entryPoints.https]
 adress = ":443"
   [entryPoints.https.tls]

 [entrypoints.api]
   address=":8081"
     [entryPoints.api.auth]
     [entryPoints.api.auth.basic]
         users = ["admin:$apr1$2Z7qoaOC$lCGDDfRCWWJrkJUrdJotW1"]

 [entrypoints.dashboard]
  address=":8080"

#Activate API and Dashboard
[api]
entrypoint="api"

[file]
  [backends]
    [backends.backend1]
      [backends.backend1.servers.server1]
      url = "http://127.0.0.1:8081"

    [backends.backend2]
    [backends.backend2.servers.server1]
    url = "http://127.0.0.1:8080"

  [frontends]
    [frontends.frontend1]
    entrypoints=["dashboard"]
    backend = "backend2"
      [frontends.frontend1.routes.test_1]
      rule = "PathPrefixStrip:/traefik;PathPrefix:/traefik"

[acme]
 email = "myemail@provider.com"
 storage = "acme.json"
 entryPoint = "https"
 onHostRule = true
 onDemand = false
 [acme.httpChallenge]
   entryPoint = "http"

[docker]
 domain = "docker"
 endpoint = "unix:///var/run/docker.sock"
 watch = true

试图访问http://myhost/traefik/ nows将我重定向到http://myhost/traefik/#/ . 我可以看到dasboard UI而不是内容 .

我的意思是除了导航菜单外,页面都是空的 . 我可以访问 Health 部分并查看一些图表,但我看不到任何前端或后端 . 当然,当在 docker run 中暴露端口8081时,我可以访问http://myhost:8081/dashboard/#/处的仪表板并查看所有前端和后端 .

任何见解?

1 回答

  • 0

    至少对我来说,这个问题令人惊讶地难以理解 . 我的同事总是说没有什么是你无法解决的更多层次的间接,但我担心这里的额外间接至少会给我带来很多困惑 .

    为了解决使用traefik路由到traefik ui并具有基本身份验证的问题,我们必须使用两个间接 .

    首先,我们希望用户只需转到 server.domain/traefik - 所以我们需要您提到的前缀规则(此时,我只使用 PathPrefix 而不使用 Strip ) .

    我们不希望用户必须指定任何特定端口,因此应该为绑定到默认http / https入口点的前端定义此规则 .

    而且这个规则的后端,不应该是ui所在的地址 - 因为那时我们只是访问ui,而错过了身份验证 .

    相反,我们指向一个虚拟后端,这是我们的身份验证入口点 . 那个定义了认证信息 .

    然后我们需要另一个前端后端对 - 前端可以使用相同的前缀匹配器,但应该剥离;它应该绑定到我们的身份验证入口点 . 这个前端的后端现在可以指向实际的ui .

    为了简化这个故事,这是一个基于最新图像的最小工作示例 .

    运行脚本(或者您可以将其作为命令运行,它很短):

    #!/bin/bash
    
    docker run --rm \
      -v $PWD/traefik.toml:/traefik.toml \
      -p 80:80 \
      --name traefik \
      traefik:1.6.5 --logLevel=INFO
    

    配置文件 config.toml 可能如下所示:

    defaultEntryPoints = ["http"]
    
    [api]
    dashboard = true
    
    [entryPoints]
      [entryPoints.http]
      address = ":80"
    
      [entryPoints.authenticate]
      address = ":8081"
      [entryPoints.authenticate.auth.basic]
      users = ["admin:$apr1$HfCMaXX3$CRNkKZHTHkQEhoTMIXadD/"]
    
    [file]
      [backends]
        [backends.backend1]
          [backends.backend1.servers.server1]
          url = "http://127.0.0.1:8081"
    
        [backends.backend2]
          [backends.backend2.servers.server1]
          url = "http://127.0.0.1:8080"
    
      [frontends]
        [frontends.frontend1]
          backend = "backend1"
          [frontends.frontend1.routes.test_1]
          rule = "PathPrefix:/traefik"
        [frontends.frontend2]
          backend = "backend2"
          entrypoints=["authenticate"]
          [frontends.frontend2.routes.test_1]
          rule = "PathPrefixStrip:/traefik"
    

    此外,听起来可能会非常痛苦,但是这两个代码示例都有一个拼写错误,即使在调试模式下也不会抛出任何明显的错误消息: address 拼写为英语中的两个d:/我经常犯这个错误 . ...

    在日志中暗示的线条是

    time="2018-07-19T17:52:29Z" level=info msg="Server configuration reloaded on "
    time="2018-07-19T17:52:29Z" level=info msg="Server configuration reloaded on "
    time="2018-07-19T17:52:29Z" level=info msg="Server configuration reloaded on :8081"
    time="2018-07-19T17:52:29Z" level=info msg="Server configuration reloaded on :8080"
    

    从一个我有http和https入口点的运行 - 这两个是从你的例子与地址进行复制,而糟糕的traefik不知道如何处理它...编辑:此外, entrypoints 有时写成全部小写,并且有时 entryPoints - 你在api入口点的定义中有一个拼写错误 .

    希望这可以帮助!

相关问题