6

为了在动态 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

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

  • traefik.backend:“一些后端名称”
  • 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- compose 文件设置容器,标签等通常位于)。相反,我想将其与应用程序分开并将其配置为 traefik 配置的一部分。

这有可能吗?我尝试的是traefik.frontend.rule从示例 nginx 容器中省略标签,而是安装以下配置文件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错误。

4

2 回答 2

1

watch 标志似乎只在 rule.toml 第一次更改的条件下有效。

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

于 2017-09-05T02:55:00.883 回答
0

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

这意味着当从 config 创建前端时,docker 后端不存在,并且会抛出错误。

一种解决方案是将您的规则配置放在一个单独的文件中(例如rules.toml,如文档中所示)并将watch = true指令添加到您的配置中。这意味着您在此处定义的前端规则将在生成来自 docker 的后端后更新。

我们可能应该为此提交一个错误,因为它不是完全理想的功能。

于 2017-04-05T04:11:32.923 回答