在传统的 Java Web 项目部署中,我们通常需要手动安装 JDK、配置 Tomcat 环境变量、手动部署 WAR 包,部署过程繁琐、不可重复、环境易出错。而 Docker 的出现彻底改变了这一局面。
本博客将通过一个完整的 Tomcat 镜像构建与部署实例,带你逐步掌握以下技能:
通过这个实战,你将掌握一种更加现代、标准化的 Web 应用部署方式,特别适用于:
本实战适配于 Linux 环境(如 CentOS),当然也可以在 Windows 下的 WSL 或 MacOS Docker Desktop 中完成。
在构建 Tomcat 镜像之前,我们需要准备以下内容:
软件 | 说明 |
---|---|
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
建议在某个专用路径中创建一个新的目录用于构建镜像,例如:
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
请在 /home/perry/build/
目录中编辑名为 Dockerfile
的文件,写入以下内容:
FROM centos
MAINTAINER perry <[email protected]>
# 拷贝本地文件到镜像中
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 $MYPATH
ENV 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
:定义容器启动时执行的命令在完成 Dockerfile
编写后,我们就可以使用 Docker 构建出一个属于自己的 Tomcat 镜像了。
确保你当前位于 Dockerfile
所在目录,比如:
cd /home/perry/build
执行以下命令构建镜像:
docker build -t diytomcat .
其中:
-t diytomcat
:给构建出来的镜像命名为 diytomcat
.
:表示当前目录为构建上下文,会将该目录中的内容(包括 Dockerfile、JDK、Tomcat 包等)传给 Docker 引擎进行构建[+] 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
执行以下命令查看镜像:
docker images
示例输出:
REPOSITORY TAG IMAGE ID CREATED SIZE
diytomcat latest 97b35be0b8ea 2 minutes ago 665MB
至此,你已经完成了镜像构建,接下来将是如何运行这个镜像。
使用下面命令基于刚刚构建好的镜像 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 |
使用构建好的镜像运行容器 |
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
打开浏览器,访问:
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
进入你宿主机上的挂载路径 /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 Testtitle>
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
,内容为:
<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 Appdisplay-name>
web-app>
此时,该目录被挂载到了容器的/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 项目部署成功 !
通过这次 Tomcat 镜像实战,我们完成了以下关键步骤:
步骤 | 内容 |
---|---|
1 | 准备 JDK 和 Tomcat 安装包,以及 Dockerfile |
2 | 编写 Dockerfile ,基于 CentOS 安装 Tomcat 与 JDK |
3 | 解决 CentOS 源失效问题,成功构建镜像 |
4 | 使用 docker run 启动容器,完成端口映射与目录挂载 |
5 | 在本地挂载目录中构建 JSP 测试项目 |
6 | 通过浏览器访问测试页面,验证部署成功 |
整个过程帮助我们掌握了 Dockerfile 的编写、镜像构建、容器运行、挂载机制、JSP 项目部署等核心技能。如果对你有帮助的化,点赞+收藏,谢谢!