Docker容器与Java虚拟机(JVM)的区别

10

如果有人愿意,是否可以说现在在Docker容器中所做的大部分工作也可以在Java与JVM中完成?

除了能够用自己选择的编程语言编写应用程序并具有更高的定制灵活性外,Docker基本上是在执行与Java虚拟机一直在执行的操作相同,即提供与底层操作系统分离的可执行环境。


1
简短的回答是否定的。长的回答太长了,不适合在SE上阐述。 - mustaccio
3个回答

6
通常情况下,Docker容器不能在Java内部完成,因为Docker用于封装应用程序,而“在Java内部”是指JVM启动后加载的代码。
当JVM解析将搜索main方法的类时,它已经在运行。因此,无法在进程级别进行封装,因为该进程(JVM)已经在运行。
Java具有封装技术,可在各种Java元素之间提供保护(例如,在Tomcat中查看类加载器层次结构);但这些仅将“应用程序插件”相互隔离,运行它们所有的主进程是Tomcat,它实际上是一个加载到已经运行的JVM中的程序。
这并不意味着您不能将两者组合以实现某些对象,只是意味着在两个产品之间提供的隔离类型不可互换。

1
我理解你在说封装方面的观点,但最终不就是两种不同的方式实现同样的目标吗?也就是在虚拟机上运行应用程序? - Shady Programmer
这不是同一件事的两种方式,而是做两件不同的事情的两种方式,混淆到认为它们是相同的程度。将Java程序视为JVM使用的“共享库”。将Docker视为可执行文件周围更便携的包装器。由于JVM是可执行文件,因此在共享库周围放置docker没有意义,您应该将其放置在Java可执行文件(JVM)和共享库(您的主启动JAR文件)周围。 - Edwin Buck

4
简短回答:不行。你可以在JVM中包装一个docker容器,但是你不能将一个JVM包装在docker容器中,除非进行非常复杂的操作。
Docker容器提供了与其他容器隔离的环境,而不需要引入虚拟化层。因此,它们与虚拟机不同且性能更高。

0
Docker可以执行Java JVM无法执行的几件事情,但是在Java编程并在JVM上运行将提供在Docker容器中运行的一些优势。我正在开发一个大型的Java项目,这个项目已经有20年的历史了。这些年来,我们一直在不使用任何工具或兼容性问题的情况下改进和修复我们的应用程序。此外,作为一个额外的奖励,该应用程序是平台无关的。它的几个组件可以在Windows和Linux上运行。由于最初没有努力构建多平台应用程序,因此有一个组件无法在Linux上运行。但是,在该平台上使其工作相对容易。如果使用C或C++及其相关工具链进行相同的操作,则会更加困难。

Docker 能做什么,JVM 不能做到的呢? - DylanYoung
Docker将比JVM更多地隔离您的应用程序,并允许对非Java编写的应用程序进行此操作。这是向上爬梯子的另一步。 - jslarochelle
这个问题旨在改进你的答案。其中一个要点是:除了Java之外,它还可以与其他语言一起使用(实际上JVM也可以:它是一个常见的编译目标)。它提供了哪些JVM没有的隔离? - DylanYoung
1
是的。很好的发现。我应该说docker将为使用目标不是JVM的其他编程语言编写的应用程序提供隔离。例如,您可以使用C/C++、Nim、Rust等编写本地应用程序... - jslarochelle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接