为什么在 Docker-Container 中启动 jar 比在本地机器上启动更快?
Why is it faster to start a jar in a Docker-Container than on local machine?
目前我正在测试微服务和 Docker-容器。在我最后一次尝试使用 Micronaut-Server 期间,我看到了启动本地 (cmd) 和从 Docker 启动的启动时间之间的差异。
但让我感到好奇的是,Container 的速度要快得多。
我正在用 Gradle 创建一个可运行的 jar(更准确地说是一个 shadowjar - 不确定确切的区别是什么)。然后我用那个 jar 文件构建一个 Docker-Image。
两者的启动命令相同(请参阅下面的 Docker 文件):
java -jar micronaut.jar
在我寻找原因的过程中,我发现这个 question 这也是关于 Docker-Container 的性能,但结论更多,Container 应该稍微慢一点,而不是更快。
我的Docker文件:
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:~2500 毫秒
我试了几次,但结果总是差不多。
我正在使用带有 DockerDesktop (Docker 19.03.1)、IntelliJ 和 Gradle (5.5.1) 的 Win10 PC 并使用 IntelliJ-Terminal 和windows-cmd 用于本地启动。
我不是 Docker 方面的专家,也不是发生在硬件附近的事情的专家,所以我找不到这个速度差异的答案。所以我问你:
是什么原因造成的?
AdoptOpenJDK 使用两个不同的 JVM 构建:HotSpot 和 OpenJ9
HotSpot 和 OpenJ9 是完全不同的 JVM 实现,具有不同的 JIT 编译器、GC 算法和内部架构。
如您的 docker 文件所示,您使用的是 adoptopenjdk/openjdk11-openj9:jdk-11.0.1.13-alpine-slim
,顾名思义,它基于 OpenJ9。
在 Windows 上,您可能会使用基于 HotSpot 的 JVM(java -version
可以确定)。
OpenJ9 编译器优化不那么激进,因此启动时间的差异不足为奇。
目前我正在测试微服务和 Docker-容器。在我最后一次尝试使用 Micronaut-Server 期间,我看到了启动本地 (cmd) 和从 Docker 启动的启动时间之间的差异。 但让我感到好奇的是,Container 的速度要快得多。
我正在用 Gradle 创建一个可运行的 jar(更准确地说是一个 shadowjar - 不确定确切的区别是什么)。然后我用那个 jar 文件构建一个 Docker-Image。
两者的启动命令相同(请参阅下面的 Docker 文件):
java -jar micronaut.jar
在我寻找原因的过程中,我发现这个 question 这也是关于 Docker-Container 的性能,但结论更多,Container 应该稍微慢一点,而不是更快。
我的Docker文件:
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:~2500 毫秒
我试了几次,但结果总是差不多。
我正在使用带有 DockerDesktop (Docker 19.03.1)、IntelliJ 和 Gradle (5.5.1) 的 Win10 PC 并使用 IntelliJ-Terminal 和windows-cmd 用于本地启动。
我不是 Docker 方面的专家,也不是发生在硬件附近的事情的专家,所以我找不到这个速度差异的答案。所以我问你:
是什么原因造成的?
AdoptOpenJDK 使用两个不同的 JVM 构建:HotSpot 和 OpenJ9
HotSpot 和 OpenJ9 是完全不同的 JVM 实现,具有不同的 JIT 编译器、GC 算法和内部架构。
如您的 docker 文件所示,您使用的是 adoptopenjdk/openjdk11-openj9:jdk-11.0.1.13-alpine-slim
,顾名思义,它基于 OpenJ9。
在 Windows 上,您可能会使用基于 HotSpot 的 JVM(java -version
可以确定)。
OpenJ9 编译器优化不那么激进,因此启动时间的差异不足为奇。