在 Traefik v2 中定义动态主机规则
Traefik是一个反向 http 代理,它特别适用于docker和docker-compose环境。 Traefik 将接收所有传入的 Web 请求并将它们重定向到 Docker 容器。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--tF8fDI1v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/9r9hfv4swsla88heeoal.png)
为了重定向您的请求,Traefik 将使用路由器来识别适当的 Web 服务器。
在本文中,我将向您展示如何为我的开发环境配置默认的“主机规则”。此规则将自动为任何服务添加规则。
http://<service>.<project>.localhost
我假设你已经有一些使用 Docker 和 Traefik 的经验。
Traefik 配置
首先安装 Traefik。让我们创建一个具有以下结构的新项目:
traefik/
└── docker-compose.yaml
进入全屏模式 退出全屏模式
您只需要一个文件即可开始使用 Traefik。这是traefik/docker-compose.yaml的内容:
version: '3.7'
services:
traefik:
image: traefik:v2.7
restart: always
command:
- '--api.insecure=true'
- '--providers.docker.exposedByDefault=false'
- '--providers.docker.network=traefik_default'
- '--providers.docker.defaultRule=Host(`{{ index .Labels "com.docker.compose.service" }}.{{ index .Labels "com.docker.compose.project" }}.localhost`)'
labels:
- 'traefik.http.services.traefik-traefik.loadBalancer.server.port=8080'
- 'traefik.enable=true'
ports:
- '80:80'
- '8080:8080'
volumes:
- '/var/run/docker.sock:/var/run/docker.sock'
networks:
- default
networks:
default:
进入全屏模式 退出全屏模式
这是创建动态规则时最重要的命令选项:
- '--providers.docker.defaultRule=Host(`{{ index .Labels "com.docker.compose.service" }}.{{ index .Labels "com.docker.compose.project" }}.localhost`)'
进入全屏模式 退出全屏模式
让我们看看前一行做了什么:
-
--providers.docker.defaultRule:这是在容器未定义规则时使用的规则。
-
Host():请求的域将用于路由。
-
{{ index .Labels "com.docker.compose.service" }}:这个代表服务名,就是你在docker-compose.yaml中定义的那个。 -
{{ index .Labels "com.docker.compose.project" }}:此占位符将替换为项目名称。默认情况下,项目名称为目录名称,您也可以使用-p <project>选项指定此值。 -
最后
.localhost是保留域,它将始终指向环回地址127.0.0.1。使用.localhost,您无需将开发域添加到/etc/hosts。
使用以下命令启动 Traefik:
$ docker compose -p traefik up -d
进入全屏模式 退出全屏模式
Traefik 现已启动并运行。
创建示例项目
我们将创建一个演示项目来检查我们的动态规则是否正常工作。这是foo项目的结构:
foo/
└── docker-compose.yaml
进入全屏模式 退出全屏模式
我们在foo/docker-compose.yaml内定义一个 Apache 服务器:
version: "3.7"
services:
web:
image: httpd
labels:
- traefik.enable=true
networks:
- default
- traefik_default
networks:
default:
traefik_default:
external: true
进入全屏模式 退出全屏模式
让我们执行我们的演示项目:
$ docker compose -p foo up -d
进入全屏模式 退出全屏模式
现在,如果我们打开http://web.foo.localhost,我们将看到 Apache 的欢迎消息:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--ASQ1nZ7R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/h4o5h8hc8t7536as6nrb.png)
使用自定义规则
我们也可以为一个服务指定一个自定义规则,这个自定义规则会覆盖默认规则。
例如我们想使用my-foo.localhost,为此我们简单地添加一个新的label:
# ...
web:
image: httpd
labels:
- traefik.enable=true
+ - traefik.http.routers.foo-project.rule=Host(`my-foo.localhost`)
# ...
进入全屏模式 退出全屏模式
为了使更改生效,我们必须使用docker compose -p foo up -d再次启动我们的项目。结果如下:
[
](https://res.cloudinary.com/practicaldev/image/fetch/s---46GH-s1---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev -to-uploads.s3.amazonaws.com/uploads/articles/a2pp617uubag3we2y3bn.png)
如您所见,一切都按预期工作。
结论
Traefik 是一个高度可配置的反向代理。您只需要一行代码即可拥有动态域,这些域非常适合开发环境。
如果您使用.localhosttld,则无需在/etc/hosts内声明您的域。
更多推荐
所有评论(0)