为什么在 Docker 容器中启动 jar 比在本地机器上更快?



目前我正在使用微服务和Docker-Container进行测试。在我最后一次尝试使用Micronaut-Server时,我看到了启动本地(cmd(和启动Docker之间的启动时间之间的差异。 但让我好奇的是,容器的速度要快得多。

我正在使用 Gradle 创建一个可运行的罐子(更准确地说是一个影子罐 - 不确定确切的区别是什么(。然后我用那个jar文件构建一个Docker-Image。 两者的启动命令是相同的(请参阅下面的 Dockerfile(:java -jar micronaut.jar

在我寻找原因的过程中,我发现了这个问题,这也是关于Docker-Container的性能,但结论更多,容器应该稍微慢一点,而不是更快。

我的 Dockerfile:

FROM adoptopenjdk/openjdk11-openj9:jdk-11.0.1.13-alpine-slim
COPY build/libs/*.jar micronaut.jar
EXPOSE 8080
CMD java -jar micronaut.jar

和 docker 命令:docker run -p 9999:9999 -it --name dokuserver pge/dokuserver:0.1

我预计容器的启动时间会慢一点,但实际上时间是

  • 本地:4000-5000ms
  • 点测器:~2500ms

我尝试了几次,但结果总是几乎相同。

我正在使用带有DockerDesktop(Docker 19.03.1(,IntelliJ和Gradle(5.5.1(的Win10 PC,并使用IntelliJ-Terminal和windows-cmd进行本地启动。

我不是Docker或更接近硬件的事情的专家,所以我找不到这种速度差异的答案。所以我问你:

是什么原因造成的?

AdoptOpenJDK具有两种不同的JVM:HotSpotOpenJ9

HotSpotOpenJ9是完全不同的JVM实现,具有不同的JIT编译器,GC算法和内部架构。

正如您的 docker 文件所建议的那样,您正在使用adoptopenjdk/openjdk11-openj9:jdk-11.0.1.13-alpine-slim这是一个名称建议基于OpenJ9

。在Windows上,你可能会使用基于HotSpot的JVM(java -version确定(。

OpenJ9的编译器优化不那么激进,因此启动时间的差异并不奇怪。

最新更新