Dockerfile制作Tomcat镜像方式

 更新时间:2026年03月18日 09:20:50   作者:returnthem  
这篇文章主要介绍了Dockerfile制作Tomcat镜像方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、前置准备

下载所需安装包(放到 Dockerfile 同目录):

  • JDK 8 压缩包(推荐 jdk-8u121-linux-x64.tar.gz,可从 Oracle 官网 / 华为镜像站下载);
  • Tomcat 8/9 压缩包(推荐 apache-tomcat-9.0.115.tar.gz,下载地址:https://tomcat.apache.org/download-90.cgi);

目录结构示例:

/docker-tomcat/
├── Dockerfile       # 下面要写的构建文件
├── jdk-8u121-linux-x64.tar.gz   # JDK安装包
└── apache-tomcat-9.0.115.tar.gz  # Tomcat安装包

二、完整 Dockerfile(Tomcat 9 + JDK 8)

FROM centos:7.9.2009

LABEL author="gaoyu" version="1.0" description="CentOS7 + JDK8 + Tomcat9.0.115"

# CentOS 7 yum源
RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak && \
    curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && \
    yum clean all && yum makecache && \
    yum -y install vim && yum clean all && rm -rf /var/cache/yum/*

# 复制/解压文件
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u121-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.115.tar.gz /usr/local/

# 配置环境变量
ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_121
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.115
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.115
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

# 给Tomcat脚本加执行权限
RUN chmod +x $CATALINA_HOME/bin/*.sh

EXPOSE 8080
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:1.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 9090:8080 --name gaoyutomcat \
  -v /home/gaoyu/build/tomcat/test:/usr/local/apache-tomcat-9.0.115/webapps/test \
  -v /home/gaoyu/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.115/logs \
  mytomcat:1.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 解决。

七、发布项目

由于做了卷挂载,只需要直接在本地编写项目就可以直接发布了

[root@localhost docker-tomcat]# cd ../
[root@localhost gaoyu]# ls
build  docker-tomcat
[root@localhost gaoyu]# cd build
[root@localhost build]# ls
tomcat
[root@localhost build]# cd ./tomcat
[root@localhost tomcat]# ls
test  tmcatlogs  tomcatlogs
[root@localhost tomcat]# cd ./test
[root@localhost test]# pwd
/home/gaoyu/build/tomcat/test
[root@localhost test]# mkdir WEB-INF
[root@localhost test]# ls
WEB-INF
[root@localhost test]# cd WEB-INF
[root@localhost WEB-INF]# vim web.xml
[root@localhost WEB-INF]# cd ..
[root@localhost test]# ls
WEB-INF
[root@localhost test]# vim index.jsp

总结

  • 制作 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 一致。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Docker v1.13.0 正式版发布

    Docker v1.13.0 正式版发布

    本文给大家分享的是Docker v1.13.0 正式版发布的信息,最近一直在学习docker中,所以关注的比较多,这里分享给大家
    2017-01-01
  • docker-compose部署coredns如何实现自建DNS服务

    docker-compose部署coredns如何实现自建DNS服务

    本文介绍了如何在内网中使用自建的CoreDNS服务进行域名解析,通过配置Corefile和hosts文件,实现内部域名解析,无需在互联网上注册域名,使用docker-compose运行CoreDNS,并通过修改resolv.conf文件配置DNS服务
    2025-01-01
  • docker容器环境安装及镜像基础操作

    docker容器环境安装及镜像基础操作

    容器是一种轻量级虚拟化技术,能够快速构建业务环境并便于业务迁移,解决兼容性问题,这篇文章主要介绍了docker容器环境安装及镜像基础操作,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-09-09
  • docker nginx 部署多个项目的示例方法

    docker nginx 部署多个项目的示例方法

    这篇文章主要介绍了docker nginx 部署多个项目的示例方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Docker容器的程序连接宿主机的MySQL全过程

    Docker容器的程序连接宿主机的MySQL全过程

    这篇文章主要介绍了Docker容器的程序连接宿主机的MySQL全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • docker部署钉钉机器人报警通知的实现

    docker部署钉钉机器人报警通知的实现

    本文主要介绍了docker部署钉钉机器人报警通知的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 详解docker 容器不自动退出结束运行的方法

    详解docker 容器不自动退出结束运行的方法

    本文主要简单介绍 docker 容器与前置进程的关系,以及如何编写 Dockerfile/docker-compose.yml 优雅的让容器可以常驻运行。具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Docker下Mysql8数据备份与恢复实现

    Docker下Mysql8数据备份与恢复实现

    文章主要介绍了如何在Docker中创建和管理MySQL容器,包括创建容器、连接数据库、备份和恢复数据库、设置定时备份以及解决常见问题
    2026-01-01
  • Docker的基本使用笔记

    Docker的基本使用笔记

    Docker是一种可以把应用程序自动部署到容器的开源引擎,他和虚拟化相比具有轻量和快速部署删除的特点,可以使软件开发偏向于微服务架构方向。从资源成本和管理方式上都比传统的虚拟化有着太多的优势,但是对运行环境的要求较高。
    2017-04-04
  • docker部署mysql 实现远程连接的示例代码

    docker部署mysql 实现远程连接的示例代码

    这篇文章主要介绍了docker部署mysql 实现远程连接的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09

最新评论