当前位置: 首页 > ds >正文

Tomcat镜像实战:掌握Dockerfile的编写以及发布项目

1. 为什么选择 Docker 部署 Tomcat?

在传统的 Java Web 项目部署中,我们通常需要手动安装 JDK、配置 Tomcat 环境变量、手动部署 WAR 包,部署过程繁琐、不可重复、环境易出错。而 Docker 的出现彻底改变了这一局面。

本博客将通过一个完整的 Tomcat 镜像构建与部署实例,带你逐步掌握以下技能:

  • 编写自己的 Dockerfile
  • 构建定制化的 Tomcat 镜像(包含 JDK 与 Tomcat)
  • 在容器中运行 Tomcat 并挂载项目目录
  • 快速访问并部署 JSP 测试项目

通过这个实战,你将掌握一种更加现代、标准化的 Web 应用部署方式,特别适用于:

  • 想了解如何用 Docker 封装 Java 环境的开发者
  • 想通过容器快速部署 Tomcat 项目的初学者
  • 希望后续实现自动化部署、CI/CD 的工程师

💡 本实战适配于 Linux 环境(如 CentOS),当然也可以在 Windows 下的 WSL 或 MacOS Docker Desktop 中完成。

2. 环境准备

在构建 Tomcat 镜像之前,我们需要准备以下内容:

2.1 所需软件

软件说明
Docker容器平台,用于构建与运行镜像
CentOS 镜像作为基础镜像构建环境
JDK 安装包示例中使用 JDK 8 的 tar.gz 包
Tomcat 安装包示例中使用 Tomcat 9 的 tar.gz 包
文本编辑器用于编写 Dockerfile 等文件(推荐 VSCode 或 Vim)

确保你已经在系统中安装并配置好了 Docker,可以通过以下命令检查:

docker -v

输出示例:

Docker version 26.1.4, build 5650f9b

2.2 准备工作目录

建议在某个专用路径中创建一个新的目录用于构建镜像,例如:

mkdir /home/perry/build/
cd /home/perry/build/

将以下文件放入该目录中:

  • jdk-8u261-linux-x64.tar.gz(或其他你使用的 JDK 版本)
  • apache-tomcat-9.0.22.tar.gz(或其他你使用的 Tomcat 版本)
  • 创建一个测试文件 readme.txt,内容任意,可以使用命令vim readme.txt
  • 新建一个名为 Dockerfile 的文件(无扩展名),可以使用命令vim Dockerfile,注意这里文件名最好是Dockerfile,这样在构建镜像时可以省去一些命令,也符合规范!

目录结构如下:

/home/perry/build/
├── apache-tomcat-9.0.22.tar.gz
├── jdk-8u261-linux-x64.tar.gz
├── readme.txt
└── Dockerfile

3. 编写 Dockerfile 文件

请在 /home/perry/build/ 目录中编辑名为 Dockerfile 的文件,写入以下内容:

FROM centos
MAINTAINER perry <zhangsan@163.com># 拷贝本地文件到镜像中
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u261-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.22.tar.gz /usr/local/# 修复 yum DNS 问题(CentOS 8 镜像常见问题)
RUN sed -i 's|^mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-*.repo && \sed -i 's|^#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*.repo && \yum clean all && \yum makecache && \yum -y install vim# 设置环境变量
ENV MYPATH /usr/local
WORKDIR $MYPATHENV JAVA_HOME /usr/local/jdk1.8.0_261
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin# 暴露端口
EXPOSE 8080# 启动命令:启动Tomcat并保持容器前台运行,,并将日志输出到catalina.out后面
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/logs/catalina.out

说明:

  • FROM centos:以官方 CentOS 镜像作为基础镜像
  • COPY ADD:将 JDK、Tomcat 和文档加入镜像
  • RUN:更换 yum 源并安装基础工具
  • ENV:设置环境变量,配置 JDK 和 Tomcat 路径
  • EXPOSE 8080:暴露 Tomcat 默认端口
  • CMD:定义容器启动时执行的命令

4. 构建自定义 Tomcat 镜像

在完成 Dockerfile 编写后,我们就可以使用 Docker 构建出一个属于自己的 Tomcat 镜像了。

4.1 构建命令

确保你当前位于 Dockerfile 所在目录,比如:

cd /home/perry/build

执行以下命令构建镜像:

docker build -t diytomcat .

其中:

  • -t diytomcat:给构建出来的镜像命名为 diytomcat
  • .:表示当前目录为构建上下文,会将该目录中的内容(包括 Dockerfile、JDK、Tomcat 包等)传给 Docker 引擎进行构建

4.2 构建过程示例输出

[+] Building 140.3s (11/11) FINISHED=> [internal] load build definition from Dockerfile                0.0s=> [internal] load metadata for docker.io/library/centos:latest   0.0s=> [1/6] FROM docker.io/library/centos:latest                      0.0s=> [2/6] COPY readme.txt /usr/local/readme.txt                     0.0s=> [3/6] ADD jdk-8u261-linux-x64.tar.gz /usr/local/                3.5s=> [4/6] ADD apache-tomcat-9.0.22.tar.gz /usr/local/               1.3s=> [5/6] RUN yum ...                                              130.1s=> [6/6] WORKDIR /usr/local                                        0.1s=> exporting to image                                              0.3s=> => writing image sha256:xxxxxxxxxxxxxxxxxxxx                   0.0s=> => naming to docker.io/library/diytomcat                       0.0s

4.3 验证镜像构建成功

执行以下命令查看镜像:

docker images

示例输出:

REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
diytomcat     latest    97b35be0b8ea   2 minutes ago    665MB

至此,你已经完成了镜像构建,接下来将是如何运行这个镜像。

