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