首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Traefik路由Traefik用户界面

用Traefik路由Traefik用户界面
EN

Stack Overflow用户
提问于 2018-02-12 16:06:19
回答 1查看 5K关注 0票数 2

我是码头和特雷菲克的新手,所以我决定和他们一起玩。我试着遵循这个数字海洋教程:https://www.digitalocean.com/community/tutorials/how-to-use-traefik-as-a-reverse-proxy-for-docker-containers-on-ubuntu-16-04

我试图运行一个简单的traefik停靠容器,并通过traefik重定向访问端口8080上的web UI,也就是说,我想在https://myhost/traefik访问traefik用户界面。

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

这是我的文件run_traefik.sh

代码语言:javascript
复制
#!/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文件:

代码语言:javascript
复制
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未找到的错误。

奇怪的是,当我尝试访问https://myhost/traefik/dashboard/#/时,它会将我重定向到https://myhost/dashboard/#/,因此它运行良好。

但是我不想指定完整的路径!当我在码头运行中公开端口8080,并试图访问http://myhost:8080时,就会没有问题地将其重定向到http://myhost:8080/dashboard/#/

我不知道如何配置Traefik,这样去https://myhost/traefik就可以毫无故障地将我重定向到https://myhost:8080/dashboard/#/ .

我使用Traefikv1.5.1/cancoillotte和Docker版本17.12.0-ce,构建c97c6d6

最新情况:

我现在正在使用这个run_traefik.sh

代码语言:javascript
复制
#!/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

代码语言:javascript
复制
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/将我重定向到http://myhost/traefik/#/。我可以看到仪表板UI,但看不到内容。

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

有洞察力吗?

EN

回答 1

Stack Overflow用户

发布于 2018-07-19 18:01:19

这个问题,至少对我来说,令人惊讶的是,很难把我的头绕过去。我的同事总是说,再多一个间接的层次,没有什么是你不能解决的,但我恐怕这里的额外间接至少会给我带来很多困惑。

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

首先,我们希望用户只使用server.domain/traefik -所以我们需要前面提到的前缀规则(此时,我只需要使用没有StripPathPrefix )。

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

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

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

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

为了使整个故事简短,下面是一个基于最近的图片的最小的工作示例。

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

代码语言:javascript
复制
#!/bin/bash

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

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

代码语言:javascript
复制
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:/我自己经常犯这个错误.

在日志中暗示这一点的行是

代码语言:javascript
复制
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入口点的定义中有一个错误。

希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48750648

复制
相关文章

相似问题

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