【开源项目】Docker 快速启动 Traefik,轻松实现自动 HTTPS 和高性能反向代理与负载均衡

玩技站长
玩技站长
管理员, Keymaster
7098
文章
1
粉丝
软件头条评论3字数 1786阅读5分57秒阅读模式

【开源项目】Docker 快速启动 Traefik,轻松实现自动 HTTPS 和高性能反向代理与负载均衡-图片1

一、简介

  • 容器和云原生友好,与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证书

  • 新建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

    【开源项目】Docker 快速启动 Traefik,轻松实现自动 HTTPS 和高性能反向代理与负载均衡-图片2

  • 启动成功后,可以访问域名进入相应的服务系统
    浏览器认为自签证书的网站不安全,点击继续即可
    【开源项目】Docker 快速启动 Traefik,轻松实现自动 HTTPS 和高性能反向代理与负载均衡-图片3
    由于设置了授权中间件,所以输入basic认证的账号密码来登录
    【开源项目】Docker 快速启动 Traefik,轻松实现自动 HTTPS 和高性能反向代理与负载均衡-图片3
    成功进入管理后台,可以看到路由和负载情况
    【开源项目】Docker 快速启动 Traefik,轻松实现自动 HTTPS 和高性能反向代理与负载均衡-图片3

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网络路由

  • 新建docker-compose.yml配置文件,如下portainer容器管理服务启动示例,需要设置和traefik同一个网络,并且正确设置labels标签
    version: '3'
    services:
      portainer:
        image: portainer/portainer-ce:sts
        restart: always
          #ports:
          #  - "9000:9000"
        labels:
          #需要启用traefik服务
          - "traefik.enable=true"
          - "traefik.http.routers.portainer.rule=Host(`portainer2.aimm.site`)"
          - "traefik.http.routers.portainer.entrypoints=websecure"
          - "traefik.http.routers.portainer.tls=true" #自定义证书时,开启这个,注释下面一行
          #- "traefik.http.routers.portainer.tls.certresolver=myresolver"  #Let's Encrypt证书时,开启这个,注释上面一行
          - "traefik.http.services.portainer.loadbalancer.server.port=9000"  #指定portainer服务的端口
        volumes:
          - ./data:/data
          - /var/run/docker.sock:/var/run/docker.sock
        networks:
          - traefik
    networks:
      traefik:
        external: true
  • 如上配置,访问域名:https://portainer2.aimm.site/,即可访问portainer服务

三、总结

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

 
匿名

发表评论

匿名网友
确定

拖动滑块以完成验证