Docker 使用Traefik路由Traefik UI

Docker 使用Traefik路由Traefik UI,docker,reverse-proxy,traefik,Docker,Reverse Proxy,Traefik,我是Docker和Traefik的新手,所以我决定和他们玩一会儿。我尝试了以下数字海洋教程: 我正在尝试运行一个简单的traefik docker容器,并通过traefik重定向访问端口8080上的web UI,也就是说,我想在 我没有域名,所以我不想使用主机规则重定向Traefik。相反,我想使用PathPrefixStrip规则 这是我的文件run\u traefik.sh: #!/bin/bash docker run \ -v /var/run/docker.sock:/var/r

我是Docker和Traefik的新手,所以我决定和他们玩一会儿。我尝试了以下数字海洋教程:

我正在尝试运行一个简单的traefik docker容器,并通过traefik重定向访问端口8080上的web UI,也就是说,我想在

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

这是我的文件
run\u 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
#!/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"]

[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
我必须触摸acme.json和chmod 600 acme.json才能让LE工作

我的问题是:

当我尝试访问时,我被重定向到,因此我得到一个404NotFound错误

奇怪的是,当我尝试访问它时,它会将我重定向到,这样它就可以正常工作

但我不想指定完整路径!当我在docker运行中暴露端口8080并尝试访问时,我被重定向到

我不知道如何配置Traefik,以便将我重定向到而不会失败

我正在使用TraefikV1.5.1/Cancoilotte和Docker版本17.12.0-ce,构建c97c6d6


更新:

我现在正在使用这个
run\u 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
#!/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
尝试立即访问将我重定向到。我可以看到dasboard UI,但看不到内容

我的意思是,除了导航菜单,页面是空的。我可以访问健康部分并查看一些图表,但是我看不到任何前端或后端。 当然,在
docker run
中暴露端口8081时,我可以访问位于的仪表板并查看所有前端和后端


有什么见解吗

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

要解决使用traefik路由到traefik ui的问题,并具有基本身份验证,我们必须使用两种间接方法

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

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

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

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

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

为了简化整个故事,这里有一个基于最新图片的最小工作示例

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

配置文件
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"
另外,听到这一点可能会很痛苦,但两个代码示例都有一个打字错误,即使在调试模式下也不会抛出任何明显的错误消息:地址用英语拼写为两个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 entrypoint的定义中有一个输入错误


希望这有帮助

你能从你的浏览器中观看并提供日志吗?我认为仪表板没有提供数据,因为您已经在api上设置了基本身份验证。从昨天开始,我尝试了很多方法,我想删除这个问题,因为我这里的代码不再是我使用的代码。我仍然无法重定向Traefik,但是在阅读了所有文档之后,我相信我很快就会成功。不管怎样,谢谢你帮我@bobolafrite我也在同一条船上。我想阻止来自外部世界的人访问仪表板,同时为仪表板提供一个单独的SSL证书,我的ops人员可以访问该证书——以及基本身份验证,尽管我更希望有CAS或LDAP集成