Traefik 檔案 Provider 與 TCP 路由
到目前為止,我們幾乎都依賴 Docker Provider (Labels) 來設定 Traefik。這對於容器化服務非常方便。
但在某些情況下,我們需要更進階的配置方式:
- 代理 非 Docker 的服務 (例如外部伺服器)。
- 代理 TCP/UDP 流量 (例如資料庫)。
- 設定 SSL 憑證 (自行購買的憑證,非 Let's Encrypt)。
- 定義複雜的 Middleware Chains,供多個容器共用。
這時,我們就需要 File Provider。
啟用 File Provider
首先,我們需要在靜態配置 (traefik.yml 或 command) 中告訴 Traefik 去哪裡讀取動態設定檔。
修改 docker-compose.yml:
command:
# ...
- '--providers.file.filename=/etc/traefik/dynamic.yml'
- '--providers.file.watch=true' # 自動監聽檔案變更,免重啟
volumes:
# ...
- ./dynamic.yml:/etc/traefik/dynamic.yml # 掛載檔案
然後在 host 建立 dynamic.yml。
定義外部服務 (External Service)
假設你有一個舊的網站跑在 http://192.168.1.50,你想透過 Traefik 代理它。
在 dynamic.yml 中:
http:
routers:
legacy-app:
rule: Host(`legacy.example.com`)
service: legacy-service
entryPoints:
- websecure
tls:
certResolver: myresolver
services:
legacy-service:
loadBalancer:
servers:
- url: 'http://192.168.1.50:8080'
這樣 Traefik 就會把 legacy.example.com 的流量轉給那台外部機器,並且自動幫它加上 HTTPS!
TCP 路由 (代理資料庫)
Traefik 不只懂 HTTP,它還是個 TCP/UDP Proxy。這讓你可以將資料庫 (例如 MySQL, Redis) 暴露給外網,並透過 SNI 路由。
假設我們想透過 db.example.com 連到內部的 MySQL 容器。
首先,確保 EntryPoint 有監聽該 port (或共用 443,需依賴 TLS SNI)。為了簡單起見,我們新增一個專用的 mysql EntryPoint (Port 3306)。
在 docker-compose.yml 中:
command:
- '--entrypoints.mysql.address=:3306'
ports:
- '3306:3306'
然後在 dynamic.yml (或是 MySQL 容器的 Labels) 中設定:
tcp:
routers:
mysql-router:
rule: HostSNI(`*`) # TCP 路由通常是基於 HostSNI。如果沒有 TLS,只能用 *
service: mysql-service
entryPoints:
- mysql
services:
mysql-service:
loadBalancer:
servers:
- address: 'mysql-container:3306'
注意:如果不啟用 TLS,Traefik 無法看到 Hostname (SNI),所以 HostSNI 只能設為 *。這意味著該 EntryPoint (Port 3306) 只能服務一個 TCP Router。如果你想在同一個 Port 上跑多個 TCP 服務 (例如 db1.example.com 和 db2.example.com),你必須啟用 TCP TLS,讓客戶端發送 SNI。
4. 自定義 TLS 憑證
如果你不想用 Let's Encrypt,而是有自己買的憑證 (server.crt, server.key)。
在 dynamic.yml 中設定:
tls:
certificates:
- certFile: /etc/traefik/certs/server.crt
keyFile: /etc/traefik/certs/server.key
stores:
- default
記得把憑證檔案掛載進容器。
總結
File Provider 提供了極大的靈活性,彌補了 Docker Labels 的不足。你可以混合使用:用 Docker Labels 處理大多數簡單的微服務,用 File Provider 處理複雜的全域設定和外部服務。