一、概念
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