使用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全栈开发实践。
614 1
|
6月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
694 0
|
11月前
|
前端开发 Java 关系型数据库
基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行
基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习共同进步
646 7
|
7月前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
480 1
|
中间件 关系型数据库 数据库
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
379 19
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
473 20
|
12月前
|
运维 网络安全 文件存储
找不到类似 Docker Desktop 的 Web 管理界面?试试这些开源方案
Docker Desktop 是本地容器化开发的利器,但存在无法通过 Web 远程管理、跨平台体验不一致等问题。为此,推荐几款轻量级、可 Web 化管理的 Docker 工具:Portainer 功能全面,适合企业级运维;CasaOS 集成应用商店和 NAS 功能,适合家庭/个人开发环境;Websoft9 提供预集成环境,新手友好。这些工具能有效提升容器管理效率,满足不同场景需求。
860 3
|
12月前
|
Java API Docker
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
以上内容是一个简单的实现在Java后端中通过DockerClient操作Docker生成python环境并执行代码,最后销毁的案例全过程,也是实现一个简单的在线编程后端API的完整流程,你可以在此基础上添加额外的辅助功能,比如上传文件、编辑文件、查阅文件、自定义安装等功能。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
|
12月前
|
JavaScript Java Docker
干货含源码!如何用Java后端操作Docker(命令行篇)
只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
开发者 Docker Python
从零开始:使用Docker容器化你的Python Web应用
从零开始:使用Docker容器化你的Python Web应用
641 4