使用Docker运行Java Web应用

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Tomcat是目前比较流行的Web应用服务器,深受Java爱好者的喜爱。通常J2EE应用的产出物是一个war包,这篇文章将为你介绍如何使用Docker运行Tomcat+war包的Java Web应用,并比较其它几种方法的优缺点。

前言

Tomcat是目前比较流行的Web应用服务器,深受Java爱好者的喜爱。通常J2EE应用的产出物是一个war包,这篇文章将为你介绍如何使用Docker运行Tomcat+war包的Java Web应用,并比较其它几种方法的优缺点。

在生产环境中,我们推荐基于Tomcat的Docker容器来打包、运行您的Java应用,即在Tomcat的Docker镜像基础上构建应用镜像,Dockerfile如下所示:

FROM tomcat:8
ADD your_app.war /usr/local/tomcat/webapps/
CMD ["catalina.sh", "run"]

Hello-World

Maven是一款优秀的跨平台项目管理工具,本文将使用Maven构建一个简单Hello World Web应用,并使用docker来运行。
首先,你需要一个Maven开发环境,你可以在自己的开发环境安装Maven,或者可以使用Docker Hub上的Maven镜像作为构建环境。

创建一个Maven WebApp

创建maven-demo和maven-repo目录用作docker volume,这样Maven创建的项目会持久化在maven-demo目录下,maven的local repository持久话在maven-repo目录下。

$ mkdir maven-demo maven-repo

运行maven docker新建一个Maven项目

$ docker run -it --rm --name maven-demo -v "$PWD"/maven-demo:/usr/src/maven-demo -v "$PWD"/maven-repo/:/root/.m2/repository -w /usr/src/maven-demo maven:3 mvn -B archetype:generate -DgroupId=com.aliyun.demo -DartifactId=hello-world -DarchetypeArtifactId=maven-archetype-webapp

运行成功后,可以看到项目目录结构如下:

hello-world
    |---pom.xml
    |---src
        |---main
            |---resource
            |---webapp
                |---WEB-INF
                |   |---web.xml
                |---index.jsp

构建Maven项目

$ docker run -it --rm --name maven-demo -v "$PWD"/maven-demo/:/usr/src/maven-demo -v "$PWD"/maven-repo/:/root/.m2/repository -w /usr/src/maven-demo/hello-world maven mvn package

构建成功后,hello-world目录下多了一个target目录,包含hello-world.war文件。

Docker镜像打包

编辑Dockerfile

FROM tomcat:8
ADD maven-demo/hello-world/target/hello-world.war /usr/local/tomcat/webapps/
CMD ["catalina.sh", "run"]

Build Image

$ docker build -t maven-demo-hello-world .

运行Docker镜像

$ docker run -d -p 8080:8080 maven-demo-hello-world

打开浏览器访问 http://127.0.0.1:8080/hello-world/ 将会看到 Hello World! 的输出,这表示我们编译的hello-world war 包已经成功使用 Docker 运行起来了。

版本管理

实际生产中需要特别关注的是应用镜像的版本管理,因为除了你的应用代码会更新之外,Tomcat的镜像也会因一些补丁发生版本更新。你需要及时构建应用镜像的新版本,并打上合适的tag,以便于在升级运行应用时选择合适的版本。

Docker Hub支持用户Github仓库的自动构建功能,使得这件事情变得简单很多。也就是说:只要你的Java应用代码的Github仓库中有代码更新时,会自动更新产生一个新的应用镜像。 如果你使用阿里云的容器Hub服务,同样可以支持这样的功能帮助你构建应用镜像。

更多实践方案

由于Docker功能的强大与灵活,也有用户在实践中使用其它一些方法,期望获得同样的效果,但有一些问题需要特别注意。

使用Data Volume

$ docker run -d -v /tmp/apps/your.war:/usr/local/tomcat/webapps/your.war tomcat:8

这种方法可以避免每次修改代码都会生成新的Docker应用镜像的工作,用户可以将应用包挂载到Tomcat容器的volume中。这个方法非常适合在单机上进行开发测试时使用,当你想更新应用war包时,只需要直接更新即可,无需其它额外工作。
但这个做法在生产环境上有明显的缺陷,因为生产环境中难免会遇到因为各种原因导致容器出错的情况,在这种情况发生时容器的调度系统可能会把容器调度到另一台物理机上运行,而那台机器上却没有对应的应用包volume,用户的应用就无法正常运行了。

