docker技術沙龍學習

破棉襖發表於2015-04-19

簡介:

簡單的說Docker是一個構建在LXC之上的,基於程式容器(Processcontainer)的輕量級VM解決方案,Docker的初衷也就是將各種應用程式和他們所依賴的執行環境打包成標準的container/image,進而釋出到不同的平臺上執行。從理論上來講,

各種虛擬機器Image也起著類似的作用。但是

Docker container和普通的虛擬機器Image相比, 最大的區別是它並不包含作業系統核心。所以更加的輕量化。普通虛擬機器將整個作業系統執行在虛擬的硬體平臺上, 進而提供完整的執行環境供應用程式執行, 而Docker則直接在宿主平臺上載入執行應用程式.。相對於VM,docker在其輕量、配置複雜度以及資源利用率方面有著明顯的優勢。



應用場景:


1.應用打包

製作過RPM、GEM等軟體包的同學可能很清楚,每一個軟體包依賴於哪個庫的哪個版本, 往往需要明確的寫在依賴列表裡。而依賴又往往分為編譯時依賴和執行時依賴。

在傳統的基礎設施環境下,為了保證所生成的軟體包在其它機器上可正常安裝且執行, 一般需要在打包之前建立個乾淨的虛擬機器,或者手工建立個chroot環境, 然後在這個乾淨的環境下安全各種依賴包,然後執行打包指令碼。 生成軟體包以後,需要再建立一個乾淨的環境安裝、執行這個軟體包,來驗證是否符合預期。 這樣雖然也能完成打包工作,但至少有以下缺點:

  1. 耗時耗力
  2. 依賴關係容易漏掉,比如:在乾淨的環境中經過多次除錯,把缺少的依賴包一個一個的裝上了,  但最後寫spec檔案時卻忘記新增某個依賴,導致下次打包時需要重新除錯或者打包後軟體包無法使用等問題。


透過docker可以很好的解決打包問題。具體作法如下:

  1. “乾淨的打包環境”很容易準備,docker官方提供的ubuntu、centos等系統映象天生就能作為純淨無汙染的打包環境使用
  2. Dockerfile本身能起到文件固化的作用,只要寫好Dockerfile,建立好打包映象,以後就能無限次重複使用這個映象進行打包

2.多租戶資源隔離

資源隔離對於提供共享hosting服務的公司是個強需求。 如果使用VM,雖然隔離性非常徹底,但部署密度相對較低,會造成成本增加。

docker容器充分利用linux核心的namespaces提供資源隔離功能。 

結合cgroup,可以方便的設定某個容器的資源配額。 既能滿足資源隔離的需求,又能方便的為不同級別的使用者設定不同級別的配額限制。

但在這種應用場景下,由於容器中執行的程式對於hosting服務提供方來說是不可信的, 所以需要特殊的手段來保證使用者無法從容器中操作到宿主機的資源(即:越獄,儘管這種問題發生的機率很小,但安全無小事,多一層防護肯定讓人更加放心)。



3.內部開發環境

在容器技術出現之前,公司往往是透過為每個開發人員提供一臺或者多臺虛擬機器來充當開發測試環境。

開發測試環境一般負載較低,大量的系統資源都被浪費在虛擬機器本身的程式上了。

docker容器沒有任何CPU和記憶體上的額外開銷,很適合用來提供公司內部的開發測試環境。 

而且由於docker映象可以很方便的在公司內部分享,這對開發環境的規範性也有極大的幫助。

如果要把容器作為開發機使用,需要解決的是遠端登入容器和容器內程式管理問題。 雖然docker的初衷是為“微服務”架構設計的,但根據我們的實際使用經驗, 在docker內執行多個程式,甚至sshd或者upstart也是可行的。


4.隔離應用

隔離應用依賴建立應用映象並進行復制建立容易分發的即啟即用的應用允許例項簡單、快速地擴充套件測試應用並隨後銷燬它們 
有很多種原因會讓你選擇在一個機器上執行不同的應用,比如之前提到的提高開發效率的場景等。
我們經常需要考慮兩點,一是因為要降低成本而進行伺服器整合,二是將一個整體式的應用拆分成松耦合的單個服務(譯者注:微服務架構)。


5.提高開發效率

這就帶來了一些額外的好處:Docker能提升開發者的開發效率。如果你想看一個詳細一點的例子,可以參考Aater在DevOpsDays Austin 2014 大會或者是DockerCon上的演講。

不同的開發環境中,我們都想把兩件事做好。一是我們想讓開發環境儘量貼近生產環境,二是我們想快速搭建開發環境。

理想狀態中,要達到第一個目標,我們需要將每一個服務都跑在獨立的虛擬機器中以便監控生產環境中服務的執行狀態。然而,我們卻不想每次都需要網路連線,每次重新編譯的時候遠端連線上去特別麻煩。這就是Docker做的特別好的地方,開發環境的機器通常記憶體比較小,之前使用虛擬的時候,我們經常需要為開發環境的機器加記憶體,而現在Docker可以輕易的讓幾十個服務在Docker中跑起來


6.解決資源競爭


多個構建任務同時進行,競爭中控機的資源,影響釋出速度。有一次一個應用受到同時進行的某Java類應用釋出的影響,通常兩分鐘的釋出變成了十多分鐘,嚴重影響釋出體驗。如果出現事故需要回滾,就是更嚴重的問題了。


7.
解決環境衝突

不同應用的構建依賴環境在一臺釋出機上,需要考慮環境衝突和隔離的問題。例如,Java 1.6/1.7共存,應用需要透過JAVA_HOME變數指定使用的Java版本,Maven 2/3也存在同樣的問題。npm的global包也需要相容多個應用的構建。


8.解決
安全隱患

應用的構建指令碼執行在公共釋出機上,指令碼的Bug可能會影響到釋出機的正常執行。例如某次一個構建指令碼里面的sudo service nginx reload命令,本應是在應用伺服器上執行的,但開發人員錯誤配置到了在釋出機上執行的構建指令碼里面。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29754888/viewspace-1586057/,如需轉載,請註明出處,否則將追究法律責任。

相關文章