traefik基本使用
作者:matrix 发布时间:2025-11-30 分类:零零星星

traefik 可以替代 nginx 或者作为多容器服务的 web server 入口,并且支持现代化的动态反向代理server。简单来说就是有些功能很方便
https://traefik.io/
优势
自动证书更新管理
简单配置就可以被外部访问,不然 nginx 配置麻烦
请求控制
限频
还有很多插件功能
traefik配置文件清单
$tree
├── acme.json # 证书信息持久化文件 里面就确保空白json `{}`内容就行
├── docker-compose.yml # Docker Compose 配置文件,定义 Traefik 和其他服务的容器配置
├── dynamic # 动态配置目录,Traefik 会监控此目录下的文件变化
│ ├── reverse-proxy.yml # 反向代理配置,定义路由规则和后端服务
│ └── tls.yml # TLS/SSL 证书配置
└── traefik.yml # Traefik 主配置文件,包含全局设置、入口点和提供者配置
traefik.yml
api:
dashboard: true # 启用 Traefik 仪表盘控制台
insecure: false # 不允许不安全访问仪表盘(需要安全方式访问 HTTPS+身份验证)
entryPoints:
web:
# 访问入口
address: ":80"
http:
redirections:
entryPoint:
to: websecure # 将 HTTP 请求重定向到 HTTPS
scheme: https
websecure: # HTTPS 入口
address: ":443"
providers:
docker:
# 宿主机Docker
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false # 不暴露容器
network: traefik-net # 使用的Docker网络
file:
# 配置文件目录监听
directory: "/etc/traefik/dynamic" # 动态配置文件目录
watch: true # 自动监听配置文件变化
certificatesResolvers:
letsencrypt: # 定义名为 letsencrypt 的证书解析器
acme:
# TODO 证书通知邮箱
email: yourmail@hhtjim.com
storage: acme.json
dnsChallenge: # DNS 验证
provider: cloudflare
resolvers:
- "1.1.1.1:53"
- "1.0.0.1:53"
delayBeforeCheck: 30 # 验证前等待时间(秒)
log:
level: INFO
注意:
TODO的邮箱配置, 这里使用cloudflare作为域名 DNS 服务
docker-compose.yml
services:
traefik:
image: traefik:v2.10
container_name: traefik
restart: always
environment:
# TODO
- CF_API_EMAIL=xxxxx@qq.com # Cloudflare 账号邮箱
- CF_DNS_API_TOKEN=2xxxxxxxxxlry # Cloudflare API 令牌
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik.yml:/etc/traefik/traefik.yml
- ./acme.json:/acme.json
- ./dynamic:/etc/traefik/dynamic
networks:
- traefik-net
labels:
- "traefik.enable=true" # 允许被traefik路由访问。否则仅内部访问
# 定义一个路由名 traefik-dashboard
# TODO
- "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.yourdomain.com`)" # 配置外部访问域名
- "traefik.http.routers.traefik-dashboard.service=api@internal"
- "traefik.http.routers.traefik-dashboard.entrypoints=websecure"
- "traefik.http.routers.traefik-dashboard.tls.certresolver=letsencrypt"
- "traefik.http.routers.traefik-dashboard.middlewares=auth"
# TODO
# 控制台访问密码
# 密码生成 echo $(htpasswd -nb admin xxxxx)
# $需要转移 替换为 $$
- "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$tsBOfyoO$$3/ouTdeQIGF.td9agf1Ay0"
command: >
sh -c "touch /acme.json && chmod 600 /acme.json && exec traefik"
# youradmin-nginx服务举例
youradmin-nginx:
image: nginx:alpine
container_name: youradmin-nginx
restart: always
volumes:
- /root/suworld-admin/dist/:/usr/share/nginx/html:ro,delegated
# - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
networks:
- traefik-net
labels:
- "traefik.enable=true"
# TODO 定义路由名称youradmin
- "traefik.http.routers.youradmin.rule=Host(`youradmin.yourdomain.com`)" # 配置外部访问域名
- "traefik.http.routers.youradmin.entrypoints=websecure"
- "traefik.http.routers.youradmin.tls.certresolver=letsencrypt"
- "traefik.http.services.youradmin.loadbalancer.server.port=80"
networks:
traefik-net:
external: true
注意:TODO 修改cloudflare DNS 的 apikey,匹配的域名,还有控制台访问密码 当然可以注释掉以关闭
dynamic/reverse-proxy.yml
# 反代配置
http:
routers:
# api
suworld-api:
# TODO 匹配条件
rule: "Host(`yourdomain.com`) || Host(`www.yourdomain.com`)"
entryPoints:
- websecure
middlewares:
- www-redirect
service: main-backend # 匹配后指向后端服务
tls:
certResolver: letsencrypt
# 管理后台 api 请求
admin-api:
# TODO 匹配条件 域名匹配 或者路径匹配
rule: "Host(`youradmin.yourdomain.com`) && PathPrefix(`/api/admin`)"
entryPoints:
- websecure
service: main-backend # 匹配后指向后端服务
tls:
certResolver: letsencrypt
middlewares:
www-redirect:
# TODO
redirectRegex:
regex: "^https://www.yourdomain.com/(.*)"
replacement: "https://yourdomain.com/${1}"
permanent: true
services:
main-backend: # 后端服务名称
loadBalancer:
servers:
- url: "http://127.0.0.2"
注意:TODO 修改匹配的域名
dynamic/tls.yml
# 证书配置
http:
routers:
# 全局 TLS 配置
global-secure:
rule: "HostRegexp(`{host:.+}`)" # 匹配所有域名
entryPoints:
- websecure
middlewares: [] # 不使用任何中间件
tls:
certResolver: letsencrypt # 指定使用letsencrypt证书解析器
domains:
# TODO
- main: "yourdomain.com"
sans:
- "*.yourdomain.com"
注意:TODO 修改匹配的域名
启动
# 创建docker 网络 traefik-net
$ docker network create traefik-net
# 启动服务
$ docker-compose -f docker-compose.yml up -d
后续新增服务
traefik 会自动识别相同网络下的容器,所以新增的容器服务满足networks和labels条件,traefik就会自动识别然后路由外部访问的流量到容器中。
...
networks:
- traefik-net # 之前创建的 docker 网络名称
labels:
- "traefik.enable=true" # 允许被traefik路由访问。否则仅内部访问
# 定义一个路由名 traefik-dashboard # TODO
- "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.yourdomain.com`)" # 配置外部访问域名
...
注意:TODO 修改匹配的域名
新服务的 docker-compose.yml 中:
networks:
default:
external:
name: traefik-net
注意: 确保新服务的networks和traefik一致就可以,还有labels必须要声明
方法 1.配置docker-compose.yml
内部 docker 服务配置networks和labels。
新服务如果是docker-compose启动的,就加上networks和labels,不建议放在traefik下的docker-compose.yml中 避免耦合
方法2. 配置到反向代理
外部服务或非 Docker 服务就配置到dynamic/reverse-proxy.yml文件中。
支持的DNS提供商
https://doc.traefik.io/traefik/v1.6/configuration/acme/#provider