数据容器

FROM tomcat:8
ADD your.war /usr/local/tomcat/webapps/

使用这样的Dockerfile构建出数据容器,并将它的volume与Tomcat容器共享。

$ docker build -t app-image .
$ docker create -d -v /usr/local/tomcat/webapps/ --name app app-image true
$ docker run -d --volumes-from app tomcat:8

由于系统一定会把共享volume的容器调度运行在同一台宿主机上,这样可以保证正确运行。然而,由于共享volume的容器只能被调度到同一台宿主机上,这样会限制系统的可伸缩性。

目录
相关文章
|
5天前
|
XML 存储 Java
11:Servlet中初始化参数的获取与应用-Java Web
11:Servlet中初始化参数的获取与应用-Java Web
18 3
|
3天前
|
Oracle Java 关系型数据库
windows 下 win11 JDK17安装与环境变量的配置(配置简单详细,包含IJ中java文件如何使用命令运行)
本文介绍了Windows 11中安装JDK 17的步骤,包括从官方网站下载JDK、配置环境变量以及验证安装是否成功。首先,下载JDK 17的安装文件,如果没有Oracle账户,可以直接解压缩文件到指定目录。接着,配置系统环境变量,新建`JAVA_HOME`变量指向JDK安装路径,并在`Path`变量中添加。然后,通过命令行(cmd)验证安装,分别输入`java -version`和`javac -version`检查版本信息。最后,作者分享了如何在任意位置运行Java代码,包括在IntelliJ IDEA(IJ)中创建的Java文件,只需去掉包声明,就可以通过命令行直接运行。
27 0
|
3天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能对比
【5月更文挑战第4天】在移动开发的世界中,性能一直是衡量应用质量的重要指标。随着Kotlin的兴起,许多Android开发者开始考虑是否应该从传统的Java迁移到Kotlin。本文通过深入分析两者在Android平台上的性能差异,帮助开发者理解Kotlin在实际项目中的表现,并提供选择编程语言时的参考依据。
17 5
|
5天前
|
安全 IDE Java
Java串口通信技术探究2:RXTX库单例测试及应用
Java串口通信技术探究2:RXTX库单例测试及应用
23 4
|
5天前
|
设计模式 存储 前端开发
18:JavaBean简介及其在表单处理与DAO设计模式中的应用-Java Web
18:JavaBean简介及其在表单处理与DAO设计模式中的应用-Java Web
22 4
|
5天前
|
存储 前端开发 安全
13:会话跟踪技术Session的深度应用与实践-Java Web
13:会话跟踪技术Session的深度应用与实践-Java Web
20 3
|
5天前
|
存储 前端开发 搜索推荐
12:会话跟踪技术Cookie的深度应用与实践-Java Web
12:会话跟踪技术Cookie的深度应用与实践-Java Web
20 4
|
6天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【5月更文挑战第1天】 在移动开发的世界中,性能优化始终是开发者关注的焦点。随着Kotlin的兴起,许多团队和开发者面临着一个选择:是坚持传统的Java语言,还是转向现代化、更加简洁的Kotlin?本文通过深入分析和对比Kotlin与Java在Android应用开发中的性能表现,揭示两者在编译效率、运行速度和内存消耗等方面的差异。我们将探讨如何根据项目需求和团队熟悉度,选择最适合的语言,以确保应用的高性能和流畅体验。
|
6天前
|
安全 Java 程序员
Java并发编程:理解并应用ReentrantLock
【4月更文挑战第30天】 在多线程的世界中,高效且安全地管理共享资源是至关重要的。本文深入探讨了Java中的一种强大同步工具——ReentrantLock。我们将从其设计原理出发,通过实例演示其在解决并发问题中的实际应用,以及如何比传统的synchronized关键字提供更灵活的锁定机制。文章还将讨论在使用ReentrantLock时可能遇到的一些挑战和最佳实践,帮助开发者避免常见陷阱,提高程序性能和稳定性。
|
6天前
|
供应链 Java API
Java 8新特性解析及应用区块链技术在供应链管理中的应用与挑战
【4月更文挑战第30天】本文将深入探讨Java 8的新特性,包括Lambda表达式、Stream API和Optional类等。通过对这些新特性的详细解析和应用实例,帮助读者更好地理解和掌握Java 8的新技术。