Dockerfile制作Tomcat镜像

一、前置准备

  1. 下载所需安装包(放到 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);
  2. 目录结构示例:

    复制代码
    /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 路径错误、端口被占用)。


六、避坑指南

  1. JDK/Tomcat 包名错误 :Dockerfile 中的 jdk-8u381-linux-x64.tar.gz 要和实际下载的包名完全一致,否则会报「文件找不到」;
  2. 容器启动后立即退出 :必须用 catalina.sh run 前台启动,不能用 startup.sh(后台启动会导致容器主进程退出);
  3. 端口被占用 :若宿主机 8080 被占用,运行时改端口(如 -p 8081:8080);
  4. 权限问题 :启动脚本无执行权限时,加 chmod +x $CATALINA_HOME/bin/*.sh 解决。

总结

  1. 制作 Tomcat 镜像核心:先装 JDK(配置环境变量)→ 解压 Tomcat → 前台启动;
  2. 构建命令:docker build -t mytomcat:9.0 .,运行命令:docker run -d -p 8080:8080 --name tomcat01 mytomcat:9.0
  3. 关键避坑:用 catalina.sh run 前台启动,确保 JDK/Tomcat 包名和 Dockerfile 一致。
相关推荐
胡斌附体2 小时前
MySQL 在 Docker 环境下连接变慢问题记录
数据库·mysql·docker·连接··本机·外部机器连接
cg_ssh2 小时前
MinIO docker 集群
运维·docker·容器
Wenhao.2 小时前
Docker 安装 neo4j
docker·容器·neo4j
★浅_忆3 小时前
docker入门基础命令
linux·运维·服务器·docker·容器
陈皮糖..3 小时前
docker-compose实验案例之基于docker容器化部署下 Flask+Redis 访问计数功能的实现与调优
linux·运维·redis·docker·微服务·flask·云计算
草木红3 小时前
docker 构建镜像时报 403 Forbidden
docker·容器
Wenhao.3 小时前
Docker 安装 Qdrant
运维·docker·容器
匀泪4 小时前
云原生(docker容器技术)
docker·云原生·容器
数据库小组12 小时前
10 分钟搞定!Docker 一键部署 NineData 社区版
数据库·docker·容器·database·数据库管理工具·ninedata·迁移工具