traefik基本使用

作者:matrix 被围观: 13 次 发布时间:2025-11-30 分类:零零星星 | 无评论 »

traefik基本使用

traefik 可以替代 nginx 或者作为多容器服务的 web server 入口,并且支持现代化的动态反向代理server。简单来说就是有些功能很方便

https://traefik.io/

优势

自动证书更新管理
简单配置就可以被外部访问,不然 Nginx 配置麻烦
请求控制
限频
还有很多插件功能

traefik配置文件清单

~docker/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

其他文章:
本文固定链接:https://www.hhtjim.com/traefik-basic.html
matrix
本文章由 matrix 于2025年11月30日发布在零零星星分类下,目前没有通告,你可以至底部留下评论。
转载请注明:traefik基本使用-HHTjim'S 部落格
关键字:, , ,

添加新评论 »

 🙈 😱 😂 😛 😭 😳 😀 😆 👿 😉 😯 😮 😕 😎 😐 😥 😡 😈 💡

插入图片