
一、简介
- 容器和云原生友好,与Docker、K8s深度集成,非常适合微服务架构
- 动态服务发现与自动更新路由规则
- 内置自签证书,也设置自动申请和续订 Let's Encrypt的HTTPS证书
- 丰富的中间件支持,如请求重定向、身份认证、限流等
- 开源地址可参考:https://github.com/traefik/traefik

二、安装与使用(Docker示例)
1. 创建一个自定义Docker桥接网络
docker network create --driver bridge traefik
2. 配置启动traefik
2.1 搭建示例一,使用内置tls证书
2.2 搭建示例二,使用Let's Encrypt证书
- 新建docker-compose.yml配置文件,主要调整自动申请使用Let's Encrypt颁发的https证书,配置内容如下:
注意:acme.json为保存自动申请证书的一些配置信息,避免每次启动都重新申请一次证书。这个文件需要提前创建,并且设置权限为600,可以执行:touch acme.json && chmod 0600 acme.jsonversion: '3'
services:
reverse-proxy:
# The official v2 Traefik docker image
image: traefik:v2.11
# Enables the web UI and tells Traefik to listen to docker
command:
- --api.insecure=false
- --providers.docker=true
- --providers.docker.exposedbydefault=false #默认不暴露所有容器,需要在容器中手动设置标签
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
# Let's Encrypt配置,基于80端口的校验申请证书,如果报错,可查看docker-compose logs查看详情,最好email修改为可用的邮箱地址
- --certificatesresolvers.myresolver.acme.httpchallenge=true
- --certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web
- --certificatesresolvers.myresolver.acme.email=123456@qq.com
- --certificatesresolvers.myresolver.acme.storage=/acme.json
labels:
#启用traefik服务
- "traefik.enable=true"
#1设置路由
- "traefik.http.routers.traefik.rule=Host(`traefik.aimm.site`)"
- "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.routers.traefik-ssl.rule=Host(`traefik.aimm.site`)"
- "traefik.http.routers.traefik-ssl.service=api@internal"
#1开启https访问,myresolver为上面traefik设置的acme证书申请配置名称
- "traefik.http.routers.traefik.entrypoints=web"
- "traefik.http.routers.traefik-ssl.entrypoints=websecure"
- "traefik.http.routers.traefik-ssl.tls.certresolver=myresolver"
#1使用自定义auth等中间件
- "traefik.http.routers.traefik.middlewares=redirect-to-https,auth"
- "traefik.http.routers.traefik-ssl.middlewares=auth"
#设置授权中间件auth,这里设置的账号密码都是admin,是由命令htpasswd -nb admin admin生成,htpasswd命令自行安装
- "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$2bksvLvd$$WErOGWfUNl6YSaU5PRdb51"
# 基于中间件的重定向
- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
ports:
# The HTTP port
- "80:80"
- "443:443"
# The Web UI (enabled by --api.insecure=true)
#- "8080:8080"
volumes:
# 使得Traefik可以监听Docker事件
- /var/run/docker.sock:/var/run/docker.sock
#这是acme生成证书的信息保存的文件,与上面启动命令指定的容器内的位置一致
- ./acme.json:/acme.json
networks:
- traefik
networks:
traefik:
external: true - 启动之后,Traefik会自动帮你申请或者续期https证书,后面访问网站就是正常、安全的证书访问了

2.3 搭建示例三,使用文件配置,动态加载,服务热更新
- 新建docker-compose.yml配置文件,把配置文件目录映射到容器内 Traefik 配置目录,内容如下:
version: '3'
services:
reverse-proxy:
image: traefik:v2.11
command:
- --api.insecure=true
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --entrypoints.websecure.http.tls=true
- --providers.file.directory=/etc/traefik/config
- --providers.file.watch=true
ports:
# The HTTP port
- "80:80"
- "443:443"
#- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./config:/etc/traefik/config
networks:
- traefik
networks:
traefik:
external: true - 启动后,可以在 config 目录下,新建xxx.yml配置文件,因为设置了--providers.file.watch=true,traefik会动态加载相关配置并重启,文件格式样例如下:
下面是配置访问域名 portainer.aimm.site(提前做好DNS解析到服务器ip),反向代理与负载均衡的到后端portainer容器管理服务# config/pp.yml
http:
routers:
pp:
rule: "Host(`portainer.aimm.site`)"
entrypoints: web,websecure
service: pp
services:
pp:
loadBalancer:
servers:
- url: "http://172.17.0.1:9000" - 配置完毕,即可访问

3. 其他Docker服务接入Traefik网络路由
三、总结
- Traefik的动态配置和自动服务发现功能非常好用,配置也算简单,与Docker服务、微服务非常般配
- 自动的证书服务,无论是Let's Encrypt或者自签证书,都能实现一键开启数据传输安全,同时需要更少的运维负担
- go语言开发,性能不输nginx,而且支持各种中间件、扩展插件,玩法很多,值得关注