Java 让容器使用现有容器的OpenJDK和库

Java 让容器使用现有容器的OpenJDK和库,java,docker,Java,Docker,我正在用我的论文做一些实验,涉及容器的冷启动问题。我的测试应用程序是一个基于openjdk映像构建的spring引导应用程序。我想尝试解决冷启动问题的第一件事是: 准备好一个容器,容器中有openjdk和springboot应用程序使用的库。我使用已经存在的容器的ipc和networknamespace启动另一个容器,然后能够使用openjdk和该容器的库来运行jar文件 我不完全确定如何实现这一点?我可以通过使用卷来实现这一点,还是应该寻找一种完全不同的方法 另一方面,如果我希望运行x个容器,

我正在用我的论文做一些实验,涉及容器的冷启动问题。我的测试应用程序是一个基于openjdk映像构建的spring引导应用程序。我想尝试解决冷启动问题的第一件事是:

准备好一个容器,容器中有openjdk和springboot应用程序使用的库。我使用已经存在的容器的ipc和networknamespace启动另一个容器,然后能够使用openjdk和该容器的库来运行jar文件

我不完全确定如何实现这一点?我可以通过使用卷来实现这一点,还是应该寻找一种完全不同的方法

另一方面,如果我希望运行x个容器,我将确保有x个预先存在的容器在运行。这是为了确保每个容器都有自己的特定librarycontainer可供使用。这样行吗

简而言之,我可以通过使用通过ipc/net连接的第二个容器来加速spring boot应用程序;会对我的问题有帮助。

Spring boot是一个纯粹的“运行时”框架

如果我没有弄错你的问题,你可以描述以下情况:

假设您有一个包含JDK和一些JAR的容器。但这并不意味着你有一个正在运行的进程。因此,它更像是一个包含可重用文件的卷(或者是一个docker图像层)

此外,您还有另一个容器B,它带有一个spring引导应用程序,应该以某种方式启动(可能是使用容器a中的开放jdk或其专用jdk)

现在你到底想“加速”什么?映像的大小(例如,更小的映像意味着在CI/CD管道中更快地部署)?spring boot应用程序启动时间(从生成JVM到spring boot应用程序启动并运行的时间间隔)?或者你想在运行时加载更少的类

解决出现的问题的技术是不同的。但总的来说,我认为您可能需要查看Graal VM集成,它可以创建本机映像并加快启动时间。这东西相当新,我自己还没试过。我相信它正在进行的工作和spring将努力推动这一进程(这只是我的猜测,所以对此持保留态度)

无论如何,你可能对阅读感兴趣

然而,我怀疑这与你所描述的研究有关

更新1

根据您的评论,让我提供一些可能有帮助的补充信息。此更新包含来自“现实生活”工作经验的信息,我将其发布,因为它可能有助于在你的论文中找到方向

首先,我们有一个spring引导应用程序

默认情况下,它是一个JAR,Pivotal的建议还有一个WARs选项(正如他们的开发人员倡导者Josh Long所说:“让JAR不要WAR”)

这个spring引导应用程序通常包括一些web服务器,默认情况下,Tomcat用于传统SpringWebMVC应用程序,但您可以将其切换到Jetty或undertow。如果您运行的是“反应式应用程序”(SpringWebFlux自SpringBoot2以来就受到支持),那么您的默认选择是Netty

一方面需要注意的是,并非所有spring引导驱动的应用程序都必须包含某种嵌入式web服务器,但我将把这一点放在一边,因为您似乎针对web服务器(您提到了tomcat,这是一种更快地服务请求的能力,因此我的假设)

好的,现在让我们试着分析一下启动spring启动应用程序JAR时会发生什么

首先,JVM本身启动—进程启动、堆分配、内部类加载等等。这可能需要一些时间(大约一秒钟,甚至稍长一点,具体取决于服务器、参数、磁盘速度等)。 解决JVM启动是否真的很慢的问题,我可能无法添加更多

好了,现在是时候加载tomcat内部类了。在现代服务器上,这同样需要几秒钟的时间。Netty似乎更快,但您可以尝试下载tomcat的StanOne发行版并在您的机器上启动它,或者创建一个没有spring boot但带有嵌入式tomcat的示例应用程序,看看我在说什么

到目前为止还不错,但我们的应用程序还没有出现。正如我在开始时所说,spring boot纯粹是运行时框架。因此,必须先加载spring/spring引导本身的类,然后再加载应用程序本身的类。如果应用程序使用一些库,它们也会被加载,有时甚至会在应用程序启动期间执行自定义代码:Hibernate可能会检查架构和/或扫描db架构定义,甚至更新基础架构,Flyway/Liquidbase可以执行架构迁移等等,Swagger可能会扫描控制器并生成文档等等

现在,“真实生活”中的这个过程甚至可能需要一分钟甚至更多的时间,但这不是因为spring启动本身,而是因为应用程序中创建的bean在“构造函数”/“后期构造”中有一些代码,这是在spring启动应用程序上下文初始化期间发生的。另一方面,我不会深入讨论spring boot应用程序启动过程的内部内容,spring boot是一个非常强大的框架,有很多事情在幕后发生,我假设您以某种方式使用过spring boot—如果没有,请随意提出具体问题,我/我的同事会尽力解决

如果您转到,您可以创建一个示例演示应用程序-它将加载得非常快。因此,这完全取决于您的应用程序bean

在这个李
FROM: my/spring-boot
COPY some-specific-lib lib.jar
// HelloWorld.java

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, Native Java World!");
    }
}