容器可以解決很多問題,并且具有諸多優勢,當你投身其中時便會發現其奧妙所在。
第一:容器是不可變的 - 操作系統,庫版本,配置,文件夾和應用程序都包裝在容器內。 您可以使用通過相同QA測試的鏡像,使產品具有相同的表現。
第二: 容器是輕量級的 - 容器的內存占用很小。沒有成百上千的MB,容器只會分配主進程的內存。
第三: 容器是快速的 - 你可以像一個典型的linux進程一樣快速啟動一個容器。只需要幾秒鐘,您就可以啟動一個新的容器。
然而,許多用戶仍然像對待典型的虛擬機那樣對待容器。他們似乎都忘記了容器的重要特性:容器是一次性的。
容器的準則:
“容器是臨時的”。
這個特性迫使用戶改變處理和管理容器的心態;我將會向你說明在容器中不應該做的那些事,以確保容器可以發揮出最佳效果:
1) 不要將數據存儲在容器中 - 容器可以被停止,銷毀或者替換。 在容器中運行的應用程序版本1.0很容易被1.1版本替換而不會產生任何影響或數據丟失。 因此,如果您需要存儲數據,請在卷中進行。 當然在這種情況下,您還應該注意,如果兩個容器在相同的卷上寫入數據,有可能會導致損壞。 請確保您的應用程序被設計為寫入共享數據存儲。
2)不要將應用程序分成兩個部分 -有些人認為容器像虛擬機,大多數人往往認為他們應該將應用程序部署到現有的運行容器中。 在開發階段這樣是可以的,您需要連續部署和調試;但對于連續交付(CD)管道到QA和產品,您的應用程序應該是映像的一部
3)不要創建大鏡像 - 大圖像將更難分發。 確保您僅具有運行應用程序/進程所需的文件和庫。 不要安裝不必要的包或運行“更新” (yum更新) ,下載許多文件到一個新的圖像層。
4)不要使用單層鏡像 - 要有效地使用分層文件系統,始終為您的操作系統創建您自己的基本鏡像層, 用戶名定義的為一個圖層, 運行時安裝的為一個圖層,配置的為一個圖層,最后為您的應用程序建立一個層。 這樣將更容易重新創建,管理和分發您的圖像。
5)不要從正在運行的容器中創建鏡像 – 換句話說,不要使用“docker commit”創建鏡像。 這種創建圖像的方法不可重現,應該完全避免。 始終使用Dockerfile或任何其他完全可重復的S2I(源圖像)的方法,如果將它存儲在源代碼控制存儲庫(git)中,您可以跟蹤對Dockerfile的更改。
6)不要只使用“最新”標簽 - 最新標簽就像“Maven用戶快照”。 基于容器分層文件系統的性質,標簽實際上是被鼓勵使用的,你應該不會希望看到當你幾個月后創建鏡像時的不兼容,或從創建緩存的檢索中檢索到了一個錯誤的“最新”版本。當您不能跟蹤正在運行的版本時,在生產環境部署容器時應該避免“最新”標簽的出現。
7)不要在一個容器中運行多個進程 - 容器可以完美的運行單個進程(http守護進程,應用程序服務器,數據庫),但如果你有一個以上的進程,你可能會在管理上,檢索日志,以及單獨地更新的過程中遇到更多的麻煩。
8)不要在鏡像中存儲憑證。 使用環境變量 – 不要對鏡像中的任何用戶名/密碼進行硬編碼。 使用環境變量從容器外部檢索此信息。 這個原則的一個很好的例子是Postgres圖像 。
9)不要以root用戶身份運行進程 - “默認情況下,docker容器會以root身份運行。隨著Docker的成熟,更安全的默認選項可能會變得可用。 現在,要求root對其他人來說是危險的,并且可能在所有環境中都不可用。 您的鏡像應該使用USER指令來為容器指定非root用戶
10)不要依賴IP地址 - 每個容器都有自己的內部IP地址,如果啟動和停止容器,它的地址可能會改變。 如果您的應用程序或微服務需要與另一個容器通信,請使用環境變量將正確的主機名和端口從一個容器傳遞到另一個容器。