Tomcat镜像实战:掌握Dockerfile的编写以及发布项目_dockerfile tomcat
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 所需软件
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 centosMAINTAINER perry <zhangsan@163.com># 拷贝本地文件到镜像中COPY readme.txt /usr/local/readme.txtADD 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/localWORKDIR $MYPATHENV JAVA_HOME /usr/local/jdk1.8.0_261ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22ENV 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:latest0.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 SIZEdiytomcat 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
--name
perrytomcat
-v
diytomcat
5.2 验证容器是否启动成功
docker ps
你应该能看到类似的输出:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES7e82be53abfb 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/testmkdir WEB-INF
首先,在/home/perry/build/tomcat/test
目录下创建文件index.jsp
,内容为:
<html><head> <title>Tomcat JSP Test</title></head><body> <h1>Hello, Tomcat is working!</h1> <p>当前时间是:</p></body></html>
然后,在/home/perry/build/tomcat/test/WEB-INF
目录下创建文件web.xml
,内容为:
<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 镜像实战,我们完成了以下关键步骤:
Dockerfile
Dockerfile
,基于 CentOS 安装 Tomcat 与 JDKdocker run
启动容器,完成端口映射与目录挂载整个过程帮助我们掌握了 Dockerfile 的编写、镜像构建、容器运行、挂载机制、JSP 项目部署等核心技能。如果对你有帮助的化,点赞+收藏,谢谢!