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 小时前
【docker基础】第一课、从零开始理解容器技术
docker·云原生·容器·eureka
萌萌哒草头将军2 小时前
CloudDock(云仓):新一代开源NAS网络代理工具
服务器·网络协议·docker
正经教主5 小时前
【docker基础】0、系统学习docker之总计划
学习·docker·容器
Yang三少喜欢撸铁5 小时前
【Centos7通过kubeadm方式部署kubernetes1.30版本【一主两从】】
docker·kubernetes·container
杨浦老苏8 小时前
开源宠物健康护理追踪器EinVault
docker·群晖·宠物·健康管理
@土豆8 小时前
基于Docker部署Squid正向代理文档
运维·docker·容器
林润庚8 小时前
win 安装openclaw (docker镜像模式),解决18789访问失败问题
docker·openclaw·龙虾
正经教主10 小时前
【docker基础】Ubuntu 安装 Docker 超详细小白教程
ubuntu·docker·eureka
小江的记录本11 小时前
【Swagger】Swagger系统性知识体系全方位结构化总结
java·前端·后端·python·mysql·spring·docker
正经教主11 小时前
【docker基础】第二课:安装、配置与基础命令
docker·容器·eureka