Docker traefikV2.1


一、概念

 

 

 traefik 是一個開源的反向代理服務器,用go語言編寫,原生支持Docker、Kubernets、File等,協議支持http、https、tcp、grpc等

下面是我使用traefik在docker中的一些實踐,traefik 2.1 && docker 18.06.3-ce

 

二、部署

1、簡單例子

version: '3'

services:
    traefik:
        image: traefik:v2.1
        container_name: traefik
        # 啟用Web UI並監聽docker
        command: --api.insecure=true --providers.docker
        ports:
            # HTTP 端口
            - "80:80"
            # Web UI 端口
            - "8080:8080"
        volumes:
            # 這樣Traefik可以監聽Docker事件
            - /var/run/docker.sock:/var/run/docker.sock

    whoami:
        # 公開API以顯示其IP地址的容器
        image: containous/whoami
        container_name: whoami
     # traefik 通過labels 來生成配置文件,這里的“whoami”可以是自定義名稱,“whoami.fanxp.com” 是你域名 labels:
- "traefik.http.routers.whoami.rule=Host(`whoami.fanxp.com`)"

執行:docker-compose -f ./traefik-compose.yml up -d

如果是局域網測試 需要修改host 

192.168.1.221 whoami.fanxp.com

訪問http://whoami.fanxp.com:8080/

 訪問:http://whoami.fanxp.com/

 這個簡單的例子就完成了。

進入traefike web ui 中的http 可以看到請求過程

Entrypoints -> 入口

HTTP Router -> 路由規則

Service -> 可以理解為部署在docker中的容器、這里也可以是在配置文件中自定義的service

TLS -> https

Middlewares - > 中間件(1.x中的很多功能都移到了這里面)

 

2、toml手動配置、https、自定義Router,Service

traefik.toml

# 全局配置
[global]
  checkNewVersion = false
  sendAnonymousUsage = false
# 入口
[entryPoints]
  # http 
  [entryPoints.web]
    address = ":80"
  # https "websecure"這個名字是自己定義的  
  [entryPoints.websecure]
    address = ":443"
  #  traefik web ui 
  [entryPoints.traefik]
    address = ":8080" 
# 免費Let's Encrypt 證書(注意:必須域名解析到的主機中才有效,traefik會把秘鑰寫入acme.json中)
[certificatesResolvers.bxtlschallenge.acme]
  # 自己的郵箱地址
  email = "604694379@qq.com"
  # 秘鑰寫入地址,根據自己文件映射來配置
  storage = "/letsencrypt/acme.json"
  [certificatesResolvers.bxtlschallenge.acme.httpChallenge]
    entryPoint = "web"

# 自定義Router、Services(貌似必須定義在外部文件里面,坑了好久)
[providers.file]
  directory = "/etc/traefik/conf"
# traefik 需要開啟的功能
[api]
  insecure = true
  dashboard = true
[ping]
[providers.docker]
  endpoint = "unix:///var/run/docker.sock"
  exposedByDefault = true
# 傳輸配置
[serversTransport]
  # 如果后端需要代理https自定義證書,可以使用這種方式就可以跳過驗證,不然會報x509證書錯誤
  insecureSkipVerify = true

 file.toml

[http]
  # 自定義 routers
  [http.routers]
    # http 方式
    [http.routers.routers-cnblogs]
      entryPoints = ["web"]
      rule = "Host(`cnblogs.fanxp.com`)"
      service = "cnblogs"
    # https 方式
    [http.routers.routers-cnblogs1]
      entryPoints = ["websecure"]
      rule = "Host(`cnblogs.fanxp.com`)"
      service = "cnblogs"
      [http.routers.routers-cnblogs1.tls]
        certResolver = "bxtlschallenge"
  # 自定義 services
  [http.services]
    [http.services.cnblogs]
      # 可以設置多個url traefik 根據算法做負載均衡
      [http.services.cnblogs.loadBalancer]
        [[http.services.cnblogs.loadBalancer.servers]]
          url = "https://www.cnblogs.com/fanxp/"
        [[http.services.cnblogs.loadBalancer.servers]]
          url = "https://github.com/fanxiaoping/grpc-test"

traefik-compose.yml

version: '3'

services:
    traefik:
        image: traefik:v2.1
        container_name: traefik
        ports:
            # HTTP 端口
            - "80:80"
            # HTTPS 端口
            - "443:443"
            # Web UI 端口
            - "8080:8080"
        volumes:
            # 這樣Traefik可以監聽Docker事件
            - /var/run/docker.sock:/var/run/docker.sock:ro
            # 啟動配置文件
            - ./traefik.toml:/etc/traefik/traefik.toml
            # 自定義routers、services
            - ./conf:/etc/traefik/conf
            # 存儲證書秘鑰
            - ./letsencrypt:/letsencrypt

    whoami:
        # 公開API以顯示其IP地址的容器
        image: containous/whoami
        container_name: whoami
        labels:
            # 地址:whoami.fanxp.com
            - "traefik.http.routers.whoami.rule=Host(`whoami.fanxp.com`)"
            # 入口方式,這里采用https
            - "traefik.http.routers.whoami.entrypoints=websecure"
            # 指定證書
            - "traefik.http.routers.whoami.tls.certresolver=bxtlschallenge"

    whoami2:
        # 公開API以顯示其IP地址的容器
        image: containous/whoami
        container_name: whoami2
        labels:
            # 地址:whoami.fanxp.com/v2
            - "traefik.http.routers.whoami2.rule=Host(`whoami.fanxp.com`) && PathPrefix(`/v2`)"
            # 默認代理使用http://172.0.0.4 配置方式用https://172.0.0.4
            # - "traefik.http.services.bx_resource_library.loadbalancer.server.scheme=https"
            # 定義中間件 規則
            - "traefik.http.routers.whoami2.middlewares=whoami2-stripprefix"
            # 代理:172.0.0.4/v2訪問,這肯定不是我們想要的 寫上規則后 代理:172.0.0.4
            - "traefik.http.middlewares.whoami2-stripprefix.stripprefix.prefixes=/v2"
            # 如果容器有多個端口 可以指定當前service暴露哪一個端口,默認第一個
            - "traefik.http.services.whoami2.loadbalancer.server.port=80"
            # 入口方式,這里采用https
            - "traefik.http.routers.whoami2.entrypoints=websecure"
            # 指定證書
            - "traefik.http.routers.whoami2.tls.certresolver=bxtlschallenge"

執行以后訪問:

https://whoami.fanxp.com

https://whoami.fanxp.com/v2

http://cnblogs.fanxp.com

https://cnblogs.fanxp.com

所有文件配置信息https://github.com/fanxiaoping/traefik2.1-config 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM