traefik反向代理与docker后端 – 在traefik的configuration文件configuration前端规则,而不是通过容器标签

为了使用traefik作为Docker容器前的反向代理,其dynamicIP地址可能会随时间而改变,traefik附带一个docker 后端 。 我可以find的所有设置都遵循相同的模式:

首先,在没有额外的configuration文件的情况下启动docker模式下的traefik,激活主机networking模式(可选,这样traefik可以看到主机上的所有Dockernetworking,如果需要的话),并安装Docker unix套接字,以便traefik可以听到容器启动和停止。

 docker run --rm -p 80:80 --net=host --name traefik-reverse-proxy -v /dev/null/traefik.toml:/etc/traefik/traefik.toml -v /var/run/docker.sock:/var/run/docker.sock traefik --docker --loglevel debug 

然后,启动另一个容器并至less设置以下标签 :

  • traefik.backend:“一些后端名称”
  • traefik.frontend.rule:“主机:本地主机;方法:GET”(或任何你的规则是)
  • traefik.port:80(或者你的容器在内部暴露的任何端口)

例:

 docker run --rm --name nginx -l traefik.backend="some-backend-name" -l traefik.frontend.rule="Host: localhost; Method: GET" -l traefik.port="80 nginx 

然后,做一个curl localhost ,可以在traefik容器的日志中看到它接受了请求,并将其发送到NGINX容器。

到目前为止,这么好…但是,我不喜欢这个事实,我必须在应用程序本身(我的docker-组成文件设置容器,标签等通常位于)。 相反,我想将其与应用程序分开,并将其configuration为traefikconfiguration的一部分。

这是可能的吗? 我试过的是从示例nginx容器中traefik.frontend.rule标签,而是为traefik装入以下configuration文件:

 [frontends] [frontends.frontend1] backend = "some-backend-name" [frontends.frontend1.routes.test_1] rule = "Host: localhost; Method: GET" 

traefik的启动命令因此变成:

 docker run --rm -p 80:80 --net=host --name traefik-reverse-proxy -v $PWD/traefik.toml:/etc/traefik/traefik.toml -v /var/run/docker.sock:/var/run/docker.sock traefik --docker --loglevel debug 

但是,这似乎并没有将configuration文件中的前端规则与nginx容器中的后端标签相关联。 curl localhost现在返回一个404 / Not found错误。

手表标志似乎只在rule.toml第一次改变的情况下才起作用。

在你的情况下,我build议你写一个服务来更新你的规则在etcd或zookeeper中。 服务读取etcd改变并更新etcd中的traefikconfiguration。

这可能是操作问题的顺序。 在config( debug = true )中启用debugging日志logging显示,traefik首先parsingconfiguration文件前端规则,然后才根据docker中运行的内容生成前端和后端。

这意味着当configuration的前端被创build时,docker后端不存在,并抛出错误。

一种解决scheme是将你的规则configuration放在一个单独的文件中(例如rules.toml中显示的 rules.toml ),并将watch = true指令添加到你的configuration文件中。 这意味着你在这里定义的前端规则将会在docker的后端生成后被更新。

我们应该提交一个错误,因为它不是完全合乎需要的function。