五個(gè)基于Java的Docker鏡像
【原文編者的話】Java 語言長期占據(jù)編程語言前三甲的位置,其受歡迎程度與重要性不言而喻。在容器化技術(shù)大潮中,Java 可揚(yáng)容器化之長,避自身“臃腫”之短,取得更高成就。本文選擇了5個(gè)有代表性的 Java 鏡像進(jìn)行了介紹,并指出了其現(xiàn)存的一些問題和解決方案,供相關(guān)人員參考。
盡管 Java 看起來不是很“時(shí)髦”,但仍是一門在移動(dòng)市場、開源界及企業(yè)中占據(jù)主導(dǎo)地位的非常受歡迎的重要的語言。舉個(gè)例子,你可知道在 Apache 軟件基金會(huì)中63%的項(xiàng)目是用 Java 寫的么?
幸運(yùn)的是,在容器技術(shù)發(fā)展進(jìn)程中,Java 開發(fā)人員并未被冷落。本文將著重介紹五個(gè)(譯注:原文誤寫為“四個(gè)”)流行的基于 Java 的 Docker 鏡像與配置,以及他們?nèi)绾文軒椭愕膱F(tuán)隊(duì)更有效地工作。
STASH
Stash 是個(gè) Git 代碼管理和協(xié)作工具。Stash 允許將部署節(jié)點(diǎn)集群化,從而減少活動(dòng)主機(jī)的停機(jī)時(shí)間,且不會(huì)對每個(gè)添加的節(jié)點(diǎn)造成性能影響。Stash 還集成了 JIRA(同一公司出品)的可追溯能力,并為團(tuán)隊(duì)提供協(xié)作工具,具有類似這樣的功能:當(dāng)一個(gè) pull 請求處于打開狀態(tài)時(shí),代碼被修改將觸發(fā)警報(bào)。
細(xì)節(jié)
如果你想將 Git 遠(yuǎn)程主機(jī)從一個(gè) Stash 實(shí)例遷移到另一個(gè) Stash 實(shí)例,請注意雖然可以把倉庫復(fù)制過去, pull 請求卻是無法被復(fù)制過去的。你也不能在實(shí)例間遷移。不過,Stash 的開發(fā)團(tuán)隊(duì)會(huì)在將來添加這些功能。
在生成 JIRA 數(shù)據(jù)庫結(jié)構(gòu)時(shí),請注意 JIRA 6.1 EAP 3包含了重大修改,可能會(huì)造成插件停止工作。
Stash 可以限制對重要代碼分支的寫權(quán)限,防止新成員誤操作。Stash 允許開發(fā)人員將代碼提交到自己的服務(wù)器端倉庫上,然后由項(xiàng)目管理者審核并合并到主項(xiàng)目倉庫中。
在 Stash 中開始一個(gè)新項(xiàng)目時(shí),項(xiàng)目管理者應(yīng)從一個(gè)全新的倉庫入手:
- ssh user@host
- git init --bare /path/to/repo.git
所有其他成員需要通過 SSH 進(jìn)入這個(gè)倉庫,并將其復(fù)制到服務(wù)器的另一個(gè)地方。Stash 稱之為“分流流程”(Forking Workflow),這對于來自 SVN 背景的人有點(diǎn)不同尋常。
TOMCAT
Tomcat 是個(gè)實(shí)現(xiàn)了 Oracle 的 Java Servlet 及 JSP 規(guī)范的開源 Web 服務(wù)器及 Servlet 容器。它提供了一個(gè)標(biāo)準(zhǔn)的 HTTP 環(huán)境用于運(yùn)行代碼。在最簡配置時(shí),Tomcat 運(yùn)行于單一的系統(tǒng)進(jìn)程中。在舊機(jī)器上工作的開發(fā)人員通過容器安裝 Tomcat 將不需要完整的虛擬機(jī)環(huán)境,從而騰出資源。
細(xì)節(jié)
對運(yùn)行 Linux 虛擬機(jī)的用戶而言,在 Docker 容器中運(yùn)行 Tomcat 的性能可能會(huì)非常差,容器的啟動(dòng)速度很慢或非常卡。
如果宿主系統(tǒng)是 Linux,可以使用熵收集守護(hù)進(jìn)程(Entropy Gathering Daemon,簡稱EDG)來解決這個(gè)問題。如果是使用 Boot2Docker,由于 Boot2Docker 的 Tiny Core Linux 擴(kuò)展中沒有 EGD,這個(gè)問題將尤為突出。將宿主的 /dev/urandom 裝載成容器的 /dev/random 可作為臨時(shí)解決方法。
如果在 Docker 中運(yùn)行 Tomcat 時(shí),虛擬機(jī)也在經(jīng)歷低熵,VirtualBox 提供了一些方案來提高虛擬機(jī)的熵。
APACHE HADOOP
Apache Hadoop 是個(gè)用于將大數(shù)據(jù)集分布到大量計(jì)算機(jī)中的開源框架。Hadoop 被設(shè)計(jì)成可以從一臺(tái)主機(jī)擴(kuò)展到數(shù)萬臺(tái)。Hadoop 不依賴硬件來達(dá)成容錯(cuò),可在應(yīng)用層面處理失敗。Hadoop 框架由四個(gè)模塊組成:Hadoop Common、Hadoop 分布式文件系統(tǒng)(HDFS)、Hadoop YARN 及 Hadoop MapReduce。此外,還有一些 Hadoop 相關(guān)的項(xiàng)目,包括 ZooKeeper 和 Spark。
細(xì)節(jié)
如果你試圖創(chuàng)建多節(jié)點(diǎn)集群用于在 Docker 中運(yùn)行 Hadoop,你可能會(huì)碰到一些麻煩。容器間網(wǎng)絡(luò)可通過 Weave 或 SequenceIQ 的新項(xiàng)目 Cloudbreak 來構(gòu)建。Cloudbreak 可以很容易地在不同的云供應(yīng)商(比如 AWS)上創(chuàng)建 Hadoop 集群。
用戶還遇到過在 Hadoop 中運(yùn)行 pyspark(Python 中使用的一個(gè)Spark編程模型)的困難。嘗試以非 root 用戶保存數(shù)據(jù)幀(dataframe)會(huì)失敗。重置 $SPARK_USER 為 root 也無事于補(bǔ),因?yàn)?spark 子節(jié)點(diǎn)都是作為 root 運(yùn)行的。如果你的項(xiàng)目不需要權(quán)限系統(tǒng),可使用用戶郵件列表的這個(gè)方式來解決。
MAVEN
Apache Maven 是個(gè)圍繞“項(xiàng)目對象模型”(Project Object Model,簡稱 POM)概念的軟件項(xiàng)目管理工具。Maven 據(jù)此從一個(gè)中央信息源來管理項(xiàng)目的構(gòu)建、文檔或報(bào)告。Maven 還提供了開發(fā)期工具,提供項(xiàng)目的郵件列表、代碼控制器的變更日志、依賴列表或單元測試報(bào)告。
細(xì)節(jié)
在運(yùn)行 Maven 的 Docker 插件時(shí),有個(gè)錯(cuò)誤:如果用戶沒有指定命令,一個(gè)空的 CMD 會(huì)被輸出。對于那些想讓容器繼承父容器的信息的用戶而言,會(huì)很受挫。使用官方 Docker 鏡像可緩解這些問題。
如果你的服務(wù)器運(yùn)行著 Jenkins,用于創(chuàng)建發(fā)布版或快照的設(shè)置選項(xiàng)在處理 mvn 命令的 Docker 參數(shù)時(shí)很快會(huì)變成一個(gè)麻煩。Jenkins 的 Maven 發(fā)布插件會(huì)自動(dòng)配置 pom.xml 并部署快照。
GLASSFISH
Glassfish 是個(gè)開源應(yīng)用服務(wù)器,支持 EJB、JPA、JSF、JMI、JSP 等等。Glassfish 讓開發(fā)人員能夠創(chuàng)建可擴(kuò)展、可移植并可與傳統(tǒng)技術(shù)整合的應(yīng)用。用戶可以安裝附加組件以訪問其他服務(wù)。
Glassfish 在 Docker Hub 中為想嘗試新功能的開發(fā)人員提供了兩個(gè)額外鏡像:Nightly 和 Ozark。Ozark 包含了運(yùn)行 Glassfight 4.1 的 MVC 1.0,用于支持 Java EE 8。
細(xì)節(jié)
GlassFish 目前存在一個(gè)涉及域受損的問題。如果用戶刪除 glassfish/domain/domains 目錄就會(huì)出錯(cuò)。試圖這么做后,文件會(huì)像被鎖定了一樣無法被刪除,即便是在容器中重新安裝一份全新的 GlassFish 4.1 也無濟(jì)于事。已經(jīng)有些解決這一問題的方案被公布出來。最常見的是 Github上這一問題的解決方法:將無法被刪除的結(jié)構(gòu)上移一層,然后刪除它。
結(jié)語
本文中,我們介紹了這五個(gè)鏡像:
- Stash 為開發(fā)團(tuán)隊(duì)提供了代碼管理、對等審核以及流線型工作流來管理 Git 倉庫。
- Tomcat 提供了一個(gè)輕量的 HTTP 環(huán)境來編譯代碼,節(jié)約了運(yùn)行多個(gè)虛擬機(jī)實(shí)例所需的系統(tǒng)資源。
- Hadoop 是一個(gè)很容易在應(yīng)用的所有實(shí)例中分布處理大量數(shù)據(jù)的框架。
- Maven 通過自動(dòng)化處理應(yīng)用的所有實(shí)例來管理項(xiàng)目構(gòu)建過程。
- Glassfish 允許開發(fā)人員使用 Java EE,并與傳統(tǒng)應(yīng)用整合。
這些是 Docker Hub 上 Java 應(yīng)用和 DevOps 工具的很好示例,你可將其與 Docker 聯(lián)合來提升工作流程、項(xiàng)目管道以及項(xiàng)目的可擴(kuò)展性。


