5. 启动 Tomcat 容器并测试访问

5.1 运行容器

使用下面命令基于刚刚构建好的镜像 diytomcat 启动一个 Tomcat 容器:

docker run -d \-p 9090:8080 \--name perrytomcat \-v /home/perry/build/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test \-v /home/perry/build/tomcat/tomcatlogs:/usr/local/apache-tomcat-9.0.22/logs \diytomcat

参数说明:

参数作用
-d后台运行容器
-p 9090:8080将宿主机 9090 端口映射到容器的 8080 端口(Tomcat 默认)
--name指定容器名称为 perrytomcat
-v挂载本地目录用于项目部署和日志收集
diytomcat使用构建好的镜像运行容器

5.2 验证容器是否启动成功

docker ps

你应该能看到类似的输出:

CONTAINER ID   IMAGE       COMMAND                   CREATED        STATUS        PORTS                                       NAMES
7e82be53abfb   diytomcat   "/bin/sh -c '/usr/lo…"   11 hours ago   Up 11 hours   0.0.0.0:9090->8080/tcp, :::9090->8080/tcp   perrytomcat

5.3 访问 Tomcat 首页

打开浏览器,访问:

http://宿主机IP:9090

如果看到熟悉的 Tomcat 欢迎页面(带有猫的图标 🐱),说明 Tomcat 启动成功!

注意,这里从外部浏览器访问时,宿主机需要打开9090端口的防火墙:

#查看开放的端口号
firewall-cmd --zone=public --list-ports#开发防火墙的9090端口号
firewall-cmd --zone=public --add-port=9090/tcp --permanent#重新加载
firewall-cmd --reload

6. 挂载项目并访问测试页面

6.1 本地创建测试项目目录结构

进入你宿主机上的挂载路径 /home/perry/build/tomcat/test,构建一个最基本的 JSP 项目结构:

cd /home/perry/build/tomcat/test
mkdir WEB-INF

首先,在/home/perry/build/tomcat/test目录下创建文件index.jsp,内容为:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Tomcat JSP Test</title>
</head>
<body><h1>Hello, Tomcat is working!</h1><p>当前时间是:<%= new java.util.Date() %></p>
</body>
</html>

然后,在/home/perry/build/tomcat/test/WEB-INF目录下创建文件web.xml,内容为:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><display-name>Test App</display-name></web-app>

6.2 访问测试项目

此时,该目录被挂载到了容器的/usr/local/apache-tomcat-9.0.22/webapps/test目录下,你可以通过命令docker exec -it 运行的diytomcat容器id /bin/bash进入容器内,然后查看目录中的文件是否进行了映射。

Tomcat 会自动加载/usr/local/apache-tomcat-9.0.22/webapps/test该目录作为一个 Web 应用。
打开浏览器,访问地址:

http://宿主机IP:9090/test

如果你看到:

Hello, Tomcat is working!
当前时间是:...

说明你的 JSP 项目部署成功 🎉!

7. 总结

通过这次 Tomcat 镜像实战,我们完成了以下关键步骤:

步骤内容
1准备 JDK 和 Tomcat 安装包,以及 Dockerfile
2编写 Dockerfile,基于 CentOS 安装 Tomcat 与 JDK
3解决 CentOS 源失效问题,成功构建镜像
4使用 docker run 启动容器,完成端口映射与目录挂载
5在本地挂载目录中构建 JSP 测试项目
6通过浏览器访问测试页面,验证部署成功

整个过程帮助我们掌握了 Dockerfile 的编写、镜像构建、容器运行、挂载机制、JSP 项目部署等核心技能。如果对你有帮助的化,点赞+收藏,谢谢!

http://www.xdnf.cn/news/14978.html

相关文章:

  • day47-tomcat
  • 《Spring 中上下文传递的那些事儿》Part 4:分布式链路追踪 —— Sleuth + Zipkin 实践
  • Python 闭包(Closure)实战总结
  • 【PyCharm 2025.1.2配置debug】
  • 分类树查询性能优化:从 2 秒到 0.1 秒的技术蜕变之路
  • 低代码实战训练营教学大纲 (10天)
  • [特殊字符] 电子机械制动(EMB)产业全景分析:从技术演进到千亿市场爆发
  • 网络编程学习路线图
  • Python 爬虫实战 | 国家医保
  • OpenBayes 教程上新丨医疗VLM新突破!HealthGPT对复杂MRI模态理解准确率达99.7%,单一模型可处理多类生成任务
  • 一天两道力扣(1)
  • 高效打字辅助工具,解决符号输入难题
  • 使用pdf box去水印
  • Part 0:射影几何,变换与估计-第三章:3D射影几何与变换
  • 分享|大数据分析师职业技术证书报考指南
  • 推荐系统中如果有一个上古精排模型,后续如何优化?
  • 遇到该问题:kex_exchange_identification: read: Connection reset`的解决办法
  • github在线图床
  • PostgreSQL中的rank()窗口函数:实用指南与示例
  • 浏览器原生控件上传PDF导致hash值不同
  • 制作一款打飞机游戏76:分数显示
  • 微软广告推出新的精细资产级别审核
  • 无代码自动化测试工具介绍
  • SpringBoot控制反转
  • CentOS 6操作系统安装
  • 05.SpringBoot拦截器的使用详解
  • 玄机——某学校系统中挖矿病毒应急排查
  • 人脸活体识别3:C/C++实现人脸眨眼 张嘴 点头 摇头识别(可实时检测)
  • lerobot 工程笔记(一)——使用smolvla控制so101
  • 【AI落地应用实战】AIGC赋能职场PPT汇报:从效率工具到辅助优化