在容器中运行Java应用的帮助提示和工具 - Even Holthe

19-12-15 banq

如今,所有东西都可以在容器中运行,可以是数据库、持续集成系统、深奥的爱好项目,甚至是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,则建议使用。

 

         

猜你喜欢