簡體   English   中英

Docker容器中的配置管理

[英]configuration management in Docker Containers

目前我有配置文件存儲在GitHub中。 我有一個json文件,格式如下{ DEV: { key1 : val1, key2 : val2 }PROD: { key1 : val1, key2 : val2 } }

我的構建系統克隆git repo,構建項目並創建Docker鏡像並存儲在私有Docker注冊表中。 我將jar文件和配置文件復制到Docker鏡像中。 每當我旋轉一個容器時,我都會注入一個環境變量(ENV = DEV / PROD),我的代碼使用它來根據環境讀取配置。

我在這里有幾個問題:

  • 維護特定於環境的配置的最佳方法是什么?

  • 配置文件可能包含敏感數據,如api密鑰和秘密,當我構建Docker映像時,如何加密,存儲和解密?

  • 如果我想更改某些配置,我需要觸發構建,因為我的配置文件放在Docker鏡像中。 我可以將配置文件放在Docker容器之外作為卷,以便我可以替換配置文件並重新啟動容器,以便代碼讀取更新的配置嗎? 如果我想放置在Docker容器之外,我還可以使用任何集群管理工具進行容器編排/管理(Kubernetes / ECS)嗎?
  • 在Docker容器中運行應用程序的方法是通過重新啟動容器而不是構建新的docker鏡像並部署新容器來讀取更新的配置?
  1. ENV變量很好。 如果你有一個非常復雜的系統,你可以旋轉Consul和/或Vault來管理安全配置,但是如果你的系統很小,這個爛攤子就不值得付出努力。
  2. 您可以將所有配置加密為哈希值,並使用只知道應用程序的密鑰對其進行解密。
  3. 使用docker-compose。 它允許完美的機制 - 你在這里實際請求的機制,例如docker-compose.yml

     version: "2" services: server: hostname: server container_name: server image: serverBla build: ./server env_file: - ./config/config.env 

文件./config/config.env是您的“動態”配置。 您只需重新創建容器即可刷新應用內的值。 據我所知,docker-compose可以很好地處理你提到的任何事情。

我對你的大部分問題的回答是“Vault by Hashicorp”

您可以在您的環境中啟動Vault群集,讓容器連接到,並在啟動和運行時從Vault檢索機密。 實現秘密檢索的最簡單的方法是在啟動時將秘密讀入容器並推入容器的ENV。

如果您更進一步,可以使用語言級別的Vault客戶端庫在應用程序運行時檢索和刷新機密,從而無需重新啟動容器以檢索新機密。

這如何適應你的要求?

  • 維護特定於環境的配置的最佳方法是什么?

我會說Vault。 如果需要,可以使用Puppet和Hiera將秘密寫入文件或文件夾,但這意味着將秘密寫入磁盤並不理想。 TMK K8s存儲未經加密的秘密,這也是不理想的。 我更喜歡這里的保險櫃。 每個環境都有自己的Vault群集,並且有“特定於環境的配置”。

  • 配置文件可能包含敏感數據,如api密鑰和秘密,當我構建Docker映像時,如何加密,存儲和解密?

往上看。 保險櫃存儲秘密加密的秘密。 使用您的Vault令牌(如果需要,可以通過卷裝入容器)訪問密碼並解密它們。 然后,您可以在啟動容器主進程之前將它們推送到ENV,或者進行更緊密的集成並使Vault成為應用程序邏輯的一部分。

  • 如果我想更改某些配置,我需要觸發構建,因為我的配置文件放在Docker鏡像中。 我可以將配置文件放在Docker容器之外作為卷,以便我可以替換配置文件並重新啟動容器,以便代碼讀取更新的配置嗎? 如果我想放置在Docker容器之外,我還可以使用任何集群管理工具進行容器編排/管理(Kubernetes / ECS)嗎?

這個問題的答案是高度依賴於配置包含什么 如果它特定於代碼修訂版,我強烈建議將其與代碼捆綁在一起,以防止代碼和配置中的任何不匹配。

如果它實際上與代碼無關(例如:調整值或秘密),我會把它們放在Vault中 - 當你可以將它們存儲在加密的秘密管理系統中時,為什么要把它們放在一個文件中?

但是,如果您的心臟設置在文件上,您可以輕松地將它們從已知卷安裝到已知路徑,並且所有調度系統(包括Nomad現在)都允許使用已部署的容器進行卷安裝。

  • 在Docker容器中運行應用程序的方法是通過重新啟動容器而不是構建新的docker鏡像並部署新容器來讀取更新的配置?

使用Vault: envconsul是您的朋友,如果您希望秘密僅在啟動時更改。

請參閱上面的我對配置值的運行時更改的看法。

實際執行的tl; dr是創建一個'startup'腳本,它是容器的入口點。 啟動腳本將從您選擇的任何管理系統(卷安裝,Vault,文件等)中檢索秘密,並准備好供您的應用程序讀取。

啟動腳本然后啟動主應用程序的運行過程。

希望這可以幫助!

PS:我不為Hashicorp工作,但我喜歡他們用於處理容器的軟件。 通過購買Hashicorp的不同軟件可以獲得很多你可以從K8s獲得的單一解決方案。 單個應用程序(Hashicorp)允許您選擇和混合所需的解決方案,但也需要更高的維護開銷。 K8s是一個相當沉重的鎖定,但你可能想要的大部分事情都不需要學習任何東西。

祝好運

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM