docker-compose + traefik - 將流量定向到 docker-compose 網路之外的服務
我提前為篇幅道歉 - 但這很有趣,特別是對於建築師和 traefik 嚮導。
挑戰:
底線是,我希望有一個設置,我們可以利用
traefik
動態配置功能:自動檢測容器何時停止,並知道回退到開發人員機器/外部主機上的外部服務。
或者 - 當一個 local-db 容器啟動時,知道它比來自外部源的 db 服務更喜歡它。
完整的圖片
我需要為幾個團隊優化工作流程。
約束:
- 開發人員在多層複雜的微服務網格上工作
- 網格中的服務數量約為 50,其中一些是記憶體密集型的
- 本地展示和驗收測試需要從最終使用者的角度展示整個網格作品
- 現在要求開發人員在本地執行所有網格,除了一些具有實時數據副本的共享數據庫——有時也可能在本地執行。
這需要在開發人員機器上執行絕對最低要求。目前的解決方案依賴於 docker-compose 和
traefik@1.x
,我被要求保留這個,但是,我相信升級到traefik@2.x
會被接受。追求的案例
實際上,我在這裡與您一起追求兩個案例,我相信它們具有相同的解決方案-至少在理論上…
案例一 - 多個微服務的本地開發
Dev-Mode = running a process in debug mode, with IDE, file-watch live reloads, etc. AS A - developer of services in mid layers of the service mesh I WANT - to be able to direct traffic to services under development to native processes on my machine, and keep the rest in the compose network SO THAT - I can run in Dev-Mode only services under development, while all the rest in the mesh run using production-level docker images in docker-compose.
案例二 - 本地開發和外部數據庫
AS A - developer of data brokers in the mesh I WANT - to control if containers get to the shared db or to local db container using traefik SO THAT - I can keep applications in the containers completely agnostic to the topography in which they run
那麼缺少什麼?
作為一個開始 - 由於 Traefik 是所有容器間通信通過的服務匯流排 - 我正在尋找一種配置方法以從docker-compose 網路外部
traefik
使用服務。第一個案例意味著
traefik
用作服務匯流排——知道每個服務在哪裡執行的唯一實體,可以是容器,也可以是 docker-compose 網路外部的服務。第二個案例意味著設置
traefik
將流量定向到在 docker-compose 網路之外執行的程序,但特別是在開發人員的機器上,這反過來又使用來自 compose 網路的服務(為此,dev compose,不像生產 compose - 為網格中的每個節點公開一個入口點,包括僅在生產內部使用的服務)。兩個一個的價格
我知道這裡有兩個問題,但我想不出另一種方法來分別提出每個問題並獲得與全貌相關的答案……
我希望有一個設置,我們可以利用
traefik
動態配置功能來:自動檢測容器何時停止,並知道回退到開發人員機器或任何其他主機上的外部服務。或者 - 當一個 db 容器啟動時,知道比外部 db 服務更喜歡它。
我們可以要求開發人員將記錄添加到他們的
hosts
文件中,但基於 DNS 的解決方案會更受歡迎,特別是如果我們可以使用 docker 內置的 DNS :)幫助 ?
任何幫助或指出正確的方向將不勝感激!
我已經做到了。
查看此處展示的單獨解決方案:
https://github.com/osher/lcdev-using-compose-and-traefik
TL;博士:
- 開發者主機在 docker-compose 網路中以
host.docker.internal
.- 文件提供者為團隊維護的每項服務提供服務和路由。文件提供程序中的路由設置為低優先級。
- docker provider 為每個 docker-compose 容器提供服務和路由。以這種方式創建的路由設置為高優先級。
結果:
- 當容器存在時 - 它已被使用。
- 當容器停止時 -
traefik
將嘗試開發機器。