一、前置准备
-
下载所需安装包(放到 Dockerfile 同目录):
- JDK 8 压缩包(推荐
jdk-8u381-linux-x64.tar.gz,可从 Oracle 官网 / 华为镜像站下载); - Tomcat 8/9 压缩包(推荐
apache-tomcat-9.0.80.tar.gz,下载地址:https://tomcat.apache.org/download-90.cgi);
- JDK 8 压缩包(推荐
-
目录结构示例:
/docker-tomcat/ ├── Dockerfile # 下面要写的构建文件 ├── jdk-8u381-linux-x64.tar.gz # JDK安装包 └── apache-tomcat-9.0.80.tar.gz # Tomcat安装包
二、完整 Dockerfile(Tomcat 9 + JDK 8)
# 基础镜像:CentOS 7
FROM centos:7
# 维护者信息
LABEL author="gaoyu" version="1.0" description="Tomcat 9 + JDK 8 镜像"
# 定义环境变量(后续可直接引用)
ENV JAVA_HOME /usr/local/jdk1.8.0_381
ENV CATALINA_HOME /usr/local/tomcat9
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/lib
# 设置工作目录
WORKDIR /usr/local
# 1. 安装基础工具(解决解压、网络问题)
RUN yum -y install wget tar vim net-tools && \
yum clean all # 清理yum缓存,减小镜像体积
# 2. 解压JDK并配置环境
ADD jdk-8u381-linux-x64.tar.gz /usr/local/
# 重命名JDK目录(避免版本号过长)
RUN mv /usr/local/jdk1.8.0_381 $JAVA_HOME
# 3. 解压Tomcat并配置
ADD apache-tomcat-9.0.80.tar.gz /usr/local/
RUN mv /usr/local/apache-tomcat-9.0.80 $CATALINA_HOME
# 4. 给Tomcat启动脚本添加执行权限
RUN chmod +x $CATALINA_HOME/bin/*.sh
# 5. 删除Tomcat默认的webapps(可选,减小镜像体积)
RUN rm -rf $CATALINA_HOME/webapps/*
# 6. 暴露Tomcat默认端口(8080)
EXPOSE 8080
# 7. 启动Tomcat(前台运行,避免容器退出)
CMD ["catalina.sh", "run"]
关键说明:
ADD会自动解压压缩包,比COPY更适合处理 tar.gz 文件;catalina.sh run是前台启动 Tomcat(必须!否则容器启动后会立即退出);- 删
webapps/*是可选操作,若需要默认页面(如 Tomcat 首页),可注释这行。
三、构建 Tomcat 镜像
1. 进入 Dockerfile 所在目录
cd /docker-tomcat
2. 执行构建命令
# 格式:docker build -t 镜像名:版本 .
docker build -t mytomcat:9.0 .
-t mytomcat:9.0:给镜像打标签,方便后续调用;.:表示构建上下文为当前目录(Docker 会读取该目录下的 JDK/Tomcat 包)。
3. 验证镜像是否构建成功
docker images | grep mytomcat
输出类似以下内容即成功:
mytomcat 9.0 xxxxxxxx 2 minutes ago 890MB
四、运行 Tomcat 容器
1. 基础运行(端口映射 + 后台运行)
docker run -d -p 8080:8080 --name tomcat01 mytomcat:9.0
-d:后台运行;-p 8080:8080:宿主机 8080 端口映射到容器 8080 端口;--name tomcat01:给容器命名,方便管理。
2. 进阶运行(挂载项目 + 数据持久化)
如果要部署自己的 WAR 包,可挂载宿主机目录到容器:
# 宿主机创建webapps目录,放入自己的WAR包(如demo.war)
mkdir -p /home/tomcat/webapps
# 运行容器,挂载webapps目录
docker run -d -p 8080:8080 \
-v /home/tomcat/webapps:/usr/local/tomcat9/webapps \
--name tomcat01 \
mytomcat:9.0
五、验证 Tomcat 是否正常运行
1. 查看容器状态
docker ps | grep tomcat01
状态为 Up 表示运行正常。
2. 访问 Tomcat 页面
打开浏览器,访问 http://宿主机IP:8080:
- 若没删
webapps,能看到 Tomcat 首页; - 若删了
webapps,需部署自己的 WAR 包(如demo.war),访问http://宿主机IP:8080/demo。
3. 查看 Tomcat 日志(排查问题)
docker logs tomcat01
若启动失败,日志会提示具体原因(如 JDK 路径错误、端口被占用)。
六、避坑指南
- JDK/Tomcat 包名错误 :Dockerfile 中的
jdk-8u381-linux-x64.tar.gz要和实际下载的包名完全一致,否则会报「文件找不到」; - 容器启动后立即退出 :必须用
catalina.sh run前台启动,不能用startup.sh(后台启动会导致容器主进程退出); - 端口被占用 :若宿主机 8080 被占用,运行时改端口(如
-p 8081:8080); - 权限问题 :启动脚本无执行权限时,加
chmod +x $CATALINA_HOME/bin/*.sh解决。
总结
- 制作 Tomcat 镜像核心:先装 JDK(配置环境变量)→ 解压 Tomcat → 前台启动;
- 构建命令:
docker build -t mytomcat:9.0 .,运行命令:docker run -d -p 8080:8080 --name tomcat01 mytomcat:9.0; - 关键避坑:用
catalina.sh run前台启动,确保 JDK/Tomcat 包名和 Dockerfile 一致。