Docker / CoreOS上的Java JVM

我正在学习CoreOS / Docker,并试图围绕几件事情思考。

使用Java基础架构,是否可以在自己的容器中使用JVM,并让其他Java应用程序/服务使用此JVM容器? 如果没有,我假设JVM将不得不捆绑在每个容器中,所以基本上你必须把Java dockerfile和合并我的Java服务; 实质上创build了一个在CoreOS机器上运行的Linux机器+ Java +服务容器。

我唯一的想法是可以在CoreOS本身上运行JVM,但似乎这是不可能的。

实际上可能只是在/opt解压Orcale Java,但这只是一种最后的手段。 JRE和JDK的Oracle二进制文件不需要任何系统库,所以在任何地方都很容易。

我写了一些非常小的JRE和JDK映像,我可以运行Elasticsearch和其他主要的开源应用程序。 我也写了一些容器,允许我在CoreOS上编译jar( errordeveloper / mvnerrordeveloper / sbterrordeveloper / lein )。

正如@ISanych所指出的那样,运行多个Java容器不会影响磁盘的使用,这相当于在主机上运行多个JVM。 如果你发现运行多个JVM不是你的茶叶,那么答案就是JVM不必像在容器之前那样复杂。 然而,容器中的Java仍然是相当不错的,因为你可以有一个类path将永远修复,你不会陷入依赖地狱。 也许不是build造uberjars(这是我主要做的,尽pipe它们被认为不完全完美 ,但是我很懒),可以把jar包放在tarball中,然后在其中使用ADD jars.tar /app/lib/ Dockerfile

在JVM上运行的应用程序必须在容器中安装JVM。 所以如果你想把应用程序组件分成不同的容器,每个容器都需要有JVM。 注意,容器可以通过称为容器链接的过程相互交谈

最佳做法是使用jvm创build图像,然后使用基于jvm图像的其他图像(从Dockerfile中的jvm)创build图像。 即使你将创build许多不同的图像,他们不会浪费太多的空间,docker使用分层的文件系统,所有的容器将使用同一个单一的jvm图像副本。 是的,每个jvm都将是独立的进程,吃掉自己的内存 – 但是隔离的环境是docker的用处。