2017-06-02 42 views
2

我正在研究利用Docker容器的雲部署。我們的應用程序將利用Apache Tomcat和PostgreSQL數據庫。如何使用唯一的數據庫連接字符串部署同一個Docker映像的多個實例

我的問題是關於在部署到雲中的羣集時爲多個客戶端配置和維護映像的最佳實踐。

我們希望爲衆多客戶使用單個基礎映像,而不是爲每位客戶維護一個映像。這意味着爲圖像的每個部署創建一個新的context.xml(爲Tomcat應用程序定義數據庫連接字符串),因爲每個客戶都需要連接到自己的數據庫。

我知道我可以手動將context.xml文件複製到已部署的容器,這很好,直到我們開始在具有多個副本的集羣中運行這些容器。這需要我們將此連接字符串複製到我們創建的每個副本,並且每次我們用新版本更新容器時都會重複此過程。

有沒有更好的解決方案,這個問題的許多容器運行相同的圖像,但每組容器需要自己的數據庫連接字符串?或者有沒有一種方法可以利用容器編排來更新同時運行相同實例的所有容器中的context.xml文件?

PS。我已經研究過使用環境變量,但context.xml文件是靜態的,不會從這些變量中加載值。至少這是我的理解。

+0

我可能會誤解Kubernete Pod的工作原理。一個pod是否包含集羣上運行的所有副本?如果是這樣,kubectl cp命令應該將文件複製到所有副本然後更正? – CAmoruso

+0

你不應該使用'kubectl cp'。當豆莢崩潰/死亡時,新的豆莢將從部署規範中創建,並且它們不會具有這些文件。您應該使用環境變量或ConfigMaps。 –

回答

0

您如何計劃跟蹤數據庫連接字符串?他們需要住的地方......

服務是什麼讓你吊艙之間溝通和服務被選擇瞄準吊艙:因此,你可以有一個服務目標相同羣類型的集羣(即你的DB)

如果您有每個客戶的數據庫,則需要每個客戶的服務。 現在的問題是將每個App Pod指向正確的服務。

當您部署Pod時,您需要知道它指向何處。您可以在啓動時將額外的環境變量傳遞到Pod,標記爲--env=

您還可以向Pods添加標籤,並且如果要真正實現自動化,您需要某種數據庫或鍵值存儲來存儲要檢索Pod的 服務名稱,請在啓動時運行腳本以查找您的Pod標籤並獲取它的DB字符串。

+0

是的,我們正在計劃爲每位客戶提供一項服務,因爲您提到了這將允許我們爲每個吊艙分配一個外部IP。問題是將每個吊艙指向數據庫。我研究了使用環境變量,但是定義到DB的連接字符串的context.xml不使用環境變量。這是Tomcat上下文文件的已知限制。所以我無法在啓動時傳入正確的連接字符串值。如果我錯了,請糾正我,但這是我的理解。 – CAmoruso

+0

您可以在啓動時將ENV VARIABLES傳遞給Pod。他們只是被添加到環境中。這與Tomcat無關 – MrE

+0

這個答案大部分是正確的。正如你所建議的那樣,我最終使用了環境變量。然而正如我在我的問題中指出的那樣,Tomcat用來設置連接字符串的Context.xml文件似乎沒有使用這些環境變量。解決這個問題的方法是在docker文件中包含一個shell腳本,使用CMD選項,在啓動容器時將這些環境變量讀入context.xml文件。 – CAmoruso

相關問題