为什么使用docker? 是不是已经在JVM上运行了像WAR文件那样的java文件?

我刚刚开始使用java,刚刚开始掌握Maven和Gradle的构build过程和依赖pipe理系统。

据我所知,Docker是在Docker主机内部署容器的好工具。 我想这与Vagrant(虽然在function上不一样)是一样的,因为它消除了环境问题而不是预期的问题。

这是我的理解是,当使用Maven或Gradle构build东西时,您可以创buildJAR文件或包含其中的二进制文件的WAR文件,以便它可以在JVM所在的位置运行。 用Docker,这似乎是多余的。 我想Docker可以用于其他的东西,比如从C ++运行的程序或者其他东西? Docker对于Java的使用是多余的吗?

Java的“可移植性”主要是市场营销。

  • Java程序可以像其他任何东西一样进行系统调用(如文件系统访问或分支subprocess),所以JVM不会隔离任何东西,除非您对安全pipe理器做了一些奇怪的事情。

  • 没有一个“JVM”,而是每隔几年发布一系列不兼容的JVM版本。 还有一些竞争的实现,偶尔也会影响到你使用的是Oracle的JVM还是OpenJDK。

Docker也不仅仅是隔离和再现性。 例如,JVM与UnionFS没有任何关系。

Docker是关于隔离和重现性的。

最后一点允许指定一个执行环境,以及您需要的确切品牌的JDK / JVM,以供您在开发机器上(使用虚拟机)或在生产环境中运行。

多年以后,即使您不能再下载最初部署该项目时使用的JDK的精确更新版本,仍然可以重现该执行环境。

我不是一个Docker用户(只是熟悉概念),但根据我的理解, 不,Dockers对于Java使用来说并不是多余的,也就是说无论使用 Maven还是Gradle。 Docker通过使用容器在包装(比起maven等)方面更进一步。

Jar / War及其所有的依赖关系本身就是一个可移植的实体,但它并不关心主机环境configuration。 这个问题会清楚一点, 使用Docker开发Java EE应用程序

显然,它对于非字节代码语言更有用,但这并不意味着它对于Java来说是多余的。

希望能帮助到你 !!