2016-01-20 38 views
0

一個微服務停留在一個Docker容器中。現在,假設我想升級微服務 - 例如,某些配置已更改,我需要重新運行它。重新創建Docker鏡像而不是重用 - 對於微服務

我有兩個選擇:

  1. 我可以嘗試重新使用現有的圖像,通過具有容器上運行啓動腳本,並通過讀取新的配置(如果有的話),從更新的微服務一些共享的音量。更新後,腳本運行微服務。

  2. 我可以簡單地刪除現有的圖像和容器,並創建新的圖像(新名稱)和新的容器與更新的配置/代碼。

解決方案#2對我來說似乎更加健壯。沒有「更新」過程,只有單個容器創建。

但是,讓我困擾的是,如果圖像的重新創建有一些不良的副作用?像很多懸掛的圖像或類似的東西。想象一下,在用戶使用應用程序的時間內,這可能會經常發生 - 例如,如果開發人員嘗試了某些內容,他想要使用不同的微服務配置,並且他會經常重新啓動它。但一旦配置好了,這個不會改變。此外,當我說配置我不只是意味着配置文件,而且用戶代碼等

+0

這有什麼好運氣? – jtmarmon

+0

好吧,我的問題不是如何使用Docker進行本地開發......它在用戶使用應用程序的生產環境中,後面是一個他們不知道的docker。現在,在這種情況下 - wdyt @jtmarmon,你的答案仍然保持不變嗎? – igr

+1

你提到的「開發者玩耍」使你看起來像是指當地的發展。在生產中,你應該部署一個新的容器。放置一些晃動的圖像沒有什麼不妥 - 它實際上可以回滾。如果他們佔用了太多的磁盤空間,你可以用'docker rmi ' – jtmarmon

回答

2

對於生產的變化,你會想部署一個新的圖像更改文件。這確保您的流程是可重複的。

但是,每次編寫新的代碼行時,通過製作新圖像進行開發將是一場噩夢。最好的選擇是運行Docker容器並將容器的源代碼目錄安裝到文件系統中。這樣,當您在編輯器中進行更改時,容器中的代碼也會更新。

你可以像這樣實現:

docker run -v /Users/me/myapp:/src myapp_image

這樣,你只需要建立myapp_image一次,就可以輕鬆地之後進行更改。

現在,如果您有一個未安裝的運行容器,並且您想對文件進行更改,那麼也可以這樣做。這不是建議的,但很容易看出你爲什麼想要。

如果你運行:

docker exec -it <my-container-id> bash

這將使你進入容器,而你在裏面你可以在你選擇的vim /納米/編輯修改。

1

對於生產環境來說,您的選項#2絕對可取。理想情況下,您應該在此過程中進行一些自動化操作,通常執行類似藍綠色部署的操作,將基於舊映像的容器逐個替換爲來自新的映像的容器,隨時進行測試,然後僅在滿意時進行測試新的部署是否清理以前版本的容器並刪除映像。這樣,如果需要,您可以快速回滾到以前的版本。

在開發環境中,您可能希望採取不同的方法,在運行時綁定應用程序到容器中,從而允許您動態更新而不必重新生成映像。在Docker Compose docs中有一個很好的例子,它說明了如何讓一個共同的基礎組成YML,然後對其進行擴展,以便在開發和生產場景中獲得不同的行爲。