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