【问题标题】:is it a good practice to put a war file image into docker containers?将war文件映像放入docker容器是一种好习惯吗?
【发布时间】:2016-12-03 23:17:15
【问题描述】:

我是 docker 新手。我有一个 Spring-boot 应用程序,我想使用 docker 部署和运行它。将war文件图像放入容器中是一种好习惯还是最好放入jar文件?为什么?

附:一旦我读到最好“制作罐子,而不是战争”:-) 但不知道背后的原因。

【问题讨论】:

  • 你可以把jar、war、sar或者任何类型的文件放到docker里面。取决于您要达到的目标。
  • 所以对于一个 spring-boot 应用程序,这两种方式都是常见的做法?

标签: docker spring-boot dockerfile


【解决方案1】:

为您的应用程序构建 docker 映像的主要原因之一是提供人们无需安装和管理外部软件依赖项即可运行的人工制品(例如运行 war 文件的应用服务器)。

从容器用户的角度来看,将代码打包为 jar 文件、war 文件还是 fortran 二进制文件都没有区别。他们所做的只是运行一个容器镜像。

从您的角度来看,进行 Docker 构建和配置管理、打包 jar 文件和复制将是一个比尝试设置和配置应用服务器以打包然后将每个版本部署到应用服务器中更简单的解决方案。有关 java 构建的更多技术组件,请参阅Ohmens answer

【讨论】:

  • 谢谢马特!很全面!
【解决方案2】:

马特的答案是正确的,但你必须考虑一些进一步的问题。

  • 应用服务器的更新:tomcat 或 glassfish 的 docker 镜像由负责的公司维护。如果他们发现一个讨厌的(安全)错误,他们会修复它并将该图像的新版本推送到 docker hub。要将您的容器更新到该安全版本,您所要做的就是重建您的映像并运行一个新版本。如果将应用程序服务器捆绑在 jar 中,则必须重新编译整个项目以使用该更新版本。顺便说一句,大多数应用服务器都有一个自动部署机制来轻松部署战争。
  • Dockers 缓存:如果你从一个 java 基础镜像构建一个镜像,然后简单地将你的 fat jar 复制到上面,你的整个镜像由一个大的层组成。如果您构建另一个版本的应用程序,大 jar 文件会更改,从而导致 docker 创建另一个大层。这两个大层都需要光盘上的空间。另一方面,如果您将“小”war 文件部署到应用程序服务器,则两个图像共享所有层,直到带有 war 文件的层。借助这些机制,docker 是否可以提高您的磁盘使用率并加快构建时间。

【讨论】:

  • 感谢欧门!更全面! :-)
  • 我正在写关于这个主题的论文,所以欢迎您:-D
  • @Ohmen 您是否认为重新编译应用程序比为新的应用程序服务器更新您的 docker 构建并部署要糟糕得多?
  • 关于缓存的好点。胖罐子可以是made a bit more docker friendly
  • @Matt 感谢我不知道的链接。但是,如果您的应用程序不仅是三个大类并且使用一些复杂的构建过程(依赖项、环境、秘密、遗留部分),那么如果您不必再次测试所有这些与新构建的集成,那么您会很高兴。如果是小型 maven 构建或定义明确的 CD/CI 管道,您是对的,这并不重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2022-01-20
  • 2019-11-20
  • 1970-01-01
  • 2021-04-22
相关资源
最近更新 更多