
一、简介
二、安装与使用(Docker示例)
1. 创建一个自定义Docker桥接网络
docker network create --driver bridge traefik
2. 配置启动traefik
2.1 搭建示例一,使用内置tls证书
新建docker-compose.yml配置文件,注意提前把你的域名指向部署的服务器ip,如下的traefik.aimm.site替换为你的域名,内容如下:
version: '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=true #启用不安全的 Traefik Dashboard(仅在内部网络中使用,生产环境请配置安全访问)
- --providers.docker=true #启用 Docker 提供程序,以监控 Docker 容器的变化
- --providers.docker.exposedbydefault=false #默认不暴露所有容器,需要在容器中手动设置标签
- --entrypoints.web.address=:80 #定义 HTTP 的入口点
- --entrypoints.websecure.address=:443 #定义 HTTPS 的入口点
- --entrypoints.websecure.http.tls=true #默认是false,需要开启,为 HTTPS 入口点启用 TLS
labels:
#启用traefik服务
- "traefik.enable=true"
#1设置路由,这里设置域名指向traefik的管理后台服务api@internal
- "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=true" #使用自定义证书
#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
networks:
- traefik
networks:
traefik:
external: true
一键启动命令如下:
docker-compose up -d

启动成功后,可以访问域名进入相应的服务系统
浏览器认为自签证书的网站不安全,点击继续即可

由于设置了授权中间件,所以输入basic认证的账号密码来登录

成功进入管理后台,可以看到路由和负载情况

2.2 搭建示例二,使用Let's Encrypt证书
- 新建docker-compose.yml配置文件,主要调整自动申请使用Let's Encrypt颁发的https证书,配置内容如下:
注意:acme.json为保存自动申请证书的一些配置信息,避免每次启动都重新申请一次证书。这个文件需要提前创建,并且设置权限为600,可以执行:touch acme.json && chmod 0600 acme.json
version: '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,而且支持各种中间件、扩展插件,玩法很多,值得关注