将Java应用程序Docker化的方法

11 浏览
0 Comments

将Java应用程序Docker化的方法

在Docker中进行应用部署的原则是什么?\n我看到有两个概念:\n

    \n

  1. 为每个应用版本创建镜像
  2. \n

  3. 创建应用程序二进制文件,并以某种方式部署到容器中(例如利用Tomcat的热部署)
  4. \n

\n也许还有其他的方法,我个人比较喜欢第一种方法,但如果发布非常频繁,会产生大量数据。如何在两者之间做出选择呢?\n我想了解其他人如何部署他们的Java应用程序,以便我可以形成自己的观点。

0
0 Comments

Docker是一种流行的容器化技术,可以将应用程序及其依赖项打包到一个独立的、可移植的容器中。然而,将Java应用程序容器化可能会遇到一些问题,本文将讨论这些问题以及解决方法。

问题1:内存限制导致性能问题

在Java 8之前的版本中,Docker对内存限制的报告可能不准确,这可能导致Java应用程序在容器中无法达到预期的性能。然而,从Java 8u131和JDK 9开始,JVM对Docker的CPU限制具有透明的支持。通过在JVM中设置参数"-XX:+UnlockExperimentalVMOptions"和"-XX:+UseCGroupMemoryLimitForHeap",可以启用这个实验性的VM选项。在Java 10中,默认情况下已经启用了这些选项,不需要额外设置。

问题2:多线程导致的性能问题

由于Docker限制了CPU使用率,Java应用程序可能会在处理不同线程之间切换时耗费大量的时间,无法完成实际工作。这会违背容器的承诺:"在任何地方运行"。为了解决这个问题,可以使用多阶段构建技术和绑定挂载来优化Java应用程序的性能。

解决方法1:多阶段构建

多阶段构建可以确保应用程序只包含运行时所需的内容,而不包含任何编译文件。这样可以减少镜像的大小并提高性能。

解决方法2:绑定挂载

绑定挂载是一种将应用程序的war包复制到由单个Tomcat容器挂载的卷中的方法。这样可以避免在每个版本构建时增加镜像的大小,节省磁盘空间。

通过使用多阶段构建和绑定挂载等技术,可以解决Docker化Java应用程序时可能遇到的性能和存储问题。此外,从Java 8u131和JDK 9开始,JVM对Docker的CPU限制也有了更好的支持,进一步提高了Java应用程序在容器中的性能。

0