TOMCAT Docker 容器化部署指南

824次阅读
没有评论

共计 7752 个字符,预计需要花费 20 分钟才能阅读完成。

概述

Apache Tomcat(简称 Tomcat)是由 Apache 软件基金会开发的开源 Web 服务器和 Servlet 容器,它实现了 Java Servlet 和 JavaServer Pages(JSP)规范,为 Java 应用程序提供了一个纯 Java 的 HTTP Web 服务器运行环境。Tomcat 以其轻量、稳定和高效的特性,广泛应用于企业级 Java Web 应用的部署和运行。

随着容器化技术的普及,使用 Docker 部署 Tomcat 已成为主流方案之一。容器化部署不仅简化了环境配置,还提高了应用的可移植性和一致性。本文将详细介绍如何通过 Docker 快速部署 Tomcat,并提供生产环境下的最佳实践和故障排查指南。

环境准备

Docker 安装

在开始部署前,需确保目标服务器已安装 Docker 环境。推荐使用以下一键安装脚本,自动完成 Docker 及相关组件的安装和配置:

bash <(wget -qO- https://xuanyuan.cloud/docker.sh)

脚本执行完成后,可通过以下命令验证 Docker 是否安装成功:

docker --version  # 验证 Docker 引擎版本
docker compose version  # 验证 Docker Compose 版本

镜像准备

镜像信息说明

本文使用的 Tomcat 镜像为 Docker 官方维护的library/tomcat,该镜像包含多个版本标签,支持不同 Java 版本(JDK/JRE)和操作系统基础镜像。根据官方推荐及稳定性测试,建议使用标签jre25-temurin-noble,该版本基于 Eclipse Temurin JRE 25 和 Ubuntu Noble,具备良好的性能和安全性。

镜像拉取命令

根据轩辕镜像加速的规则,library/tomcat属于多段镜像名(包含斜杠 ”/”),因此采用以下拉取格式:

# 拉取推荐标签镜像
docker pull xxx.xuanyuan.run/library/tomcat:jre25-temurin-noble

# 验证镜像拉取结果
docker images | grep tomcat

若需使用其他版本,可通过官方标签页面查看所有可用标签:Tomcat 镜像标签列表。例如,拉取 JDK 25 版本的命令为:

docker pull xxx.xuanyuan.run/library/tomcat:jdk25-temurin-noble

容器部署

基本部署(快速启动)

如需快速验证 Tomcat 功能,可使用以下命令启动基础容器:

docker run -d \
  --name tomcat \
  -p 8080:8080 \
  xxx.xuanyuan.run/library/tomcat:jre25-temurin-noble

参数说明:

  • -d:后台运行容器
  • --name tomcat:指定容器名称为 ”tomcat”,便于后续管理
  • -p 8080:8080:将容器的 8080 端口映射到宿主机的 8080 端口(前者为宿主机端口,后者为容器端口)

高级部署(生产环境配置)

对于生产环境,建议进行以下配置优化:

1. 持久化数据卷挂载

为避免容器重启导致配置和数据丢失,需将关键目录挂载到宿主机:

# 创建宿主机挂载目录
mkdir -p /data/tomcat/{conf,logs,webapps}
chmod -R 755 /data/tomcat  # 确保权限正确

# 首次启动时从容器复制默认配置(仅需执行一次)docker run --rm \
  xxx.xuanyuan.run/library/tomcat:jre25-temurin-noble \
  bash -c "cp -r /usr/local/tomcat/conf/* /tmp/conf && cp -r /usr/local/tomcat/webapps.dist/* /tmp/webapps"
docker cp $(docker create xxx.xuanyuan.run/library/tomcat:jre25-temurin-noble):/usr/local/tomcat/conf /data/tomcat/
docker cp $(docker create xxx.xuanyuan.run/library/tomcat:jre25-temurin-noble):/usr/local/tomcat/webapps.dist /data/tomcat/webapps

# 启动容器并挂载目录
docker run -d \
  --name tomcat \
  -p 8080:8080 \
  -v /data/tomcat/conf:/usr/local/tomcat/conf \
  -v /data/tomcat/logs:/usr/local/tomcat/logs \
  -v /data/tomcat/webapps:/usr/local/tomcat/webapps \
  xxx.xuanyuan.run/library/tomcat:jre25-temurin-noble

挂载目录说明:

  • /data/tomcat/conf:Tomcat 配置文件目录,包含 server.xml、tomcat-users.xml 等
  • /data/tomcat/logs:日志目录,包含 catalina.out、access 日志等
  • /data/tomcat/webapps:Web 应用部署目录,存放 WAR 包或解压后的应用

2. 资源限制配置

为防止 Tomcat 容器过度占用宿主机资源,需设置 CPU 和内存限制:

docker run -d \
  --name tomcat \
  -p 8080:8080 \
  -v /data/tomcat/conf:/usr/local/tomcat/conf \
  -v /data/tomcat/logs:/usr/local/tomcat/logs \
  -v /data/tomcat/webapps:/usr/local/tomcat/webapps \
  --memory=2g \          # 限制最大内存为 2GB
  --memory-swap=2g \      # 限制内存 + 交换分区总和为 2GB(禁止使用交换分区)--cpus=1 \              # 限制 CPU 核心数为 1 核
  --restart=always \      # 容器退出时自动重启
  xxx.xuanyuan.run/library/tomcat:jre25-temurin-noble

3. 环境变量配置

通过环境变量自定义 Tomcat 运行参数,如 JVM 参数、时区等:

docker run -d \
  --name tomcat \
  -p 8080:8080 \
  -v /data/tomcat/conf:/usr/local/tomcat/conf \
  -v /data/tomcat/logs:/usr/local/tomcat/logs \
  -v /data/tomcat/webapps:/usr/local/tomcat/webapps \
  --memory=2g --cpus=1 --restart=always \
  -e TZ=Asia/Shanghai \  # 设置时区为上海
  -e JAVA_OPTS="-Xms1g -Xmx1g -XX:+UseG1GC" \  # JVM 参数:初始堆 1G,最大堆 1G,使用 G1 垃圾收集器
  xxx.xuanyuan.run/library/tomcat:jre25-temurin-noble

容器状态管理

常用容器管理命令:

# 查看容器运行状态
docker ps | grep tomcat

# 查看容器日志(实时输出)docker logs -f tomcat

# 进入容器内部
docker exec -it tomcat bash

# 停止容器
docker stop tomcat

# 重启容器
docker restart tomcat

# 删除容器(需先停止)docker rm tomcat

功能测试

基础访问测试

Tomcat 启动后,可通过以下方式验证服务可用性:

  1. 本地访问(宿主机内部):curl http://localhost:8080
  2. 远程访问 (通过浏览器或 curl):curl http://< 服务器 IP>:8080 注意:首次启动时,Tomcat 默认没有部署应用,访问会返回 404 错误页面,这是正常现象。需部署应用后才能看到具体内容。

应用部署测试

部署一个简单的测试应用(如 Tomcat 默认示例应用):

# 从容器内复制默认示例应用到 webapps 目录(若未通过数据卷挂载)docker exec -it tomcat cp -r /usr/local/tomcat/webapps.dist/* /usr/local/tomcat/webapps/

# 或通过宿主机直接复制(已挂载数据卷时)cp -r /data/tomcat/webapps.dist/* /data/tomcat/webapps/

此时再次访问http://< 服务器 IP>:8080,将显示 Tomcat 默认欢迎页面。点击 ”Manager App” 可进入应用管理界面(需先配置用户权限)。

管理界面访问配置

Tomcat 管理界面(Manager App、Host Manager)默认未启用用户认证,需通过 tomcat-users.xml 配置:

  1. 编辑宿主机上的配置文件:vi /data/tomcat/conf/tomcat-users.xml
  2. <tomcat-users> 标签内添加以下内容:<role rolename="manager-gui"/> <role rolename="admin-gui"/> <user username="admin" password="your_secure_password" roles="manager-gui,admin-gui"/>
  3. 重启 Tomcat 容器:docker restart tomcat
  4. 访问管理界面:
    • Manager App:http://< 服务器 IP>:8080/manager/html
    • Host Manager:http://< 服务器 IP>:8080/host-manager/html

生产环境建议

安全加固

  1. 删除默认应用:生产环境中应删除 webapps 下的默认应用(如 docs、examples),仅保留业务应用:rm -rf /data/tomcat/webapps/{docs,examples,host-manager,manager}
  2. 限制管理界面访问 IP:编辑/data/tomcat/conf/Catalina/localhost/manager.xml,添加 IP 白名单:<Context privileged="true" antiResourceLocking="false" docBase="${catalina.home}/webapps/manager"> <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192\.168\.1\.\d+"/> </Context>
  3. 修改默认端口:避免使用 8080 等常见端口,降低被扫描风险。编辑/data/tomcat/conf/server.xml<Connector port="8888" protocol="HTTP/1.1" # 修改为自定义端口(如 8888)connectionTimeout="20000" redirectPort="8443" />
  4. 启用 HTTPS:通过 Let’s Encrypt 获取免费证书,并配置 SSL 连接器(详见官方文档)。

性能优化

  1. JVM 参数调优:根据服务器内存和业务需求调整 JVM 参数,例如:-e JAVA_OPTS="-Xms2g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=4"
    • -Xms/-Xmx:初始 / 最大堆内存(建议设为相同值避免内存抖动)
    • -XX:+UseG1GC:使用 G1 垃圾收集器(适合多 CPU 环境)
    • -XX:MaxGCPauseMillis:目标最大 GC 停顿时间(毫秒)
  2. 线程池配置 :编辑server.xml 调整连接器线程池:<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxThreads="200" # 最大线程数 minSpareThreads="20" # 最小空闲线程数 acceptCount="100" # 最大等待队列长度 enableLookups="false"/> # 禁用 DNS 查询
  3. 开启压缩:启用 HTTP 响应压缩减少网络传输量:<Connector ... compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/css,application/javascript"/>

监控与日志

  1. 日志收集:推荐使用 ELK Stack 或 Promtail+Loki 收集 Tomcat 日志,配置示例(挂载日志目录):-v /data/tomcat/logs:/usr/local/tomcat/logs # 已在生产部署中包含
  2. JVM 监控:暴露 JMX 端口以便监控工具(如 JConsole、Prometheus+Grafana)接入:-e JAVA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 \ -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.ssl=false \ -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=< 服务器 IP>" \ -p 9010:9010 # 映射 JMX 端口
  3. 健康检查:配置 Docker 健康检查:docker run -d \ --name tomcat \ --health-cmd "curl -f http://localhost:8080/ || exit 1" \ --health-interval=30s \ --health-timeout=10s \ --health-retries=3 \ ... # 其他参数

故障排查

常见问题及解决方法

1. 容器启动失败

现象 docker ps 未显示 tomcat 容器,或 docker logs tomcat 显示启动错误。

排查步骤

# 查看详细启动日志
docker logs tomcat

# 检查端口占用
netstat -tulpn | grep 8080  # 若端口已被占用,需更换宿主机映射端口

# 检查挂载目录权限
ls -ld /data/tomcat /data/tomcat/conf  # 确保权限为 755,属主为 root(或与容器内用户一致)

典型解决方法

  • 端口冲突:修改 -p 参数中的宿主机端口(如-p 8081:8080
  • 权限问题:调整宿主机目录权限:chmod -R 777 /data/tomcat(测试环境)或正确配置 UID 映射(生产环境)
  • 配置文件错误:还原默认配置文件,重新修改

2. 应用部署后无法访问

现象 :应用 WAR 包已放入 webapps 目录,但访问http://<IP>:8080/< 应用名 > 提示 404。

排查步骤

# 检查应用是否正确解压
docker exec -it tomcat ls -l /usr/local/tomcat/webapps/< 应用名 >

# 查看应用日志(若应用有独立日志)tail -f /data/tomcat/logs/< 应用名 >.log

# 查看 Tomcat 部署日志
grep "< 应用名 >" /data/tomcat/logs/catalina.out

典型解决方法

  • 应用未解压:检查 WAR 包权限,确保 Tomcat 有读取权限
  • 应用依赖缺失:确认应用所需的 Java 版本与 Tomcat 镜像的 Java 版本匹配(如 JRE/JDK 差异)
  • 配置错误:检查应用内的 web.xml 配置是否正确

3. 内存溢出(OOM)

现象:Tomcat 频繁重启,日志中出现java.lang.OutOfMemoryError

排查步骤

# 查看 JVM 参数配置
docker exec -it tomcat echo $JAVA_OPTS

# 分析 GC 日志(需先配置 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/usr/local/tomcat/logs/gc.log)tail -f /data/tomcat/logs/gc.log

典型解决方法

  • 增加 JVM 内存:调整 -Xms-Xmx参数(如-Xms4g -Xmx4g
  • 优化应用内存使用:检查应用是否存在内存泄漏,使用 JProfiler 等工具分析
  • 启用 GC 日志:添加 JVM 参数-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/usr/local/tomcat/logs/gc.log,进一步分析 GC 情况

4. 访问管理界面提示 403

现象:输入正确用户名密码后,管理界面提示 ”403 Access Denied”。

解决方法

  • 检查 tomcat-users.xml 是否正确配置了 manager-guiadmin-gui角色
  • 确认客户端 IP 在 manager.xml 的 IP 白名单中(参考 ” 安全加固 ” 章节)
  • 清除浏览器缓存或使用无痕模式访问

参考资源

  1. 官方文档
  2. 版本与标签
  3. 最佳实践

总结

本文详细介绍了 TOMCAT 的 Docker 容器化部署方案,从环境准备、镜像拉取、容器部署到功能测试、生产优化及故障排查,提供了一套完整的企业级部署指南。通过 Docker 和轩辕镜像加速,可大幅简化 Tomcat 的部署流程,同时确保环境一致性和可移植性。

关键要点

  • 使用轩辕一键脚本可快速完成 Docker 环境部署和镜像加速配置,无需手动修改配置文件
  • Tomcat 镜像拉取需遵循多段镜像名规则,正确命令为docker pull xxx.xuanyuan.run/library/tomcat:{TAG}
  • 生产环境必须配置数据卷挂载、资源限制和用户认证,避免数据丢失和安全风险
  • 性能优化的核心是合理配置 JVM 参数和 Tomcat 线程池,需根据业务负载动态调整

后续建议

  • 深入学习 Tomcat 高级特性,如集群部署、负载均衡和 Session 共享,满足高可用需求
  • 根据业务场景定制监控方案,结合 Prometheus+Grafana 实现性能指标可视化和告警
  • 定期关注 Tomcat 官方安全公告,及时更新镜像标签以修复已知漏洞
  • 考虑使用 Docker Compose 或 Kubernetes 管理多实例部署,提升运维效率

参考链接

正文完
 0
轩源
版权声明:本站原创文章,由 轩源 于2025-11-14发表,共计7752字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
支持作者

☝️用微信请我喝杯咖啡☕️

😛如果文章对您有用,请支持作者😛

支持作者

☝️用支付宝请我喝杯奶茶🧋

评论(没有评论)