將應用程序遷移到容器的 5 個步驟
一般來說,人們想使用你的應用程序這是一件好事。然而,當應用程序在伺服器上運行時,應用程序受歡迎是有代價的。隨著用戶對資源需求的增加,在某些時候,你可能會發現你需要擴展你的應用程序。一種選擇是在這種情況下增加更多的伺服器,建立一個像 Nginx 這樣的 負載平衡器,以滿足需求。但是,這種方法的成本可能很昂貴,因為當需求低的時候,在沒有流量的伺服器上運行你的應用程序的實例並不會節省資源。容器的優點是它是非持久的,在有需求時啟動新實例,而隨著需求的減少逐漸消失。如果這聽起來像是你需要的功能,那麼現在可能是將你的應用程序遷移到容器的時候了。
將應用程序遷移到容器中,很快就會變得迷失方向。雖然容器內的環境可能感覺很熟悉,但許多容器鏡像是最小化的,而且它們被設計為無狀態的。不過在某種程度上,這也是容器的優勢之一。就像 Python 虛擬環境一樣,它是一塊白板,可以讓你構建(或重建)你的應用程序,而沒有許多其他環境所提供的無形的默認值。
每一次向雲服務的遷移都是獨一無二的,但在將你的應用程序移植到容器之前,你應該注意以下幾個重要原則。
1、理解你的依賴關係
將你的應用程序移植到容器中是一個很好的機會,可以了解你的應用程序實際依賴的東西。由於除了最基本的系統組件外,很少有默認安裝的組件,你的應用程序一開始不太可能在容器中運行。
在重構之前,確定你的依賴關係。首先,在你的源代碼中用 grep
查找 include
、import
、require
、use
或你選擇的語言中用來聲明依賴關係的任何關鍵詞。
$ find ~/Code/myproject -type f
-iname ".java"
-exec grep import {} ;
不過,僅僅識別你使用的特定語言的庫可能是不夠的。審計依賴關係,這樣你就能知道是否有語言本身運行所需的低級庫,或者特定的模塊以預期的功能運行。
2、評估你的數據存儲
容器是無狀態的,當一個容器崩潰或停止運行時,該容器的實例就永遠消失了。如果你要在該容器中保存數據,這些數據也會消失。如果你的應用程序存儲用戶數據,所有的存儲必須發生在容器之外,在你的應用程序的實例可以訪問的某個位置。
你可以使用映射到容器內某個位置的本地存儲來存儲簡單的應用程序配置文件。這是一種常見的技術,適用於需要管理員提供簡單配置值的 Web 應用程序,如管理員的電子郵件地址、網站標題等。比如說:
$ podman run
--volume /local/data:/storage:Z
mycontainer
然而,你可以配置一個資料庫,如 MariaDB 或 PostgreSQL,將大量數據在幾個容器中的共享存儲。對於私人信息,如密碼,你可以配置一個機密存儲。
對於你需要如何重構你的代碼,相應地調整存儲位置,這可能意味著改變路徑到新的容器存儲映射,移植到不同的資料庫,甚至是納入容器特定的模塊。
3、準備好你的 Git 倉庫
容器在構建時通常會從 Git 倉庫中拉取源代碼。一旦你的 Git 倉庫成為你的應用程序的生產就緒代碼的標準來源,你必須有一個管理 Git 倉庫的計劃。要有一個發布分支或生產分支,並考慮使用 Git 鉤子 來拒絕意外的未經批准的提交。
4、了解你的構建系統
容器化應用程序可能沒有傳統的發布周期。當容器被構建時,它們會被從 Git 中拉取出來。你可以啟動任何數量的構建系統作為容器構建的一部分,但這可能意味著調整你的構建系統,使其比過去更加自動化。你應該重構你的構建過程,使你完全有信心它能在無人值守的情況下工作。
5、構建鏡像
構建鏡像不一定是複雜的任務。你可以使用 現有的容器鏡像 作為基礎,用一個簡單的 Docker 文件對其進行調整。另外,你也可以使用 Buildah 從頭開始構建你自己的鏡像。
在某種程度上,構建容器的過程與實際重構代碼一樣,都是開發的一部分。容器的構建是為了獲取、組裝和執行你的應用程序,所以這個過程必須是自動化的、健壯的。建立一個好的鏡像,你就為你的應用程序建立了一個堅實可靠的基礎。
容器化
如果你是容器的新手,不要被術語所嚇倒。容器只是另一種環境。容器化開發的感知約束實際上可以幫助你專註於你的應用程序,並更好地了解它是如何運行的、它需要什麼才能可靠地運行,以及當出錯時有哪些潛在的風險。相反,這導致系統管理員在安裝和運行你的應用程序時受到的限制要少得多,因為從本質上講,容器是一個受控的環境。仔細審查你的代碼,了解你的應用程序需要什麼,並相應地重構它。
via: https://opensource.com/article/22/2/migrate-application-containers
作者:Alan Smithee 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive