2017-03-20 265 views
2

我有一个当前在tomcat实例内部运行的java应用程序。这个应用程序有3-6个(取决于使用)webapps。我想将此应用程序打包到码头容器中以设置新的测试系统基础结构。Docker:Dockerize Tomcat应用程序 - 最佳实践

什么是最好的策略呢?将每个webapp打包到一个基于tomcat的容器中,并将其与docker-compose绑定(我更喜欢但不确定这是否可能?),或者将一个基于tomcat的容器与所有webapps放在一起。

有没有人有经验呢?

回答

1

这取决于你想要什么 - 没有简单的答案,你正在寻找什么。

我看到的选项:

  • 一切都在一个容器:您复制所有WAR文件的/目录进入,当你建立你的形象,然后启动该容器。这意味着您只需要担心单个命令启动/停止/重新启动事件,但这也意味着所有应用程序共享相同的生命周期和相同的资源(CPU,JVM堆,线程池等)。
  • 另一种方法是运行Docker Compose,其中每个应用程序都有一个单独的图像,并启动一个单独的容器。使用Docker Compose,您可以将它们链接在一起,以便它们可以看到对方,并且可以根据需要启动/停止/重新启动/删除/重新创建它们。如果需要,您甚至可以进一步开始并开始同一应用的多个实例 - 这不适用于其他方法。

正如你所看到的,每一种方法都有其优点和缺点,这真的取决于你想要什么。每个应用程序使用单个映像/容器的第二种方法更加灵活,但需要更多的配置,并且会有更多的开销,因为您将运行6个Tomcat实例,而不是仅运行一个。

对于它的价值,我使用第二种方法作为我的用例。我有一个在所有应用程序中共享的基本Tomcat映像,它基于官方的Docker Tomcat映像,并添加了一些常见的东西。然后,每个应用程序都有其自己的图像和其他配置,然后我使用Docker Compose将它们一起拉出。

如果您不关心增加的灵活性,并且您的所有应用程序将始终具有相同的生命周期,那么第一种方法也可能奏效 - 这完全取决于您想要做什么。

+0

感谢您的快速响应。我的首选是去第二种方法。这也意味着每个tomcat都会暴露一个不同的端口吗?或者是否有可能从所有应用程序的“外部视图”都有一个8080端口? – Joschi

+0

每个Tomcat实例都有自己的端口,您可以通过Docker Compose进行分配。在内部,图像全部使用8080,但是我使用Docker Compose将它们映射到外部端口(8081,8082,...)。如果您想将它们隐藏在公共端口后面,则必须在其前面放置反向代理(例如nginx)。这是一个应用程序每个容器方法的缺点之一... – nwinkler

+0

好的,谢谢你,帮助我! – Joschi