1. 概述

在这个教程中,我们将学习如何在Docker容器中部署Java WAR文件。

我们将把WAR文件部署到Apache Tomcat,这是一个广泛应用于Java社区的免费开源web服务器。

2. 将WAR文件部署到Tomcat

WAR(Web应用程序归档)是一个包含所有与web应用相关的文件及其目录结构的压缩存档文件。

为了简化,将WAR文件部署到Tomcat(/tomcat-deploy-war)的过程就是将该WAR文件复制到Tomcat服务器的部署目录。在Linux中,部署目录是$CATALINA_HOME/webapps$CATALINA_HOME表示Tomcat服务器的安装目录。

接下来,我们需要重启Tomcat服务器,它将在部署目录中提取WAR文件。

3. 在Docker容器中部署WAR文件

假设我们有一个名为ROOT.war的应用程序WAR文件,需要将其部署到Tomcat服务器。

为了实现这个目标,我们需要首先创建一个Dockerfile。这个Dockerfile将包含运行我们的应用程序所需的所有依赖项。

然后,我们将使用这个Dockerfile创建Docker镜像,并随后启动Docker容器。

现在让我们逐个深入了解这些步骤。

3.1. 创建Dockerfile

我们将使用官方的Tomcat Docker镜像作为Dockerfile的基础镜像,因为这样可以确保所有必要的依赖包都已经预装。例如,如果我们使用最新版的Ubuntu/CentOS Docker镜像,那么需要手动安装Java、Tomcat和其他所需的包。

由于所有必要的包都已安装,我们只需要将WAR文件ROOT.war复制到Tomcat服务器的部署目录即可。就这样!

让我们更深入地看看:

$ ls
Dockerfile  ROOT.war
$ cat Dockerfile 
FROM tomcat

COPY ROOT.war /usr/local/tomcat/webapps/

$CATALINA_HOME/webapps表示Tomcat的部署目录。对于官方的Docker镜像,CATALINA_HOME/usr/local/tomcat,因此完整的部署目录将是/usr/local/tomcat/webapps

这里我们使用的应用程序非常简单,不需要其他依赖。

3.2. 构建Docker镜像

现在,使用我们刚刚创建的Dockerfile来构建Docker镜像:

$ pwd
/baeldung
$ ls
Dockerfile  ROOT.war
$ docker build -t myapp .
Sending build context to Docker daemon  19.97kB
Step 1/2 : FROM tomcat
 ---> 710ec5c56683
Step 2/2 : COPY ROOT.war /usr/local/tomcat/webapps/
 ---> Using cache
 ---> 8b132ab37a0e
Successfully built 8b132ab37a0e
Successfully tagged myapp:latest

docker build命令将创建一个带有标签myapp的Docker镜像。

请确保从Dockerfile所在的目录构建Docker镜像。 在我们的示例中,当我们构建Docker镜像时,我们在/baeldung目录下。

3.3. 运行Docker容器

到目前为止,我们已经创建了Dockerfile并从中构建了一个Docker镜像。现在让我们运行Docker容器:

$ docker run -itd -p 8080:8080 --name my_application_container myapp
e90c61fdb4ac85b198903e4d744f7b0f3c18c9499ed6e2bbe2f39da0211d42c0
$ docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
e90c61fdb4ac        myapp               "catalina.sh run"   6 seconds ago       Up 5 seconds        0.0.0.0:8080->8080/tcp   my_application_container

此命令将使用Docker镜像myapp启动名为my_application_container的Docker容器。

Tomcat服务器的默认端口是8080。 因此,在启动Docker容器时,一定要将容器端口8080绑定到主机上的可用端口。在这里,我们为了简单起见,使用了主机端口8080。

3.4. 验证设置

现在,让我们验证我们所做的所有操作。我们将访问浏览器中的URLhttp://<IP>:<PORT>来查看应用程序。

这里的IP表示Docker主机机器的公共IP(在某些情况下可能是私有IP)。PORT是我们运行Docker容器时暴露的容器端口(在本例中是8080)。

我们也可以使用Linux中的curl工具进行验证:

$ curl http://localhost:8080
Hi from Baeldung!!!

在上述命令中,我们是从Docker主机机器执行命令的,因此我们可以使用localhost连接到应用程序。curl工具会打印出应用程序网页的原始HTML。

4. 总结

在这篇文章中,我们学习了如何在Docker容器中部署Java WAR文件。我们从使用官方Tomcat Docker镜像创建Dockerfile开始,然后构建Docker镜像并运行应用程序容器。

最后,我们通过访问应用程序URL来验证设置。