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 项目部署等核心技能。如果对你有帮助的化,点赞+收藏,谢谢!