在容器中執行Java應用程式的提示和工具 - Even Holthe

banq發表於2019-12-15

如今,所有東西都可以在容器中執行,可以是資料庫、持續整合系統、深奧的愛好專案,甚至是Windows。在本文中,我將介紹各種技巧和工具,這些技巧和工具在打包基於Java的應用程式以在容器中執行時可能會有所幫助。

執行時選項

根據執行的版本(和補丁程式級別),您需要考慮不同的JVM標誌。Java 8u131中引入了對從cgroups讀取記憶體限制的支援,因此這是最低要求。檢視此概述,瞭解可能需要設定的標誌。

分層

一種常見的模式是擁有一個基本映象(執行時環境,它本身可以包含一層或多層),一層用於依賴​​項,另一層用於應用程式。通過拆分和重用層,容器映象在磁碟空間使用和頻寬使用方面將更加有效。

使用穩定的基礎映象base image

這個技巧取決於您對風險和穩定性的胃口,但總的來說,可以肯定地說,使用的基礎映象標籤越具體越好。

假設使用了some-corp/java:latest,那麼您至少在一個月內都不知道要得到什麼。是JDK還是JRE?使用哪個主要版本或補丁程式級別?使用哪個作業系統?有時,這被視為始終處於前沿的功能。如果可能的話,更保守(更安全)的選擇是固定Java版本和OS版本,例如some-corp/java-jre:12.0.2_10-jre-hotspot-bionic。

使用快取

Docker構建快取很有幫助。第一步是已經存在基礎映象,但是為了加快構建速度,後續各層應儘可能冪等。這也將有助於支援構建快取的CI系統。

應用程式類資料共享(AppCDS)

為了減少應用程式的啟動時間,請考慮研究AppCDS。此功能涉及讀取應用程式的類一次,並構建JVM在每次啟動應用程式時將執行的內部資料結構。通過僅執行一次此操作,您將在下次應用程式啟動時節省一些啟動時間。

Jib

Google在2018年7月推出了一種更簡單的方法來為基於Java的應用程式構建容器映象。 Jib project 讓開發人員用最少的努力,最佳實踐和開銷知識來構建映象,Jib不依賴Docker守護程式,因此也有助於提高安全性和減少複雜性。

Jib產生的映象是基於它們distroless基本映象,並自動分成多個層。通過層拆分,相關性包含在單獨的層中,而應用程式本身包含在另一層中。應用此技術可減少容器映象的不同版本之間的差異,並將在檔案大小和網路傳輸速度方面極大地減少映象的“權重”。

Jib作為API公開,但更重要的是作為Maven和Gradle外掛公開。檢視他們的入門示例。如果您沒有特殊需要,建議使用。

Dockerfile Maven外掛

Spotify多年來一直在執行容器化工作負載。他們為Maven進行的第一個工具工作是於2014年6月釋出了第一個版本的docker-maven-plugin。這導致Spotify積累了許多構建容器映象的經驗,現在不贊成使用dockerfile-maven,後者被標記為mature。

但是,此外掛功能非常強大,可以連線到現有的Maven構建生命週期。它使您可以使用常規Dockerfile來構建容器映像,作為現有Maven構建的一部分。如果您依賴Dockerfile或明確要使用Dockerfile,則建議使用。

 

相關文章