当前位置: 首页 > 知识库问答 >
问题:

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

蔚弘量
2023-03-14

目前我正在用微服务和Docker-Container进行测试。在我上次尝试使用Micronaut-Server时,我看到了启动本地(cmd)和启动Docker的启动时间之间的差异。但让我觉得奇怪的是,集装箱的速度快得多。

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

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
  • Docker:~2500ms

我不是Docker的专家,也不是发生在硬件附近的事情,所以我找不到这个速度差异的答案。所以我问你:

是什么导致的?

共有1个答案

丁英韶
2023-03-14

AdoptOpenJDK使用两种不同的JVM构建:HotSpot和OpenJ9

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

正如您的docker文件所建议的,您使用的是adoptopenjdk/openjdk11-openj9:jdk-11.0.1.13-alpine-slim,这是一个名字暗示的基于OpenJ9的。

OpenJ9的编译器优化没有那么激进,所以启动时间的差异并不奇怪。

 类似资料:
  • 问题内容: 我将一个应用程序容器化,该应用程序是自动selenium测试的测试驱动程序。Selenium服务器(也称为Selenium Hub)在localhost:4444下的另一个Container和Firefox Node中运行。但是我的应用程序无法达到它: 我通过docker-compose启动了这些容器: 我想我的docker-compose中有一个错误,但我无法弄清楚。请帮忙!顺便说一

  • 问题内容: 说,如果我在Docker容器中使用此命令。 这里的本地主机指的是什么?主机的IP还是Docker容器自己的IP? 问题答案: 从容器内部开始 ,始终引用当前容器。它永远不会引用另一个容器,也永远不会引用物理系统中运行的不在同一容器中的任何其他内容。建立与数据库主机的出站连接或将其配置为数据库主机通常没有用。 从主机系统上的Shell中 ,可以指代在Docker之外的系统上运行的守护程序

  • 我使用以以下命令开头mysql映像 当docker在后台运行时,另一个应用程序连接到端口3306大约需要一分钟的时间。 之后,我用停止这个容器,然后用启动它。在第二种情况下,使用start命令,应用程序可以连接到端口3306,仅在5秒后。 现在我用从停止的容器中获取快照,并用运行它,但是在这种情况下,应用程序可以在一分钟后连接到mysql2! 所以, 是否有任何方法在运行容器后采取快照,可以在10

  • 问题内容: Eclipse IDE是用Java编写的大型桌面应用程序的最佳示例之一。 我见过的大多数Java应用程序通常都依赖于批处理或Shell脚本来使用应用程序的类路径构建字符串,并使用类路径作为env变量启动JVM。 另一方面,Eclipse依赖于本机启动器。这是为什么 ?该启动程序没有脚本执行什么操作? 我记得一年半前读过一篇文章,该文章解释说“我们最好使用本地启动器”,但id并不能解释启

  • 当我在Eclipse中的服务器上运行我的应用程序时,我会得到这样的消息:“Tomcat V8.0服务器在localhost上所需的端口8080已经在使用中。该服务器可能已经在另一个进程中运行,或者某个系统进程正在使用该端口。要启动该服务器,您需要停止其他进程或更改端口号”。其他项目关闭。有人能帮我解决这个问题吗?我是爪哇初学者。

  • 问题内容: 我希望能够在OSX中的Vagrant之外使用docker。现在这是不可能的。是什么原因使其不仅仅限于linux安装? 问题答案: Docker只是系统提供的容器之上的抽象和自动化层。 技术上的限制是OS X不支持操作系统级别的虚拟化,例如Linux中的容器或FreeBSD中的jail(即使OS X是半血的BSD)。 但是,尽管如此,Docker仍旨在提供一种共享容器映像的简便方法,并确