Java程式設計師需要注意的五大Docker誤區
Docker現在很火,容器技術看上不無所不能,但這實際上是一種誤解,不要被炒作出來的泡沫迷住雙眼,本文拋去炒作,理性地從Java程式設計師的角度,列舉出Docker目前的五大誤區,幫助你更好地理解Docker的優勢和問題。
拋去那些媒體和廠商們的炒作,我們如何才能更好更理性的使用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的處理取決於能夠自動得到該容器分配到的記憶體大小。如果都不知道分配了多少記憶體,效能調優幾乎不可能。
結論
Docker是很有意思的技術,有一些真實有效的使用場景。作為一個新興技術,還需要大量時間來解決缺失的功能和已知的bug。但是,現在這個領域的確有很多的炒作。不過記住哦,炒作可不是成功~
相關文章
- Java程式設計師都需要懂的「反射」Java程式設計師反射
- Java程式設計師需要學習的技能Java程式設計師
- 好程式設計師Java教程分享Java的五大特點程式設計師Java
- 好程式設計師Java培訓分享學Java程式設計要注意什麼程式設計師Java
- 好程式設計師Java培訓分享面試Java的注意事項程式設計師Java面試
- Java程式設計師需要學習哪些知識?Java程式設計師
- 2020年Java程式設計師需要哪些技術Java程式設計師
- 世界五大計算機程式設計師計算機程式設計師
- 學習web前端誤區有哪些-好程式設計師Web前端程式設計師
- 好程式設計師Java培訓分享Java EE與Java的區別程式設計師Java
- 程式設計師怎麼面試求職?需要注意哪些因素?程式設計師面試求職
- 程式設計師面試除了技術外,還需要注意這些程式設計師面試
- 作為程式設計師,職業規劃需要注意的四個階段程式設計師
- 好程式設計師Java培訓分享面試Java要注意什麼程式設計師Java面試
- 好程式設計師Java培訓分享Java和HTML的區別?程式設計師JavaHTML
- 轉:成為Java高階程式設計師需要掌握哪些?Java程式設計師
- Java程式設計師技術培訓需要培訓哪些?Java程式設計師
- 好程式設計師Java分享為什麼要使用Docker程式設計師JavaDocker
- 你需要程式設計師鼓勵師嗎?程式設計師
- python 程式設計師必備的五大常用庫Python程式設計師
- 程式設計師最喜歡的五大神器程式設計師
- 程式設計師應該造的五大輪子程式設計師
- 騰訊架構師分享的Java程式設計師需要突破的技術要點架構Java程式設計師
- 好程式設計師:Java程式設計師面試秘籍程式設計師Java面試
- .Net WEB 程式設計師需要掌握的技能Web程式設計師
- 前端程式設計師需要了解的MySQL前端程式設計師MySql
- 程式設計師程式設計入門一定知道!程式設計師需要學什麼?程式設計師
- 好程式設計師Java培訓分享Java程式設計師常用的工具類庫程式設計師Java
- Java程式設計師想要跳槽,一定要注意這些技巧!Java程式設計師
- Java程式設計師面試時應注意的三個經典問題!Java程式設計師面試
- 好程式設計師Java培訓分享學習Java需要哪些基礎程式設計師Java
- 好程式設計師Java培訓分享學Java需要什麼基礎?程式設計師Java
- Java開發需要掌握哪些技術?Java程式設計師必備技能Java程式設計師
- 阿里架構師Peter老師講述Java程式設計師→架構師所需要掌握的技能阿里架構Java程式設計師
- java程式設計師被誤導的一個概念,Set也可以有序Java程式設計師
- (網頁)Java程式設計師們最常犯的10個錯誤(轉)網頁Java程式設計師
- 好程式設計師Java培訓分享Java程式設計師技能提升指南程式設計師Java
- 好程式設計師Java培訓Java程式設計師必學技術程式設計師Java