Docker部署Tomcat容器运行Servlet时出现HTTP 404错误求助
Tomcat9 Docker容器部署WAR后访问出现404错误
错误信息
HTTP Status 404 – Not Found
The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.
访问地址:http://ec2-18-188-198-18.us-east-2.compute.amazonaws.com:8085
环境与配置
- 运行环境:AWS EC2 Linux实例(基于Linux AMI),部署Docker运行容器
- Dockerfile内容:
FROM tomcat:9 COPY app.war /usr/local/tomcat/webapps/ EXPOSE 8080 CMD ["/usr/local/tomcat/bin/catalina.sh", "run"]
- Servlet代码示例(核心部分):
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @WebServlet("/") public class AdminLogin extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); // 后续业务代码省略 } }
已知情况:项目使用javax.servlet.*而非jakarta.servlet.*,明确Tomcat10会因API包名变更导致此类问题,但当前使用Tomcat9,排除该原因。
排查与解决方案
1. 验证端口映射与安全组配置
- 你访问的是8085端口,但Dockerfile暴露的是Tomcat默认的8080端口,需确认启动容器时是否执行了端口映射命令:
docker run -d -p 8085:8080 <镜像名> - 检查AWS EC2安全组,确保8085端口的入站规则已开放(允许你的访问IP或所有IP)。
2. 检查WAR包部署状态
- 进入容器查看webapps目录,确认WAR包是否被Tomcat自动解压:
docker exec -it <容器ID> ls /usr/local/tomcat/webapps- 如果没有出现
app文件夹(WAR包解压后的目录),说明WAR包损坏或Tomcat未触发自动解压:- 本地手动解压WAR包验证完整性,排除包损坏问题;
- 或修改Dockerfile,先解压WAR包再复制到webapps:
FROM tomcat:9 COPY app.war /tmp/ RUN unzip /tmp/app.war -d /usr/local/tomcat/webapps/app/ EXPOSE 8080 CMD ["/usr/local/tomcat/bin/catalina.sh", "run"]
- 如果没有出现
3. 修正上下文路径
- Tomcat默认会以WAR包的文件名作为上下文路径,如果你部署的是
app.war,那么实际访问路径应为:http://ec2-18-188-198-18.us-east-2.compute.amazonaws.com:8085/app/ - 若要直接通过根路径(
/)访问,需将WAR包重命名为ROOT.war,修改Dockerfile:FROM tomcat:9 COPY app.war /usr/local/tomcat/webapps/ROOT.war EXPOSE 8080 CMD ["/usr/local/tomcat/bin/catalina.sh", "run"]
4. 查看Tomcat日志定位问题
- 打印容器内Tomcat的启动日志,排查是否有部署失败的具体错误:
常见问题包括:类加载异常、web.xml配置错误、依赖缺失等。docker logs <容器ID>
5. 确认Servlet注解生效
- 检查项目的
web.xml文件,确保未禁用注解扫描:<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0" metadata-complete="false"> <!-- 必须为false才会扫描注解 --> </web-app> - 若使用Maven构建,确保ServletAPI依赖的范围为
provided,避免与Tomcat自带的API冲突:<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>
内容的提问来源于stack exchange,提问作者KP Singh
相关产品推荐
相关产品推荐

