在容器中執行Java應用程式的提示和工具 - Even Holthe
如今,所有東西都可以在容器中執行,可以是資料庫、持續整合系統、深奧的愛好專案,甚至是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,則建議使用。
相關文章
- 在Docker容器中執行ASP.NET MVC應用程式DockerASP.NETMVC
- Docker容器中執行.Net Core應用程式Docker
- 在Docker容器中執行GUI圖形應用的開源專案DockerGUI
- 在Docker中,可以在一個容器中同時執行多個應用程序嗎?Docker
- 在IntelliJ IDEA中建立和執行java/scala/spark程式IntelliJIdeaJavaSpark
- 在 OpenFunction 中執行 Serverless 應用FunctionServer
- 2.3 應用程式容器中的應用程式概述
- 在Linux中,如何進行容器技術的應用?Linux
- 如何優雅地恢復執行中的容器應用
- 在Java程式中列印java執行時引數Java
- Docker命令-docker exec-在執行的容器中執行命令Docker
- 在 WASI 上執行 .NET 7 應用程式
- windows10系統限制應用程式在集合中執行的方法Windows
- Reactor執行緒模型及其在Netty中的應用React執行緒模型Netty
- golang執行緒池在IO多路複用中的應用Golang執行緒
- 在Docker中,如何停止所有正在執行的容器?Docker
- JAVA 程式 在 cmd 視窗的執行Java
- Ooui:在瀏覽器中執行.NET應用UI瀏覽器
- HttpRuntime應用程式的執行時HTTP
- MVC模式在Java Web應用程式中的實現MVC模式JavaWeb
- python中多執行緒和多程序的應用Python執行緒
- Anbox:在 Linux 上執行 Android 應用程式的簡單方式LinuxAndroid
- 堆在java中的應用--PriorityQueueJava
- PyQt應用程式中的多執行緒:使用Qt還是Python執行緒?QT執行緒Python
- Docker入門系列之一:在一個Docker容器裡執行指定的web應用DockerWeb
- Java™ 教程(程式和執行緒)Java執行緒
- 在Docker中,很多應用容器都是預設後臺執行的,怎麼檢視它們的輸出和日誌資訊?Docker
- 在容器中執行UI自動化參考UI
- Docker容器中執行.net framework控制檯程式DockerFramework
- 在 Mac 上執行 Windows 應用程式,只需一個CrossOver!MacWindowsROS
- 在Docker中執行SpringBoot程式DockerSpring Boot
- 在 SAP 雲平臺上部署和執行 Docker 應用Docker
- 在 Node.js 上執行 Flutter Web 應用和 APINode.jsFlutterWebAPI
- ConfigMap掛載與Subpath在Nginx容器中的應用Nginx
- Docker容器中應用程式的log輸出管理Docker
- 在 Linux 上安裝安卓 8.1 Oreo 來執行應用程式和遊戲Linux安卓遊戲
- 使用shell指令碼在Linux中管理Java應用程式指令碼LinuxJava
- Hummingbird: 在Web上執行Flutter應用WebFlutter