我是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
Ijust touch acme.json
和chmod 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/ nows,将我重定向到http://myhost/traefik/#/。我可以看到dasboard UI而不是内容。
我的意思是除导航菜单外,页面都是空的。我可以访问健康部分并查看一些图表,但我看不到任何前端或后端。
当然,当在docker run
中公开端口8081时,我可以访问http://myhost:8081/dashboard/#/处的仪表板并查看所有前端和后端。
有什么见解?
答案 0 :(得分:0)
至少对我来说,这个问题出奇的难以解决。我的同事总是说,没有更多的间接方法可以解决您的问题,但是我担心这里额外的间接方法至少给我带来了很多困惑。
要解决使用traefik路由到traefik ui的问题并具有基本身份验证,我们必须使用两种间接方式。
首先,我们希望用户仅转到server.domain/traefik
-因此我们需要您提到的前缀规则(在这一点上,我只使用PathPrefix
而没有Strip
)。 / p>
我们不希望用户必须指定任何特定的端口,因此应为绑定到默认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入口点的定义中有一个错字。
希望这会有所帮助!