標籤:

將JVM運行於DOCKER上,有什麼意義嗎?或者,什麼場景下,需要把JVM運行於DOCKER上?


首先,從提問者的問題中,我有必要解答第一個困惑點。那就是Docker到底是什麼樣的虛擬技術。

開門見山,Docker完全不同於Virtualbox等虛擬技術。Docker是基於LinuX Containers(LXC)技術(後來轉為libcontainer,名字叫法不同,本質一樣),這個技術用於將系統的內存、網路、進程、文件系統等資源作隔離,從而實現在同一個Linux Kernel上共享同一片資源,卻能夠讓各進程組之間互不干擾。一個個的進程組就能形成一個個小小的生態,而這個生態就能獨立成為一個虛擬的操作系統,這樣一個虛擬的操作系統就能當成是一個獨立的沙盒使用,而不干擾其他的進程組(虛擬的操作系統,沙盒)。進程組裡的進程是Kernel負責分配和調度的,但是因為LXC的緣故,能夠自成一個虛擬操作系統運行。這就是Docker。

綜上所述,Docker其實跟JVM、VirtualBox這些虛擬技術完全不同,它的執行效率是操作系統本身的執行效率乘以一個小常數。而不是像後者這些,因為指令需要被轉譯,實際執行效率大打折扣。

結論:將JVM運行於Docker上的運行效率等價於將JVM運行與Linux主機上,而不是我們普通理解的兩個虛擬環境的疊加。

那再解答問題中包含的第二塊,什麼場景,什麼意義

複雜的就不說了,來關注這個問題的肯定還沒用到Docker複雜一些的功能。

先舉一個簡單栗子:

Java的執行環境有1.6, 1.7, 1.8,不同的開源框架不同的版本需要的JVM環境也不竟相同。如果需要從1.8需要迅速切到1.6上運行老的環境,我們正常操作當然是有辦法的。但是,這些辦法很dirty,你需要做很多事然後做很多操作才能完成,如果這個切換過程經常發生,必定不厭其煩。

而一個Docker老司機會只需要一行類似於

docker run -it --rm dockerfile/java:oracle-java6 java -version

的命令就能運行一個java6的container,而這個要想把你自己的代碼放到container中,只需要再加上文件目錄掛載的參數。如果熟練的話,整個過程只有一兩分鐘,一鍵搞定!

我還能想到的場景有很多,這裡再舉一個,

你有一個很酷的Java Web項目,想做成開源,但是為了增加演示效果,你想告訴別人怎麼自己運行Demo。那碼農中,大致兩類,玩過Java輪子的和沒有玩過Java輪子的,玩過的人尚且不知道能不能按照你的指令很快部署,但是沒玩過的呢?你如何向他們證明你的輪子夠牛逼?很多人連Java都沒裝,你這不就直接把人家嚇跑了嗎?

而一個Docker老司機會把這個項目封裝成一個Docker Image上傳到http://hub.docker.io或者國內的阿里雲、http://daocloud.io,然後在README上添加一行類似於

docker run -it --rm YOURUSERNAME/YOURJAVAWHEEL -p 80:8080

的命令。這就是你需要看到這個輪子的所有操作!隨著Docker玩家的集聚增多,這種Demo方法必然會演變成一種標準。

最後,送一波福利給大家,大家都玩過2048這個遊戲對吧,想在本地跑一個么? 首先,你要確保docker裝好,國內的小夥伴可以到http://daocloud.io上找到快速的安裝方案: DaoCloud | Docker 極速下載。

然後在命令行上貼上:

docker run -d -p 8080:80 alexwhen/docker-2048

Thats all about it.

打開瀏覽器,現在立馬可以玩耍。

鄭重申明

文章中有提到很多次http://daocloud.io,我不是http://daocloud.io的托,也不是他們的工作人員,但他們確實為中國的docker界做了很多事,做了很多很有用的東西。我算是半個Docker玩家半個Docker圍觀群眾。我自己本人的產品是 星際加速器 RALLETS,我是這個產品這家公司的聯合創始人。


當你的項目不僅僅需要一個jvm時


node 運行在 docker 有什麼意義嗎?

python 運行在 docker 有什麼意義嗎?

mongodb 運行在 docker 有什麼意義嗎?

照你這麼問的話,貌似一切都沒意義了。

容器所有的優點就是其基本意義,能問出這種問題證明連 docker 是什麼都未搞清楚。

至於使用場景:

集群環境的彈性擴展和高可用,服務化應用,隔離多版本,單機集群,新環境自動化構建,遷移方便,等。

一個足夠小的理由都可以讓你容器化 Java 應用,因為它的弊端幾乎沒有,優點卻很明顯。


推薦閱讀:

現在國內、國際市場上有哪些docker的容器管理平台?
Docker 可以用於生產環境了嗎?
圖形化界面的 docker ?
探討一下,docker/compose 中關於 link 的設計怎麼樣?
這張圖裡的幾個動物分別是指的哪些軟體項目?

TAG:Docker |