[英]traefik reverse-proxy with docker backend - configure frontend rules in traefik's config file and not via container label
为了在一个Docker容器前面使用traefik作为反向代理,其动态IP地址可能会随着时间而改变,traefik附带一个docker 后端 。 我设置的所有示例都遵循相同的模式:
首先,启动traefik在docker
模式,而无需额外的配置文件,启动主机网络模式(可选,让traefik可以看到,如果需要在主机上的所有泊坞窗网),并安装多克尔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
然后,启动另一个容器并至少设置以下标签 :
例:
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-中)配置我的反向代理转发规则(例如转发主机:some.host.name到容器xxx)这一事实。撰写文件设置容器,标签等通常位于)。 相反,我想将其与应用程序分开,并将其配置为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
错误。
watch flag似乎只能在rule.toml第一次更改的条件下工作。
在您的情况下,我建议您编写一个服务来更新您在etcd或zookeeper中的规则。 服务读取etcd更改并更新etcd中的traefik配置。
这可能是一个操作顺序问题。 在config( debug = true
)中启用调试日志记录显示traefik首先解析配置文件前端规则,然后才根据docker中运行的内容生成前端和后端。
这意味着当创建配置的前端时,docker后端不存在,并且它会抛出并出错。
一种解决方案是将规则配置放在一个单独的文件中(例如,docs中显示的 rules.toml
),并将watch = true
指令添加到您的配置中。 这意味着您定义的前端规则将在生成docker的后端后更新。
我们应该为此提交一个错误,因为它并不是完全合乎需要的功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.