使用 Docker 运行 Tomcat + WAR 包 Java 应用

使用 Docker 运行 Tomcat + WAR 包 Java 应用

目标:用 Tomcat 容器运行一个 J2EE 应用

本项目代码维护在 DaoCloud/docker-demo-java-tomcat项目中。

您可以在 GitHub 找到本项目并获取本文中所提到的所有代码文件。

前言

在第一篇教程中,基于 Spring Boot 框架创建了一个 Docker 化的 Java 应用,应用编译的结果是一个 jar 包,而通常我们的 J2EE 应用的产出物是一个 war 包,在本教程中,我们将使用基于 Tomcat 的 Docker 容器运行我们的应用。

创建一个新的 Maven Webapp 项目

执行如下命令,生成 Maven Webapp 项目

    mvn archetype:generate -DgroupId=io.daocloud.demo \
                           -DartifactId=docker-demo-java-tomcat \
                           -DarchetypeArtifactId=maven-archetype-webapp 

编写 Dockerfile 文件

在教程 构建基于 Maven 和 Tomcat 的基础镜像 中,构建了一个基于 Maven 和 Tomcat 的基础镜像,如果您还没来得及阅读,建议您先阅读该教程,可以在本教程中减少 Dockerfile 文件的复杂度和构建时间。

选择基础镜像

如果您已经构建了自己的基础镜像,那么在接下来的教程中,将使用您构建的基础镜像作为开始:

FROM base-tomcat-maven:latest 

如果您使用了 DaoCloud 的代码构建,且当前项目也是使用的 DaoCloud 代码构建,请把 Dockerfile 中的基础镜像修改为您在 DaoCloud 上的镜像地址,如:

FROM daocloud.io/rockytan/docker-base-maven-tomcat:latest 

上文中的 rockytan 为作者的镜像仓库名称,请替换成您自己的仓库名称。

如果您没有构建自己的基础镜像,现在需要构建一个同时包含 Maven 和 Tomcat 的镜像,那我们从头开始构建:

FROM maven:3.3.3

ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
RUN mkdir -p "$CATALINA_HOME"
WORKDIR $CATALINA_HOME

RUN gpg --keyserver pool.sks-keyservers.net --recv-keys \
        05AB33110949707C93A279E3D3EFE6B686867BA6 \
        07E48665A34DCAFAE522E5E6266191C37C037D42 \
        47309207D818FFD8DCD3F83F1931D684307A10A5 \
        541FBE7D8F78B25E055DDEE13C370389288584E7 \
        61B832AC2F1C5A90F0F9B00A1C506407564C17A3 \
        79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED \
        9BA44C2621385CB966EBA586F72C284D731FABEE \
        A27677289986DB50844682F8ACB77FC2E86E29AC \
        A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 \
        DCFD35E0BF8CA7344752DE8B6FB21E8933C60243 \
        F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE \
        F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23

ENV TOMCAT_VERSION 8.0.29
ENV TOMCAT_TGZ_URL https://www.apache.org/dist/tomcat/tomcat-8/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz

RUN set -x \
        && curl -fSL "$TOMCAT_TGZ_URL" -o tomcat.tar.gz \
        && curl -fSL "$TOMCAT_TGZ_URL.asc" -o tomcat.tar.gz.asc \
        && gpg --verify tomcat.tar.gz.asc \
        && tar -xvf tomcat.tar.gz --strip-components=1 \
        && rm bin/*.bat \
        && rm -rf webapps/* \
        && rm tomcat.tar.gz* 

同样的,我们的选择了官方维护的 maven:3.3.3  镜像,并且在之上加入了 Tomcat 的支持。

添加项目构建

ADD pom.xml /tmp/build/
RUN cd /tmp/build && mvn -q dependency:resolve

ADD src /tmp/build/src
        #构建应用
RUN cd /tmp/build && mvn -q -DskipTests=true package \
        #拷贝编译结果到指定目录
        && rm -rf $CATALINA_HOME/webapps/* \
        && mv target/*.war $CATALINA_HOME/webapps/ROOT.war \
        #清理编译痕迹
        && cd / && rm -rf /tmp/build

EXPOSE 8080
CMD ["catalina.sh","run"] 

执行镜像构建

docker build -t docker-demo-java-tomcat . 

启动 Docker 镜像,享受 Docker 世界带来的便利

基于镜像创建容器:

docker run -d -p 8080:8080 docker-demo-java-tomcat 

随后,打开浏览器,或者使用 curl 命令访问如下地址:

http://127.0.0.1:8080/demo 

将会看到 Hello World! 的输出,这表示我们基于 J2EE 应用编译的 war 包已经成功使用 Docker 运行起来了。

致谢

本文由 DaoCloud 社区用户谭文科提供