Docker

docker-compose + traefik - 將流量定向到 docker-compose 網路之外的服務

  • July 20, 2020

我提前為篇幅道歉 - 但這很有趣,特別是對於建築師和 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;博士:

  1. 開發者主機在 docker-compose 網路中以host.docker.internal.
  2. 文件提供者為團隊維護的每項服務提供服務和路由。文件提供程序中的路由設置為低優先級。
  3. docker provider 為每個 docker-compose 容器提供服務和路由。以這種方式創建的路由設置為高優先級。

結果:

  • 當容器存在時 - 它已被使用。
  • 當容器停止時 -traefik將嘗試開發機器。

引用自:https://serverfault.com/questions/1025442