毋庸置疑,容器已經成爲企業IT基礎設施中必不可少的部分,它具備許多的優勢,好比:git
可是,許多用戶仍然像對待典型虛擬機同樣對待容器,而忘記了容器具備重要的特徵:即容器是一次性的。docker
這種特徵迫使用戶改變他們對如何處理和管理容器的見解。那麼該如何保持容器的最佳效益呢?如下將介紹Docker容器中應避免的10件事。數據庫
一、不要將數據存儲在容器中緩存
由於你能夠中止,銷燬或更換容器。在容器中運行的應用程序版本1.0應該容易地由版本1.1替換,而不會形成任何影響或數據丟失。所以,若是須要存儲數據,請批量存儲。在這種狀況下,還應該注意兩個容器是否在同一捲上寫入數據,由於這可能會致使損壞。確保你的應用程序是爲了寫入共享數據存儲。安全
二、不要將應用程序分爲兩部分進行交付服務器
有些人看到像虛擬機這樣的容器,大多數人傾向於認爲他們應該將應用程序部署到現有的運行容器中。在開發階段,你須要不斷進行部署和調試,這是正確的。但對於一個連續傳遞(CD)管道QA和Production,你的應用程序應該是鏡像的一部分。併發
三、不要建立大鏡像微服務
由於大鏡像將很難分發。確保僅具備運行應用程序/進程所需的文件和庫。不要安裝沒必要要的軟件包或運行將許多文件下載到新鏡像層的「更新」 。測試
四、不要使用單層鏡像編碼
爲了有效利用分層文件系統,請始終爲操做系統建立本身的基礎鏡像層,爲用戶名定義建立另外一層,爲運行時安裝建立另外一層,爲配置建立另外一層,最後是應用程序的另外一層。從新建立,管理和分發鏡像將更加容易。
五、不要從正在運行的容器中建立鏡像
換句話說,不要使用「 docker commit」來建立鏡像。這種建立鏡像的方法不可複製,應徹底避免。始終使用徹底可複製的Dockerfile或任何其餘S2I(從源到鏡像)方法,若是將Dockerfile存儲在源代碼控制存儲庫(git)中,則能夠跟蹤對Dockerfile的更改。
六、不要只使用「最新」標籤
對於Maven用戶,最新標籤就像「 SNAPSHOT」同樣。因爲容器的分層文件系統性質,所以鼓勵使用標籤。幾個月後生成鏡像並發現你的應用程序沒法運行是由於父層(Dockerfile中的FROM)被不兼容向後的新版本或錯誤的新版本所取代,你不會感到驚訝從構建緩存中檢索了「最新」版本。在生產環境中部署容器時,也應避免使用「最新」標籤,由於你沒法跟蹤正在運行哪一個版本的鏡像。
七、不要在單個容器中運行多個進程。
容器很是適合運行單個進程(http守護程序,應用程序服務器,數據庫),可是若是有多個進程,則管理起來可能會遇到更多麻煩,檢索日誌,並分別更新流程。
八、不要將憑據存儲在鏡像中。
使用環境變量,你不想對鏡像中的任何用戶名/密碼進行硬編碼。使用環境變量從容器外部檢索該信息。這個原理的一個很好的例子是Postgres鏡像。
九、不要以root用戶身份運行進程
「默認狀況下,docker容器以root用戶身份運行。隨着docker的成熟,可能會提供更多安全的默認選項。目前,要求root用戶對其餘人是危險的,可能並不是在全部環境中均可用。你的鏡像應使用USER指令爲運行容器指定一個非root用戶。
十、不要依賴IP地址
每一個容器都有本身的內部IP地址,若是你啓動和中止容器,它可能會更改。若是應用程序或微服務須要與另外一個容器通訊,請使用環境變量將正確的主機名和端口從一個容器傳遞到另外一個容器。
因此,在Docker容器的應用中,這個10個壞習慣要不得,注意!注意!再注意!