You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的启动日志,排查是否有部署失败的具体错误:
    docker logs <容器ID>
    
    常见问题包括:类加载异常、web.xml配置错误、依赖缺失等。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 11:48:20