Dockerfile制作Tomcat镜像方式
作者: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 路径错误、端口被占用)。
六、避坑指南
- JDK/Tomcat 包名错误:Dockerfile 中的
jdk-8u381-linux-x64.tar.gz要和实际下载的包名完全一致,否则会报「文件找不到」; - 容器启动后立即退出:必须用
catalina.sh run前台启动,不能用startup.sh(后台启动会导致容器主进程退出); - 端口被占用:若宿主机 8080 被占用,运行时改端口(如
-p 8081:8080); - 权限问题:启动脚本无执行权限时,加
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 一致。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
