gpt4 book ai didi

docker - 使用 Traefik 路由 Traefik UI

转载 作者:行者123 更新时间:2023-12-02 18:39:03 27 4
gpt4 key购买 nike

我是 Docker 和 Traefik 的新手,所以我决定和他们一起玩一下。我试着按照这个 digital ocean 教程: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,即,我想在 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

我只是 touch acme.jsonchmod 600 acme.json为了让LE工作。

这是我的问题:

当我尝试访问 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/现在将我重定向到 http://myhost/traefik/#/ .我可以看到仪表板 UI,但看不到内容。

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

有什么见解吗?

最佳答案

至少对我来说,这个问题出人意料地难以解决。我的同事总是说没有什么是你不能用更多的间接级别解决的,但我担心这里的额外间接至少给我带来了很多困惑。

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

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

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

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

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

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

此外,这听起来可能很痛苦,但两个代码示例都有一个错字,即使在 Debug模式下也不会抛出任何明显的错误消息: 地址 在英语中用两个 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 入口点的定义中有一个错字。

希望这可以帮助!

关于docker - 使用 Traefik 路由 Traefik UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48750648/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com