天天看點

技術幹貨 | Docker容器中需要避免的十種常見誤區

Docker容器的三大優勢:

  1. 第一:具備恒定特性–作業系統、庫版本、配置、檔案夾以及應用程式全部涵蓋在内。大家可以将品質檢查流程中使用的測試鏡像原封不動地引入生産環境當中。
  2. 第二:具備輕量化特性–容器的體積非常小巧。相較于動辄成百上千MB的作業系統,它隻需要配備主程序所必需的記憶體外加數十MB額外容量。
  3. 第三:速度驚人–大家可以享受等同于單一程序的容器啟動速度。相較于長達數分鐘的傳統負載啟動時長,現在我們完全能夠在幾秒鐘内啟動一套新容器。 

    不過很多使用者仍然在以對待典型虛拟機的方式審視容器,在這種情況下他們往往沒辦法發揮容器技術所蘊含的各類優勢。是以我們需要再次強調一項基本原則:容器具備一次性特征。

容器座右銘: “容器屬于臨時性(一次性)系統。”

技術幹貨 | Docker容器中需要避免的十種常見誤區

這一特性的存在要求使用者轉變既有思路,選擇更為合适的方針處理并管理容器。接下來,我會通過十種常見誤區幫助大家了解發揮容器優勢的合理途徑:

1)不要将資料存放在容器内–容器系統可随時進行停止、銷毀或者替換。運作在容器環境下的應用程式1.0版本應該可以輕松更換為1.1版本,且不會影響或者破壞相關資料。考慮到這一點,如果大家需要儲存資料,請将其存儲在存儲卷當中;不過需要注意的是,如果有兩套容器同時指向同一存儲卷,則可能引發故障。大家必須確定自己的應用程式使用面向共享式資料存儲機制的寫入設計方案。

2)不要以拆分方式進行應用程式釋出–有些朋友仍然帶着虛拟機思路審視容器。他們大多認為自己應該将應用程式部署至目前正在運作的容器當中。然而,這種作法隻适用于開發階段,進而實作應用開發所必需的持續部署與調試;一旦轉移至品質檢查與生産環境下的持續部署流程,應用程式則必須作為鏡像本身的組成部分。請記住:容器具有恒定特性。

3)不要建立大型鏡像–體積過大的鏡像會加大其釋出難度。大家需要確定在鏡像中隻保留運作應用程式/程序所必需的檔案與庫。不要安裝任何非必要軟體包或者在建構過程中運作“更新”(yum update)。

4)不要使用單層鏡像–為了更為合理地使用分層檔案系統,請大家務必為作業系統、安裝軟體、配置以及應用程式分别建立獨立層。這不僅能夠簡化鏡像的建立與管理工作,亦能降低分發難度。

5) 不要利用運作中的容器建立鏡像–換言之,不要使用“docker commit”建立鏡像。以這種方式建立的鏡像不具備再生産能力且無法實作版本控制性,是以絕對不值得提倡。相反,使用Dockerfile或者任何S2I(即源到鏡像)方法能夠有效確定整體再生産能力。

6)不要隻使用“最新”标簽–最新标簽類似于Maven使用者所熟悉的“SNAPSHOT”。各标簽隻适合在分層檔案系統當中使用。如果大家在鏡像建構完成的兩個月之後,意外發現自己的應用程式由于頂層版本替換而造成向下相容性缺失或者build緩存“最新”版本無法運作,那麼無疑會造成巨大的麻煩。總體來講,在向生産環境中部署容器時,必須避免使用最新标簽。

7)不要在單一容器内運作多個程序–容器系統非常适合運作單一程序(例如http域名、應用程式伺服器以及資料庫等等),但如果大家在容器内使用多個程序,則可能很難對其分别進行管理、擷取日志記錄以及更新。

8)不要在鏡像内儲存憑證,建議使用環境變量–大家絕對不要以寫死形式在鏡像中儲存任何使用者名/密碼。相反,我們應當利用環境變量從容器之外擷取此類資訊。在這方面,最完美的示例就是postgres鏡像。

9)以非root使用者運作程序– “預設情況下,Docker容器以root方式運作。随着Docker的不斷發展成熟,更多更為安全的預設選項亦陸續出現。就目前而言,使用root權限仍有可能造成安全隐患且缺乏對全部環境的良好适應效果。大家的鏡像應當使用USER指令将容器指定為非root使用者角色”。(來自Docker鏡像建立者指南)