首页 文章

带有docker后端的traefik反向代理 - 在traefik的配置文件中配置前端规则而不是通过容器标签

提问于
浏览
4

要在动态IP地址可能随时间变化的Docker容器前使用traefik作为反向代理,traefik会附带docker backend . 我设置的所有示例都遵循相同的模式:

首先,在没有额外配置文件的情况下以 docker 模式启动traefik,激活主机网络模式(可选,以便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:"some-backend-name"

  • traefik.frontend.rule:"Host: localhost; Method: 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-中)配置我的反向代理转发规则(例如转发主机: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 错误 .

2 回答

  • 0

    watch flag似乎只能在rule.toml第一次更改的条件下工作 .

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

  • 1

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

    这意味着当创建配置的前端时,docker后端不存在,并且它会抛出并出错 .

    一种解决方案是将规则配置放在单独的文件中(例如 rules.toml 作为shown in the docs)并将 watch = true 指令添加到您的配置中 . 这意味着您定义的前端规则将在生成docker的后端后更新 .

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

相关问题