Docker容器中Tomcat Web应用加载失败:HTTP 404错误排查求助
环境配置
- Docker镜像:
interesting_picture:latest(4分钟前创建) - 容器名称:
beautiful_swartz - 端口映射:
0.0.0.0:8080->8080/tcp - 容器内Tomcat目录结构:
/usr/local/tomcat/webapps/ROOT/包含index.jsp、META-INF、prompt.jsp、result.jsp、WEB-INF - 本地Docker目录:包含
Dockerfile和应用包ROOT.war - 额外信息:
- Docker版本:
Docker version 27.1.1, build 6312585 - TomEE版本:TomEE 10.1.25
- 主机系统:macOS Ventura 13.3.1 (22E261)
- Docker版本:
问题描述
访问http://localhost:8080出现404错误,具体提示:
Type Status Report
Description The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.
Apache Tomcat/11.0.0-M24
已尝试操作
- 确认容器运行正常且端口映射正确
- 验证文件存在于指定目录
- 重启Docker容器
排查方向与解决方案
1. 版本不兼容问题
错误提示显示容器内运行的是Apache Tomcat/11.0.0-M24,但你声明使用的是TomEE 10.1.25(基于Tomcat 10)。Tomcat 11的Jakarta EE版本与TomEE 10不匹配,会导致WAR包部署失败。
解决: 检查Dockerfile的基础镜像,确保使用官方TomEE 10镜像,例如apache/tomee:10.1.25-jre17,而非Tomcat镜像。
2. WAR包部署异常
手动复制文件到ROOT目录可能缺失TomEE部署所需的元数据,或WAR包本身损坏导致解压不完整。
解决:
- 删除容器内
/usr/local/tomcat/webapps/ROOT/下的所有文件 - 将本地
ROOT.war复制到容器的/usr/local/tomcat/webapps/目录:docker cp ROOT.war beautiful_swartz:/usr/local/tomcat/webapps/ - 重启容器,让TomEE自动解压WAR包并部署
- 查看部署日志确认状态:
docker logs beautiful_swartz
3. 文件权限错误
容器内webapps/ROOT/下的文件权限可能不允许TomEE进程读取,导致无法加载资源。
解决:
进入容器调整权限(部分TomEE镜像运行用户为tomcat,需根据实际镜像调整):
docker exec -it beautiful_swartz chmod -R 755 /usr/local/tomcat/webapps/ROOT/ docker exec -it beautiful_swartz chown -R tomcat:tomcat /usr/local/tomcat/webapps/ROOT/
4. 上下文配置缺失
手动创建的ROOT目录可能缺少TomEE认可的上下文配置,导致无法识别为默认应用。
解决:
检查容器内/usr/local/tomcat/conf/Catalina/localhost/ROOT.xml是否存在,若不存在可创建基础配置:
<Context docBase="/usr/local/tomcat/webapps/ROOT" reloadable="true"/>
重启容器生效。
确保自定义JSP正确服务的通用步骤
- 确保WAR包结构完整:包含
WEB-INF/web.xml(即使使用Servlet 3.0+注解,也建议保留基础配置),JSP文件存放路径符合Web应用规范 - 优先使用官方TomEE镜像构建容器,避免自定义镜像时遗漏核心配置
- 部署时依赖TomEE自动解压WAR包的机制,而非手动复制文件
- 查看容器日志排查部署错误,重点关注JSP编译失败、类加载异常等信息
- 验证JSP编译状态:TomEE会将JSP编译为class文件存放在
/usr/local/tomcat/work/Catalina/localhost/ROOT/目录,若该目录无对应文件,说明JSP存在语法错误或编译权限问题
内容的提问来源于stack exchange,提问作者Sushi

