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内声明您的域。

Logo

云原生社区为您提供最前沿的新闻资讯和知识内容

更多推荐