2017-03-01 55 views
4

对于使用traefik作为Docker容器前的反向代理,其动态IP地址可能随时间而改变,traefik附带docker backend。我可以找到的所有设置都遵循相同的模式:带docker后端的traefik反向代理 - 在traefik的配置文件中配置前端规则而不是通过容器标签

首先,在没有额外配置文件的情况下启动trafik模式docker,激活主机网络模式(可选,以便traefik可以看到主机上的所有Docker网络如果需要的话)并安装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 

然后,启动另一个容器中,至少设置以下labels

  • 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容器的日志中看到。

到目前为止,一切都很好。不过,我不喜欢的事实,我必须配置我的反向代理转发规则(如前主持人:some.host.name集装箱XXX)在应用程序中(我的docker-compose文件设置容器,标签等通常位于此处)。相反,我想将它与应用程序分开,并将其配置为traefik配置的一部分。

这是可能以某种方式?我试图从例如nginx的容器留出了traefik.frontend.rule标签,而不是安装在下面的配置文件traefik

[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 

然而,这并似乎没有将配置文件中的前端规则与nginx容器中的后端标签相关联。 curl localhost现在会返回404/Not found错误。

回答

0

这可能是操作问题的顺序。在配置文件(debug = true)中启用调试日志记录显示,traefik首先解析配置文件前端规则,然后才根据docker中正在运行的内容生成前端和后端。

这意味着创建从配置的前端时,不存在泊坞窗后端,它抛出和错误。

一种解决方法是把你的规则配置在一个单独的文件(例如rules.tomlshown in the docs)和watch = true指令添加到您的配置。这意味着您在此处定义的前端规则将在生成docker后端后更新。

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

+0

感谢您的输入。但是,在尝试此操作时,结果完全相同。如果你碰巧找到一个这样的工作例子,让我知道。 – Dirk

1

手表标志似乎只在rule.toml第一次更改的条件下工作。

在你的情况,我建议你写一个服务来更新你的规则在etcd或zookeeper。服务读取etcd更改并更新etcd中的traefik配置。

相关问题