使用Docker运行Java Web应用

简介: 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的容器只能被调度到同一台宿主机上,这样会限制系统的可伸缩性。

目录
相关文章
|
6月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
659 1
|
6月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
772 0
|
7月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
835 64
|
7月前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
527 1
|
8月前
|
缓存 NoSQL Java
Java Web 从入门到精通之苍穹外卖项目实战技巧
本项目为JavaWeb综合实战案例——苍穹外卖系统,涵盖Spring Boot 3、Spring Cloud Alibaba、Vue 3等主流技术栈,涉及用户认证、订单处理、Redis缓存、分布式事务、系统监控及Docker部署等核心功能,助你掌握企业级项目开发全流程。
891 0
|
8月前
|
安全 JavaScript Java
java Web 项目完整案例实操指南包含从搭建到部署的详细步骤及热门长尾关键词解析的实操指南
本项目为一个完整的JavaWeb应用案例,采用Spring Boot 3、Vue 3、MySQL、Redis等最新技术栈,涵盖前后端分离架构设计、RESTful API开发、JWT安全认证、Docker容器化部署等内容,适合掌握企业级Web项目全流程开发与部署。
708 0
|
9月前
|
缓存 前端开发 应用服务中间件
Web端实时通信技术SSE在携程机票业务中的实践应用
本文介绍了携程机票前端基于Server-Sent Events(SSE)实现服务端推送的企业级全链路通用技术解决方案。文章深入探讨了 SSE 技术在应用过程中包括方案对比、技术选型、链路层优化以及实际效果等多维度的技术细节,为类似使用场景提供普适性参考和借鉴。该方案设计目标是实现通用性,适用于各种网络架构和业务场景。
303 1
|
10月前
|
缓存 前端开发 应用服务中间件
Web端实时通信技术SSE在携程机票业务中的实践应用
本文介绍了携程机票前端基于Server-Sent Events(SSE)实现服务端推送的企业级全链路通用技术解决方案。文章深入探讨了 SSE 技术在应用过程中包括方案对比、技术选型、链路层优化以及实际效果等多维度的技术细节,为类似使用场景提供普适性参考和借鉴。
396 7
|
Java Docker 微服务
微服务架构已成为Java Web开发的新趋势,它通过将应用分解为独立、可部署的服务单元,提升了系统的灵活性与可维护性。
微服务架构已成为Java Web开发的新趋势,它通过将应用分解为独立、可部署的服务单元,提升了系统的灵活性与可维护性。每个服务负责特定功能,通过轻量通信机制协作。利用Spring Boot与Spring Cloud等框架可简化开发流程,支持模块化设计、独立部署、技术多样性和容错性,适应快速迭代的需求。
258 1
|
Java Spring 开发者
Java Web开发新潮流:Vaadin与Spring Boot强强联手,打造高效便捷的应用体验!
【8月更文挑战第31天】《Vaadin与Spring Boot集成:最佳实践指南》介绍了如何结合Vaadin和Spring Boot的优势进行高效Java Web开发。文章首先概述了集成的基本步骤,包括引入依赖和配置自动功能,然后通过示例展示了如何创建和使用Vaadin组件。相较于传统框架,这种集成方式简化了配置、提升了开发效率并便于部署。尽管可能存在性能和学习曲线方面的挑战,但合理的框架组合能显著提升应用开发的质量和速度。
531 0