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