共計 2842 個字符,預計需要花費 8 分鐘才能閱讀完成。
Java 開發人員需要注意的五大 Docker 誤區分別是什么,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
我們如何才能更好更理性的使用 Docker?
Docker 最近備受關注,原因顯而易見。如何成功交付代碼一直困擾著大家。傳統的容器技術在眾多需求和模板中亂成一團。而 Docker 可以簡單且重復的創建容器。相比其它容器,使用 Docker 可以更快、更自然的交付代碼。Duang,Docker 火了!隨之而來也有一些誤解和誤區。不要太相信別人說 Docker 好用或者不好用。自己理性地全面思考一下 Docker,會幫助你真正理解是否真的需要它。
丸趣 TV 小編列舉了從 Java 角度的五大 Docker 誤讀。不過首先介紹些背景知識。
主要誤區 1. Docker 是輕量級虛擬機
這是大家初學 Docker 時最主要的誤解。這種誤解倒也情有可原,Docker 的確看上去有點像虛擬機。Docker 網站
上甚至有人比較了 Docker 和虛擬機的區別。但是,Docker 實際上不是輕量級虛擬機,而是改進了的 Linux 容器(LXC
)。Docker 和虛擬機是完全不一樣的,如果你把 Docker 容器當成輕量級虛擬機來用,會遇到很多問題。
在使用 Docker 之前,必須了解 Docker 容器和虛擬機有很多本質的區別。
資源隔離:Docker 達不到虛擬機所能提供的資源隔離水平。虛擬機的資源是高度隔離的,而 Docker 從設計之初就需要共享一些資源,這些資源是 Docker 無法隔離和保護的,比如頁緩存和 entropy 池
。(注:entropy 池很有趣,entropy 池收集并且存儲系統操作生成的隨機比特。機器在需要隨機化時(比如密碼相關)使用這個池。)如果 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 不直接支持對多機器的網絡和資源的監控,這使得幾乎無法用在生產環境里。當然也有很多有潛力的地方,比如可以將同一個 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 角度看
Docker 在 Java 開發人員中已經有些應用。Docker 的某些特性讓我們更容易構建可擴展的上下文。不像 uber-jar
,Docker 可以幫助你將所有的依賴(包括 JVM!)打包到一個隨時可發布的鏡像里。這是 Docker 吸引廣大開發人員的重要特性。但是,這也會帶來一些隱患。一般來說,程序員需要用不同的方式和代碼交互 – 監控它,調試它,鏈接它,調優它。。。如果使用 Docker,這些都會需要額外的工作。
比如,我們想使用 jconsole
,它依賴于 JMX 功能,JMX 因為要使用 RMI 又需要網絡。使用 Docker 的話就不是很直接,需要 一些技巧
去開啟所需端口。我們最初發現這個問題是當我們想要構建 Takipi
的 Docker 安裝器,我們不得不在容器里 JVM 之外運行了一個后臺程序。詳細的解決方案在 GitHub
上。
另外一個很嚴重的問題是 Docker 容器的性能調優相當困難。當使用容器時,你不知道每個容器到底會分配多少內存。如果你有 20 個容器,內存會以你不確定的方式分配給它們。如果你打算用參數 -Xmx 調優堆的大小,就很困難,因為對 Docker 容器內 JVM 的處理取決于能夠自動得到該容器分配到的內存大小。如果都不知道分配了多少內存,性能調優幾乎不可能。
Docker 是很有意思的技術,有一些真實有效的使用場景。作為一個新興技術,還需要大量時間來解決缺失的功能和已知的 bug。但是,現在這個領域的確有很多的炒作。不過記住哦,炒作可不是成功~
關于 Java 開發人員需要注意的五大 Docker 誤區分別是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注丸趣 TV 行業資訊頻道了解更多相關知識。