Traefik

Traefik 是一个边缘路由器,这意味着它是通往你平台的大门,它拦截和路由每一个传入的请求:它知道所有的逻辑和每一个规则来决定哪个服务处理哪个请求
- Entrypoints 侦听传入流量(端口,......)
- Routers: 解析请求 (host, path, headers, SSL, ...)
- Providers 发现您的基础设施上的服务(他们的 IP,健康......)
- Services 转发请请求到你的服务 (负载平衡, ...)
- Middlewares 可以根据请求更新请求或做出决策(身份验证,速率限制,标头......)
Entrypoints
yaml
version: '3'
services:
reverse-proxy:
# The official v2 Traefik docker image
image: traefik:v2.10
# Enables the web UI and tells Traefik to listen to docker
command: --api.insecure=true --providers.docker
ports:
# The HTTP port
- '80:80'
# The Web UI (enabled by --api.insecure=true)
- '8080:8080'
volumes:
# So that Traefik can listen to the Docker events
- /var/run/docker.sock:/var/run/docker.sock
docs:
image: ccr.ccs.tencentyun.com/gh-registry/docs:latest
container_name: docs
restart: always
labels:
- traefik.http.routers.docs.rule=Host(`114.132.246.26`)Routers

路由器负责将传入的请求连接到能够处理它们的服务。
接下来我们使用 docker-compose 借助 whoami 镜像启动一个简单的 http 服务,docker-compose.yaml 配置文件如下
yaml
version: '3'
services:
whoami:
image: traefik/whoami
labels:
- traefik.enable=true
- traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`)
- traefik.http.routers.whoami.entrypoints=websecure
- traefik.http.routers.whoami.tls.certresolver=myresolver那 whoami 这个 http 服务做了什么事情呢
- 暴露了一个
http服务,主要提供一些header以及ip信息 - 配置了容器的
labels,设置该服务的Host为whoami.docker.localhost,给traefik提供标记
此时我们可以通过主机名 whoami.docker.localhost 来访问 whoami 服务,我们使用 curl 做测试
bash
$ curl -H Host:whoami.docker.localhost http://127.0.0.1
Hostname: bc3e8f1a5066
IP: 127.0.0.1
IP: 172.21.0.2
RemoteAddr: 172.21.0.1:37852
GET / HTTP/1.1
Host: whoami.docker.localhost
User-Agent: curl/7.29.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 127.0.0.1
X-Forwarded-Host: whoami.docker.localhost
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: 8.8.8.8
X-Real-Ip: 127.0.0.1服务正常访问。此时如果把 Host 配置为自己的域名,则已经可以使用自己的域名来提供服务
HTTPS & TLS
yaml
version: '3.3'
services:
traefik:
image: 'traefik:v2.10'
container_name: traefik
command:
# - "--log.level=DEBUG"
- --api.insecure=true
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- '--entrypoints.web.address=:80'
- '--entrypoints.websecure.address=:443'
- --certificatesresolvers.myresolver.acme.httpchallenge=true
- --certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web
# - "--certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
- --certificatesresolvers.myresolver.acme.email=854286351@qq.com
- --certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json
ports:
- '80:80'
- '443:443'
- '8080:8080'
volumes:
- './letsencrypt:/letsencrypt'
- '/var/run/docker.sock:/var/run/docker.sock:ro'- 将
certificatesresolvers.myresolver.acme.email命令行参数中将postmaster@example.com替换为您自己的电子邮件地址。 - 请在 whoami 服务的 traefik.http.routers.whoami.rule 标签中将 whoami.example.com 替换为您自己的域名。
- 如果您想测试/调试,可以选择取消以下行的注释:
#- "--log.level=DEBUG"
#- "--certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"在您创建上述文件的文件夹中运行
sh
docker-compose up -d配置文件
在启动时,Traefik 会在以下目录中搜索一个名为 traefik.yml (或 traefik.yaml 或 traefik.toml) 静态配置文件。
- /etc/traefik/
- $XDG_CONFIG_HOME/
- $HOME/.config/
- . (the working directory).
Traefik 中的配置可以指两种不同的东西
- 全动态路由配置(简称动态配置)
- 启动配置(称为静态配置)
动态配置包含定义系统如何处理请求的所有内容。该配置可以更改,并且可以无缝地热加载,不会出现任何请求中断或连接丢失。
动态配置
Traefik 从提供程序获取动态配置:无论是协调器、服务注册表还是普通的旧配置文件。
静态配置
静态配置中的元素建立到提供程序的连接,并定义 Traefik 将侦听的入口点(这些元素不经常更改)。 在 Traefik 中定义静态配置选项有三种不同的、互斥的方法(即你只能同时使用其中一种):
- 在配置文件中
- 在命令行参数中
- 作为环境变量