[英]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-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群集,並且有“特定於環境的配置”。
往上看。 保險櫃存儲秘密加密的秘密。 使用您的Vault令牌(如果需要,可以通過卷裝入容器)訪問密碼並解密它們。 然后,您可以在啟動容器主進程之前將它們推送到ENV,或者進行更緊密的集成並使Vault成為應用程序邏輯的一部分。
這個問題的答案是高度依賴於配置包含什么 。 如果它特定於代碼修訂版,我強烈建議將其與代碼捆綁在一起,以防止代碼和配置中的任何不匹配。
如果它實際上與代碼無關(例如:調整值或秘密),我會把它們放在Vault中 - 當你可以將它們存儲在加密的秘密管理系統中時,為什么要把它們放在一個文件中?
但是,如果您的心臟設置在文件上,您可以輕松地將它們從已知卷安裝到已知路徑,並且所有調度系統(包括Nomad現在)都允許使用已部署的容器進行卷安裝。
使用Vault: envconsul是您的朋友,如果您希望秘密僅在啟動時更改。
請參閱上面的我對配置值的運行時更改的看法。
實際執行的tl; dr是創建一個'startup'腳本,它是容器的入口點。 啟動腳本將從您選擇的任何管理系統(卷安裝,Vault,文件等)中檢索秘密,並准備好供您的應用程序讀取。
啟動腳本然后啟動主應用程序的運行過程。
希望這可以幫助!
PS:我不為Hashicorp工作,但我喜歡他們用於處理容器的軟件。 通過購買Hashicorp的不同軟件可以獲得很多你可以從K8s獲得的單一解決方案。 單個應用程序(Hashicorp)允許您選擇和混合所需的解決方案,但也需要更高的維護開銷。 K8s是一個相當沉重的鎖定,但你可能想要的大部分事情都不需要學習任何東西。
祝好運
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.