如何将一个Tomcat应用程序进行Docker化

4

我正在尝试将一些Tomcat应用程序进行Docker化,但之前从未接触过Java应用程序,因此缺乏理解使得很难明白该如何做。

到目前为止,我已经有了以下内容,但它并不起作用,而且我也不确定路径是否正确。

FROM tomcat:6

ENV APP_ROOT /app_name

RUN apt-get update && apt-get install -y default-jdk

COPY . $APP_ROOT/
WORKDIR $APP_ROOT

RUN jar -cvf app_name.war *

# this fail for some reason, when I do `ls` the file is there but if fail to copy it
COPY app_name.war $CATALINA_BASE/webapps/app_name.war

我一直陷入困境,因为我不理解,并且谷歌搜索并没有帮助我太多(我不知道如何提问)。

如果不使用jar命令进行构建,那么我应该使用什么?如果不是这样的话,我想我必须在本地构建,只需确保.war位于正确的位置即可。

Java与Tomcat应用程序的构建方式是什么?如何与Docker集成?

对不起,我的问题有点泛泛而谈,但我对Java一无所知。


$CATALINA_BASE 在你的 Dockerfile 中不是一个环境变量,对吗? - OneCricketeer
另外,Tomcat 6 真的很老了... - OneCricketeer
到目前为止,你所做的只是配置,寻找Dockerfile中的CMD和ENTRYPOINT指令。 - user2915097
@cricket_007 $CATALINA_BASE 来自于 tomcat 基础镜像。而且我无法更改 tomcat 版本 :( - Yordis Prieto Lazo
@user2915097 是的,我甚至无法通过那个测试,所以我甚至无法运行这个应用程序,如果我没有记错的话,我必须执行 CMD ["catalina.sh", "run"]。我构建的方式是否正确? - Yordis Prieto Lazo
请查看 https://hub.docker.com/_/tomcat/。 - user2915097
3个回答

4
你可以尝试手动操作一遍,然后再尝试自动化,这样能帮助你更好地理解整个过程。如果你不需要定制权限和用户(在生产环境中需要),你无需扩展Tomcat官方镜像以便在docker化的Tomcat上部署war包,可以直接使用该镜像。
如果你需要Tomcat 6.x,因为你的Web应用程序实现的Servlet API <3,请按以下操作:
sudo docker run --name tomcat --detach --port 8080:8080 tomcat:6

现在,你的Tomcat已经在后台运行(--detach),等待部署。你从容器中导出了8080端口,并将其映射到主机的8080端口,因此应用程序将在主机上的http://localhost:8080/ 上可用。

从现在开始,如果你将.war文件复制到/usr/local/tomcat/webapps目录下的容器中,该应用程序将被部署:

sudo docker cp app_name.war tomcat:/usr/local/tomcat/webapps/

1
我正在努力让不懂Docker和/或Java的人能够简单地使用。这就是为什么我希望将整个构建过程保留在构建中,这样您就不必处理这些问题。无论是在计算机上安装Java还是任何用于构建war包或在构建之后执行其他任务(例如挂载卷),都不需要安装任何SDK。 - Yordis Prieto Lazo
1
@Tristan 的方法非常好,用于测试您的 app_name.war 文件以确保其正常工作。当您所有最终细节都已解决时,可以切换为使用 COPY app_name.war /to/path,因为它将遵循与上述过程类似的流程。 - jrbeverly

4

看了你的代码,我得出以下结论:

  • 你有一些Java文件存储在当前目录(.)中
  • 当你调用 COPY 命令时,你将所有这些内容复制到 /app_name 目录下
  • 你在该文件上创建了一个 .war 文件

需要注意的一点是,app_name.war 不在主机磁盘上,它目前位于Docker文件系统内部。这意味着你无法使用 COPY 命令来复制 .war 文件。

你真正想要的是这个命令:RUN cp app_name.war $CATALINA_BASE/webapps/app_name.war

这看起来像下面这样: Dockerfile

FROM tomcat:6
ENV APP_ROOT /app_name
RUN apt-get update && apt-get install -y default-jdk
COPY . $APP_ROOT/
WORKDIR $APP_ROOT
RUN jar -cvf app_name.war *
RUN cp app_name.war $CATALINA_BASE/webapps/app_name.war

在此添加 COPY docker 参考,因为它可以详细说明命令。您还可以编写一个名为 provision.sh 的脚本,并执行以下操作:

COPY provision.sh /tmp/provision.sh
RUN sh /tmp/provision.sh

这样,您可以将所有构建、配置和其他操作放入单个脚本中,并在本地进行测试(如果有必要的话)。

编辑:添加有关在本地构建并复制到dockerfile中的提及。

您可以在您的计算机上构建.war文件,并使用COPY命令将其放入机器中。 Dockerfile

FROM tomcat:6
ENV APP_ROOT /app_name
RUN apt-get update && apt-get install -y default-jdk

COPY app_name.war $CATALINA_BASE/webapps/app_name.war
WORKDIR $APP_ROOT

以上代码将文件app_name.war复制到容器的文件系统中的路径$CATALINA_BASE/webapps/app_name.war。因此,您需要执行以下操作:
  1. 在您的计算机上使用Java构建.war文件。
  2. .war文件与Dockerfile放在同一目录下。
  3. COPY app_name.war将其复制到容器的文件系统中。

这很有道理,这就解释了为什么我不能复制它。我会尝试这个。我应该继续在我的构建中使用.war文件吗?我不想让人们了解Java的工作原理,所以我不想只是挂载卷。 - Yordis Prieto Lazo
1
你可以用几种方式来完成它:(1) 在外部构建.war,然后只需执行COPY app_name.war /app_name/即可;或者(2) 在镜像中构建它,但是您可能想要删除Java的构建工具,以保持镜像的小巧。在这两种情况下,使用该应用程序的人只需执行docker pull your_image即可,无需知道具体使用细节。 - jrbeverly
请您在答案中添加注释。 - Yordis Prieto Lazo

3
我没有使用Docker,而是使用类似的AWS产品CodeDeploy进行实例配置,所以我告诉你我如何在我的配置脚本中设置Tomcat。这应该很容易转移到Docker上,只是Bash命令而已。
1)构建WAR 现在大多数Java应用都使用Maven构建,但Gradle也越来越流行。Maven和WAR插件用于将Java代码转换为WAR文件,您可以在Tomcat上部署它。但看起来你已经有了由其他人构建的WAR?无论如何,你不直接运行war文件,而是放到Tomcat中,除非你已经将Tomcat打包到应用程序中,在这种情况下它将成为一个JAR,但让我们不要谈论这个问题...解决方案是使用像Maven或Gradle这样的构建工具从Java代码构建WAR。通过构建,我指的是将源代码变成二进制代码。
2)安装Tomcat
yum install tomcat6,7,8等等(您需要哪个版本)
然后启动它
service start tomcat8
3)部署WAR 要运行WAR,请将其放置在Tomcat安装的webapps文件夹中。我一般喜欢关闭Tomcat再进行此操作,但您也可以在其运行时进行操作。几秒钟后,WAR文件(实际上只是一个zip文件)将被展开/解压缩以创建一个目录。
4)访问应用程序/站点 如果您将war重命名为ROOT.war,则可以在8080上访问应用程序http://localhost:8080,如果您的配置是让其在8080上监听。如果您的WAR命名为pets.war,则您的Web应用程序URL将为http://localhost:8080/pets。您可以在其conf文件夹中的server.xml文件中配置Tomcat侦听哪个端口。
最重要的 一旦您知道要查找什么,Tomcat文档非常好。主要的配置文件是web.xml、context.xml和server.xml。中央Tomcat指南解释了每个组件https://tomcat.apache.org/tomcat-7.0-doc/setup.html,您只需找到与您的Tomcat版本相对应的文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接