如何将java应用程序停靠

时间:2018-01-11 04:47:21

标签: java docker

docker中应用程序部署的原则是什么?

我看到两个概念

  1. 按应用版本创建图片
  2. 创建app二进制文件并以某种方式将它们部署到容器(利用,即Tomcats热部署)
  3. 也许还有其他人,我个人喜欢第一个,但如果你经常发布,我必须拥有大量的数据。如何选择一个而不是另一个?

    我想知道其他人如何部署他们的Java应用程序,以便我可以发表个人意见。

1 个答案:

答案 0 :(得分:0)

作为任何权衡,它取决于您的情况/发布周期。

但是,考虑到Java的性质,首先考虑Java也可能不适合码头环境 请参阅" Nobody puts Java in a container"

  

因此,我们已经完成了基于JVM的应用程序的开发,现在将其打包成docker镜像并在我们的笔记本上进行本地测试。一切都很好,所以我们将该容器的10个实例部署到我们的生产集群上。突然之间,应用程序受到限制,并没有达到我们在测试系统上看到的相同性能。我们的测试系统甚至是具有64个内核的高性能系统......

     

发生了什么事?   为了允许多个容器并排运行,我们已将其指定为限制为一个cpu(或CPU份额中的等效比率)。不幸的是,JVM将看到该节点上的核心总数(64),并使用该值初始化我们之前看到的默认线程数。在开始的10个实例中,我们最终得到:

10 * 64 Jit Compiler Threads

10 * 64 Garbage Collection threads

10 * 64 ….
  

我们的应用程序受限于它可以使用的cpu周期数,主要是处理不同线程之间的切换,并且无法完成任何实际工作。

     

容器的承诺,“包装一次,随处运行”似乎都被违反了......

  

具体来说,如何处理每个版本构建映像时生成的数据量?如果您每次在tomcat映像上构建应用程序,存储映像所需的磁盘空间将快速增长,对吧?

2种技巧:

  • multi-stage build确保您的应用程序不包含运行时需要的任何内容(而不包括任何编译文件)。请参阅我的回答here;
  • bind mounts:您只需将您的战争复制到由单个Tomcat容器安装的卷中。