天天看點

Java程式員需要注意的五大Docker誤區

docker是很有意思的技術,有一些真實有效的使用場景。作為一個新興技術,還需要大量時間來解決缺失的功能和已知的bug。但是,現在這個領域的确有很多的炒作。不過記住哦,炒作可不是成功~

網+線下沙龍 | 移動app模式創新:給你一個做app的理由>>

docker現在很火,容器技術看上不無所不能,但這實際上是一種誤解,不要被炒作出來的泡沫迷住雙眼,本文抛去炒作,理性地從java程式員的角度,列舉出docker目前的五大誤區,幫助你更好地了解docker的優勢和問題。

抛去那些媒體和廠商們的炒作,我們如何才能更好更理性的使用docker?

Java程式員需要注意的五大Docker誤區

docker最近備受關注,原因顯而易見。如何成功傳遞代碼一直困擾着大家。傳統的容器技術在衆多需求和模闆中亂成一團。而docker可以簡單且 重複的建立容器。相比其它容器,使用docker可以更快、更自然的傳遞代碼。duang,docker火了!随之而來也有一些誤解和誤區。不要太相信别 人說docker好用或者不好用。自己理性地全面思考一下docker,會幫助你真正了解是否真的需要它。

本文列舉了從java角度的五大docker誤讀。不過首先介紹些背景知識。為了更好地了解docker,我們咨詢了fewbytes的avishai ish-shalom,他有豐富的docker經驗,也是devops days會議的組織者。我們和他一起列舉出了這些誤解。

主要誤區

1. docker是輕量級虛拟機

這是大家初學docker時最主要的誤解。這種誤解倒也情有可原,docker的确看上去有點像虛拟機。docker網站上甚至有人比較了docker和虛拟機的差別。但是,docker實際上不是輕量級虛拟機,而是改進了的linux容器(lxc)。docker和虛拟機是完全不一樣的,如果你把docker容器當成輕量級虛拟機來用,會遇到很多問題。

在使用docker之前,必須了解docker容器和虛拟機有很多本質的差別。

資源隔離:docker達不到虛拟機所能提供的資源隔離水準。虛拟機的資源是高度隔離的,而docker從設計之初就需要共享一些資源,這些資源是docker無法隔離和保護的,比如頁緩存和核心熵池。(注:核心熵池很有趣,它收集并且存儲系統操作生成的随機比特。機器在需要随機化時會使用這個池,比如密碼相關。)如果docker容器占用了這些共享資源,那麼其它程序在這些資源被釋放前隻能等待。

開銷:大多數人都知道虛拟機的cpu和ram能提供類似實體機的性能,但是有很多額外的io開銷。因為放棄了虛拟機的guest os,docker的package更小,比起虛拟機需要更少的存儲開銷。但這并不意味着docker沒有任何開銷問題。docker容器依然需要注意 io開銷的問題,隻不過沒有虛拟機嚴重而已。

核心使用:docker容器和虛拟機在核心使用上完全不同。每個虛拟機使用一個核心。docker容器則是在所有容器間共享核心。共享核心帶來一些 效率的提升,但是以高可用和備援為代價。如果虛拟機發生了核心崩潰,隻有這個核心上的虛拟機會受影響。而docker容器如果核心崩潰了,所有的容器都會 受影響。

2. docker使得應用可擴充

因為docker可以在很短的時間内在多個伺服器上部署代碼,自然有人會覺得docker可以讓應用自身變得可擴充。不幸的是,這是錯誤的。代碼是 應用的基石,而docker并不會重寫代碼。應用的可擴充性依然取決于程式員。使用docker并不會自動得讓你的代碼易于擴充,隻是讓這些代碼更容易跨 伺服器部署而已。

3. docker在生産環境廣為使用

因為docker勢頭正勁,很多人便認為docker可以在生産環境上大規模使用。事實上,這是不對的。注意docker還是很新的技術,還不成 熟,正在成長,這意味着還有很多煩人的bug和待完善的功能。對新技術感興趣這沒錯,但是最好要弄清楚新技術的正确使用場景和需要注意的地方。現 在,docker很容易應用到開發環境。使用docker可以很容易地搭建出很多不同的環境(至少,給人的感覺是能夠搭建出不同的環境),這對于開發很有 用。

而在生産環境中,docker的不成熟和不完善也限制了使用場景。比如,docker不直接支援對多機器的網絡和資源的監控,這使得它幾乎無法在生 産環境中使用。當然也有很多有潛力的地方,比如可以将同一個package從開發環境直接部署到生産環境。還有一些docker運作時特性對于生産環境也 很有用。但是總的來說,在生産環境裡,目前不足多于優勢。這并不是說無法成功運用到生産環境,隻是現在還不能指望它一下子成熟和完美。

4. docker是跨os的

另一個誤解是docker在任意作業系統和環境上都可以工作。這可能來自于裝卸貨物的集裝箱的類比,但是軟體和作業系統的關系可不像船位那麼簡單直接。

實際上,docker隻是linux上的技術。并且docker依賴特定的核心特性,必須要有最新版本的核心才行。基于不同os的差異性,跨os 時,如果使用的不是最底層通用的特性,會遇到很多麻煩的問題。這些問題可能隻有1%的發生率,但是當你在多台伺服器上部署時,1%也是緻命的。

雖然docker隻在linux上運作,但是也可以在os x或者windows上使用docker。使用boot2docker會在os x或windows機器上運作一個linux虛拟機,這樣docker可以在這個虛拟機裡運作。

5. docker增強應用的安全性

覺得docker可以改進代碼和傳遞代碼過程的安全性,這也是誤解。這也是真實的集裝箱和軟體上容器的差别。docker是一種容器化技術,添加了 編排方法。但是linux的容器有一些安全漏洞可能會被攻擊。docker并沒有為這些漏洞添加任何安全層或者更新檔。它還不是能保護應用的鐵布衫。

從java角度看

一些java開發人員已經開始使用docker。docker的某些特性讓我們更容易建構可擴充的上下文環境。不像uber-jar,docker 可以幫助你将所有的依賴(包括jvm)打包到一個随時可釋出的鏡像中。這也是docker對于開發人員來說最迷人的地方。但是,這也會帶來一些隐患。一般 來說,程式員需要用不同的方式和代碼互動 – 監控它,調試它,連接配接它,調優它….如果使用docker,這些都會需要額外的工作。

比如,我們想使用jconsole,它依賴于jmx功能,jmx因為要使用rmi又需要網絡。使用docker的話就不是很直接,需要一些技巧去開 啟所需端口。我們最初發現這個問題是當我們想要建構takipi的docker應用,我們不得不在容器裡jvm之外運作了一個背景程式。詳細的解決方案在 github上。

另外一個很嚴重的問題是docker容器的性能調優相當困難。當使用容器時,你不知道每個容器到底會配置設定多少記憶體。如果你有20個容器,記憶體會以你 不确定的方式配置設定給它們。如果你打算用參數-xmx調優堆的大小,就很困難,因為對docker容器内jvm的處理取決于能夠自動得到該容器配置設定到的記憶體 大小。如果都不知道配置設定了多少記憶體,性能調優幾乎不可能。

結論

本文轉自d1net(轉載)