- Traefik 充當動態反向代理並解析 TLS 證書,而 Portainer 提供用於管理 Docker 和 Swarm 的圖形介面。
- traefik.yml、dynamic.yml 和 docker-compose.yml 的組合可讓您定義入口點、安全中介軟體和基於標籤的 HTTP/HTTPS 路由。
- 在 Docker 獨立部署或 Swarm 部署場景中,只需將服務加入代理網路並標記它們,以便 Traefik 可以安全地發現和公開它們。
- 控制面板上使用 Let's Encrypt、專用網路和基本驗證,為在單一伺服器上部署多個應用程式建置了一個強大的環境。
使用Docker、Traefik 和 Portainer建立現代化技術棧,是目前在單一伺服器上管理容器並透過 HTTPS 公開多個服務的最簡單方法之一,而且無需繁瑣的配置。其優點在於,Traefik 充當動態反向代理,而 Portainer 則提供了一個非常簡潔的 Web 介面來管理 Docker,如果需要,也可以管理 Swarm。
本文將向您展示如何 將 Traefik 用作 Portainer 前面的反向代理 在「經典」Docker(獨立)場景和Docker Swarm叢集中,如何整合TLS(自簽名或Let's Encrypt),以及涉及哪些設定檔(traefik.yml, dynamic.yml y docker-compose.yml)以及 Traefik 中中介軟體、網路和典型標籤問題的一些常用技巧。
Docker、Traefik 和 Portainer 在架構中分別扮演什麼角色?
在這種設定中,Docker是容器運行的基礎層,Traefik 充當反向代理和負載平衡器,接收連接埠 80 和 443 上的所有 HTTP/HTTPS 請求,並將它們發送到相應的容器,而Portainer 提供了一個圖形介面來管理映像、容器、磁碟區、網路以及 Docker 或 Swarm 堆疊。
其想法是使用一台運行 Docker 的主機,其中 Traefik位於「門戶」處:在入口處傾聽 web (80)Y websecure (443)解析 TLS 憑證(通常使用 Let's Encrypt),並且由於與 Docker 提供者的集成,透過向容器添加標籤自動發現您公開的服務。
另一方面,Portainer 的運作方式與另一個容器類似,但它是透過某種方式暴露出來的。 例如,一個特定的子網域。 portainer.tudominio.com受 TLS 保護,如果需要,也可以透過 Portainer 本身登入以外的額外身分驗證中間件進行保護。所有這些都由一個…協調。 泊塢窗,撰寫 它定義了 Traefik、Portainer 和通用網絡 proxy.
這種方法的一個明顯優勢是,只需在容器中新增標籤即可部署新服務:Traefik 會偵測 Docker 中的變化,動態建立路由器、服務和中間件,幾秒鐘內即可啟動並執行新的子網域或路由,而無需手動修改靜態設定檔。
Traefik 靜態配置:traefik.yml
Traefik 的靜態配置通常儲存在類似這樣的檔案中。 traefik.yml它安裝在容器內部。這裡定義了它。 儀表板、入口點、提供者和憑證解析器 以及其他一些工具,例如 Let's Encrypt。
典型的 YAML 設定首先使用類似這樣的命令來啟動 API 和控制面板。 api: dashboard: true這樣就可以存取 Web 介面,查看路由器、服務和中介軟體。預設情況下,此面板未進行身份驗證,因此我們稍後將介紹如何透過動態配置使用基本身份驗證來保護它。
接下來,定義入口點。通常情況下,有… 入口 web 在 80 號港口 和另一個 websecure 在443中。 在 web 通常配置自動重定向。 websecure這樣,所有HTTP存取都會重新導向到HTTPS:
典型的大綱將包含以下部分 http.redirections.entryPoint.to: websecure 強制重定向並將所有加密流量集中在安全入口點。
至 websecure 提示應使用 TLS,並提供了連結。 證書解析器 (例如 letsencrypt它將負責自動管理證書。所有這些都由 頂點這是 Let's Encrypt 用於頒發和續約證書的協議。
在街區 供應商 Docker 提供者已配置,指向套接字 unix:///var/run/docker.sock其中一個關鍵選項: exposedByDefault: false因此,Traefik 預設不會發布所有容器;只會發布那些帶有標籤的容器。 traefik.enable=true您也可以設定檔提供者(file)例如,從以下位置載入額外的動態配置: /configurations/dynamic.yml.
最後,靜態文件通常包含以下部分 certificatesResolversACME解析器定義位置:註冊郵箱、儲存檔案(通常 acme.json),鍵類型(例如 EC384)以及驗證方法(例如 httpChallenge 在入口處 web這一點很重要 設定一個真實的電子郵件 在本節中,Let's Encrypt 使用它進行通知和續訂;如果您留下虛擬值或格式錯誤的值,則在啟動 Traefik 容器時可能會遇到錯誤。
除了這種 YAML 設定之外,還有一些部署方式使用 TOML 格式(traefik.toml)但邏輯是一樣的:它們會對解析器憑證進行分段(例如) [certificatesResolvers.main.acme]),定義挑戰(例如 dnsChallenge 同 provider = "route53")並新增預設的TLS選項,例如: forzar minVersion = "VersionTLS13" 或配置一個列表 cipherSuites 允許。
動態設定:中間件、TLS 和安全
Traefik 的動態部分通常放在一個類似這樣的文件中: dynamic.yml由文件提供者載入。在此定義 中介軟體和 TLS 選項 無需重啟 Traefik 容器即可進行修改,這對於動態調整安全性非常有用。
一個典型的例子是創建頭部中間件,例如 secureHeaders它會添加與 HSTS 和強制使用 HTTPS 相關的策略。在 YAML 檔案中,您可能會找到以下參數: sslRedirect: true, forceSTSHeader: true, stsIncludeSubdomains: true, stsPreload: true 和 stsSeconds 極高(例如,一年只需幾秒鐘)。這從瀏覽器端加強了流量安全性。
另一個常見的中間件是用於基本驗證的中間件,例如 user-auth 類型的 basicAuth其中,用戶列表以如下格式聲明: usuario:hash哈希值通常是用以下方式產生的: htpasswd 並嵌入在文件中。此中間件通常與 Traefik 控制面板路由器關聯,因此除了 HTTPS 存取外,還需要使用者名稱和密碼。
在相同的動態配置中,通常會看到一個區塊。 tls.options 使用預設設定檔(default例如,其中設定了支援的密碼套件和最低 TLS 版本。 VersionTLS12在某些部署中,定義了多個選項(例如,一個名為「設定檔」的選項)。 tls12 和另一個 default) 必要時根據不同服務調整安全等級。
在需要使用環境中 TLS 內部也 Traefik 與後端服務(例如 Portainer)之間可能會出現問題,例如這些服務沒有被公開 CA 認可的憑證。這時就需要用到這個選項了。 insecureSkipVerify,其配置如下 providers.http.tls 或者,在適當的 TLS 選項中,它允許 Traefik 繞過後端憑證驗證。這對於實驗室環境或內部自簽名證書非常有用,但應謹慎使用,因為它放寬了驗證要求。
一個實際細節:文件 dynamic.yml 可以隨時編輯。Traefik 無需重新啟動即可重新載入動態配置,因此您可以新增或刪除中間件、變更安全標頭或修改基本驗證,而不會影響代理程式的可用性。
在 Docker 獨立容器中使用 docker-compose、Traefik 和 Portainer
在不使用 Swarm 的純 Docker 場景下,最常見的操作是啟動 Traefik 和 Portainer 均有單條 docker-compose.yml 它定義了服務和一個名為(例如)的共享橋接型網絡 proxy.
該服務 特拉菲克 它通常使用官方圖片,例如 traefik:latest 或某個特定版本,例如 traefik:v3.4連接埠已映射。 80和443 用於網路流量,在某些情況下,也會使用連接埠 8080 在內部暴露控制面板。此外,還新增了該選項。 restart: unless-stopped 安全得到加強 security_opt: - no-new-privileges:true 降低容器內權限提升的風險。
關於卷,Traefik 需要掛載只讀的 Docker 套接字(/var/run/docker.sock:/var/run/docker.sock:ro)為了發現容器,靜態文件 traefik.yml 以及動態配置將儲存的目錄(./traefik-data/configurations:/configurations文件也已掛載。 acme.json這是 Traefik 儲存 Let's Encrypt 頒發的憑證的位置。該文件在主機上建立並賦予相應權限。 600 這樣只有相應的用戶才能讀取和寫入;如果將其設定為 644,Traefik 通常會發出警告。
特拉菲克施展魔法的關鍵在於 服務標籤除此之外,您還會發現: traefik.enable=true (以便 Docker 提供者公開此服務), traefik.docker.network=proxy (指示 Traefik 應該使用哪個網路與容器通訊),以及類似這樣的路由器 traefik.http.routers.traefik-secure帶有定義其入口點的標籤(websecure),主機規則(例如 Host(`traefik.tudominio.com`)),相關服務(api@internal)和身份驗證中間件(user-auth@file).
該服務 波特納 在同一 docker-compose.yml 一般使用 portainer/portainer-ce:latest (或如果您有許可證,則為企業版)。掛載的磁碟區類似:Docker 套接字、資料資料夾(./portainer-data:/data)而且通常也是 /etc/localtime 這樣它就能繼承主機的時區。
Portainer的標籤已在Traefik註冊: traefik.enable=true, traefik.docker.network=proxy一款路由器 traefik.http.routers.portainer-secure 入口點 websecure 以及類似這樣的主機規則 Host(`portainer.tudominio.com`)此外,還定義了 Traefik 應使用的服務,指向 Portainer 的內部端口,例如: traefik.http.services.portainer.loadbalancer.server.port=9000.
在這一切進行的同時,啟動後 docker compose up -d 在堆疊目錄中,Traefik 下載鏡像並建立網路。 proxy 如果它被聲明為外部面板,並且在配置的子網域中公開兩個面板,則 透過 Let's Encrypt,實現自動 HTTPS 加密從那時起,添加新服務就變成了克隆你的項目,添加一些 Traefik 標籤,然後將其連接到網路。 proxy.
Docker Swarm 場景:叢集中的 Portainer 和 Traefik
啟用Docker Swarm 後,情況會略有不同,因為服務會以堆疊的形式部署,網路通常基於覆蓋網路。不過,Traefik 和 Portainer 的底層邏輯非常相似:Traefik 繼續充當反向代理和動態服務發現器,而 Portainer 既可以獨立運行,也可以在Portainer + 代理模式下運行,以管理叢集中的遠端節點。
在典型的 Swarm 部署中,堆疊是在應用堆疊之前建立的。 兩個疊加網絡 Traefik 將使用該磁碟區在節點之間路由流量。此外,也會建立一個磁碟區來持久化 Portainer 資料(例如)。 portainer_data)而且,如果你需要的話,還有一個 acme.json 或 Traefik 儲存憑證和配置的目錄。
El docker-compose.yml (然後展開) docker stack deploy 例如,使用 -c portainer.yml通常定義兩種服務: Portainer代理商以模式運行 global 在所有 Linux 節點上,以及主 Portainer 服務(CE 或 EE),通常會保持複製模式,但僅限於在管理器上執行。
Portainer代理程式掛載Docker套接字和磁碟區目錄(/var/lib/docker/volumes為了能夠檢查資源,它會連接到與 Traefik 共享的覆蓋網絡,例如 traefik_public主 Portainer 服務可以設定為透過 TCP 與代理通訊(tcp://tasks.agent:9001事實上,在某些範例中,該命令顯示為: --tlsskipverify 建議必要時跳過 TLS 驗證。
無論在同一個堆疊或另一個堆疊上,Traefik 都會以 Swarm 模式啟動 Docker 提供者 (swarmMode = true 在 TOML 或標誌中的等效選項中),觀察已標記的服務。其配置包括: certificatesResolvers.main.acme 對 Let's Encrypt 來說, dnsChallenge 與這樣的供應商 53號公路 如果您想通過 DNS 驗證證書,並且需要一塊… tls.options 例如,在某些情況下,它是被迫的。 minVersion = "VersionTLS13" 對於預設配置文件,定義了一個明確列表。 cipherSuites 適用於 TLS 1.2 設定檔。
Portainer在Swarm旗下的品牌也遵循同樣的理念: traefik.enable=true類似路由器 traefik.http.routers.portainer 同 Host(`portainer.midominio.com`), traefik.http.routers.portainer.entrypoints=https (o websecure (根據命名規則) traefik.http.routers.portainer.tls=true 在該路由器上啟用 TLS。此外,您也可以指定 證書解析器 同 traefik.http.routers.portainer.tls.certresolver=main 如果服務內部使用 HTTPS 通信,則需要後端架構。 traefik.http.services.portainer.loadbalancer.server.scheme=https.
在 Swarm 的 Traefik 偵錯日誌中,您將看到產生的配置:類似這樣的路由器。 api y portainer已發現的服務(例如) portainer en http://10.0.1.12:9000 和服務 traefik (指向儀表板的 8080 連接埠),且,如果標籤定義不明確導致問題,則會顯示下列訊息: “無法為路由器定義服務名稱:服務過多”這通常表示路由器相關的服務有衝突或重複。
最小範例:使用 Traefik 執行 whoami、路由和 TLS 操作
在引入 Portainer 之前,使用像圖中這樣非常簡單的後端來嘗試 Traefik 是非常實用的。 traefik/whoami它會傳回有關請求的資訊。這有助於您驗證 Traefik 是否配置正確以及路由規則是否正常運作。
Un docker-compose.yml 基本服務可能包括 traefik 與影像 traefik:v3.4掛載 Docker 套接字並定義啟動標誌 --providers.docker=true, --providers.docker.exposedbydefault=false, --providers.docker.network=proxy 以及入口點 --entryPoints.web.address=:80主機上通告連接埠 80 和 8080,並建立了一個網路。 proxy 它還將使用該容器 whoami.
該服務 whoami 它從同一網路啟動,並標記為 traefik.enable=true然後,使用標籤定義一個路由器。 traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`) 並且表明您的入口點是 web如果你提出請求 curl -H "Host: whoami.docker.localhost" http://localhost/您將看到包含主機名稱、IP 位址、標頭等資訊的回應,這證實了 Traefik 路由正確。
從那以後,就很簡單了。 按路徑新增路由例如,您可以建立另一項服務。 whoami-api 使用相同的圖像,在同一個網路上,並為其添加以下類型的規則: Host(`whoami.docker.localhost`) && PathPrefix(`/api`)因此,根 / 去 whoami 原始文件和請求 /api 將為他們服務 whoami-api您可以透過向以下地址發送請求來驗證這一點: / 或 /api 與同一主機相同。
激活 TLS 在這種本機環境下,一種方法是為該網域產生自簽名憑證。 *.docker.localhost 同 openssl您建立了一個目錄 certs,你生成 local.key y local.crt然後,您可以新增一個動態檔案(例如)。 dynamic/tls.yml)與該部分 tls: 以及這些路線 certFile y keyFile 指向這些文件。
接下來,您需要更新 Traefik 服務定義。 docker-compose.yml 掛載資料夾 ./certs 和文件夾 ./dynamic 在容器內部,您可以使用以下方式啟動安全 API: --api.dashboard=true你創建了入口點 websecure (--entryPoints.websecure.address=:443)並在那裡啟用 TLS --entryPoints.websecure.http.tls=true你還需要標記儀表板路由器和路由器。 whoami 供他們使用 websecure 並且有 tls=true.
一旦上線,您就可以訪問了。 https://whoami.docker.localhost/ 然後使用自簽名憑證連線到 Traefik 面板,並接受瀏覽器的安全警告。這種體驗與您之後在生產環境中使用 Let's Encrypt 的體驗非常相似,但無需依賴公共 DNS 伺服器。
最佳實務、應用程式部署和解決常見問題
所有這些例子中反覆出現的一個模式是: Traefik 大大簡化了新應用程式的部署。一旦你有了基礎堆疊(Traefik + Portainer + 網路) proxy (加上證書),新增服務通常可以歸結為:
克隆項目或複製您的 docker-compose.yml 向伺服器發送請求,使用以下方式將子網域指向主機的 IP 位址: 記錄A 例如,在您的 DNS 中 app.tudominio.com),然後將鍵標籤新增至服務: traefik.enable=true, traefik.docker.network=proxy 以及一個路由器,該路由器為該子網域配置了一條主機規則,指定了安全入口點。 websecure Y EL 使用正確的內部連接埠提供服務.
例如,許多教學課程會示範如何部署一個小型應用程式。 FastAPI 已分離:新增了四個標籤,確保其加入網路。 proxy 在本節中 networks 德爾 docker-compose.yml做完之後 docker compose up -d 應用程式會自動出現在 Traefik 控制台上,並啟用 TLS。 Traefik 的自動發現功能意味著您甚至無需調整其靜態設定。
為確保一切順利進行,需要注意一些細節: 不要重複使用相同的路由器標識符 在各種應用程式中,檢查每個路由器是否只關聯一個服務(避免出現「服務過多」錯誤),使用一致的網路名稱(例如, proxy 在所有你想公開的堆疊上),並且,如果你使用 Let's Encrypt,請確保 acme.json 它擁有 600 權限,並且配置的電子郵件有效。
在 Swarm 環境中,也要檢查 Traefik 配置是否包含 Docker 提供者。 swarmMode=true y watch=true以及服務的限制(例如) node.role == manager (對 Portainer 而言)不會與 Traefik 的部署位置衝突。調試日誌非常詳細,但對於定位路由或 TLS 問題至關重要。
結合Docker、Traefik 和 Portainer,您可以在單一伺服器上設定完整的輕量級編排環境,該環境具有圖形化儀表板、自動憑證和非常快速的部署流程,其中新增、更新或移除服務只需調整幾行 YAML,然後讓 Traefik 完成反向代理程式和 TLS 等繁瑣工作即可。
