【问题标题】:Java JVM on Docker/CoreOSDocker/CoreOS 上的 Java JVM
【发布时间】:2015-02-01 12:13:46
【问题描述】:

我正在学习 CoreOS/Docker,并且正在努力思考一些事情。

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

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

【问题讨论】:

    标签: java jvm docker coreos


    【解决方案1】:

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

    我编写了一些非常小的JREJDK 图像,我可以使用它们运行Elasticsearch 和其他主要的开源应用程序。我还编写了一些容器,让我可以在 CoreOS 上编译 jars(errordeveloper/mvnerrordeveloper/sbterrordeveloper/lein)。

    正如@ISanych 所指出的,运行多个 Java 容器不会影响磁盘使用,它几乎等同于在主机上运行多个 JVM。如果您发现运行多个 JVM 并不完全是您的一杯茶,那么答案就是如果在它之前存在容器,JVM 就不必那么复杂。但是,容器中的 Java 仍然相当不错,因为您可以拥有一个永远固定的类路径,并且您不会陷入依赖地狱。也许不是构建 uberjars(这是我主要做的,尽管它们被称为 not exactly perfect,但我很懒),而是可以将 jars 捆绑在 tarball 中,然后在他们的 Dockerfile 中使用 ADD jars.tar /app/lib/ em>。

    【讨论】:

    【解决方案2】:

    在 JVM 上运行的应用程序必须在容器中安装 JVM。因此,如果要将应用程序组件拆分为单独的容器,则这些容器中的每一个都需要有 JVM。 附带说明,容器可以通过一个名为container linking的进程相互通信

    【讨论】:

      【解决方案3】:

      最佳实践是使用 jvm 创建映像,然后基于 jvm 映像创建其他映像(来自 Dockerfile 中的 jvm)。即使您将创建许多不同的图像,它们也不会浪费太多空间,因为 docker 使用分层文件系统,并且所有容器都将使用 jvm 图像的相同单个副本。是的,每个 jvm 都将是单独的进程,占用自己的内存 - 但 docker 用于隔离环境。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-28
        • 1970-01-01
        • 2015-07-26
        • 2015-04-25
        • 2019-10-20
        • 1970-01-01
        • 2015-09-23
        相关资源
        最近更新 更多