Docker部署Tomcat中JAX-RS Rest服务访问报404错误求助
问题背景
你在Docker容器中部署Tomcat后,访问http://192.168.99.100:8080/rest/clients出现HTTP Status 404 – Not Found错误,但本地直接运行Tomcat时,通过http://localhost:8080/rest/clients能正常访问服务。你的docker-compose.yml片段如下:
version: '3' services: tomcat: container_name: tomcat_docker image: tomcat:latest environment: - TOMCAT_USERNAME=admin - TOMCAT_PASSWORD=secret ports: - 8080:8080 volumes: - /docker/AW317/Taskman...
下面是几个最可能的原因和对应的解决步骤:
1. 应用挂载路径错误(最常见)
官方Tomcat镜像的默认应用部署目录是/usr/local/tomcat/webapps,你需要确保本地的应用文件(war包或解压后的应用目录)正确挂载到这个路径下。
从你的volumes配置看路径不完整,补全后应该是这样:
volumes: # 如果是本地解压好的应用目录,挂载到webapps下的对应上下文路径 - /docker/AW317/Taskman:/usr/local/tomcat/webapps/Taskman # 或者如果是war包,直接挂载到webapps目录,Tomcat会自动解压 # - /docker/AW317/Taskman.war:/usr/local/tomcat/webapps/Taskman.war
- 如果你的应用是ROOT应用(本地访问时不需要上下文路径),要挂载到
webapps/ROOT目录:volumes: - /docker/AW317/Taskman:/usr/local/tomcat/webapps/ROOT
挂载完成后重启容器,访问路径要对应上下文:比如挂载到Taskman,就访问http://192.168.99.100:8080/Taskman/rest/clients;如果是ROOT,就用原来的路径。
2. 检查容器内应用是否正常部署
进入容器查看webapps目录,确认应用存在且已被Tomcat加载:
# 进入容器查看webapps内容 docker exec -it tomcat_docker ls -l /usr/local/tomcat/webapps
如果应用没被解压,可能是Tomcat自动部署未开启,或者文件权限有问题。可以手动查看Tomcat的部署日志定位问题:
docker exec -it tomcat_docker tail -f /usr/local/tomcat/logs/catalina.out
日志里会明确告诉你部署失败的具体原因(比如依赖缺失、配置文件错误等)。
3. 端口映射与宿主机IP验证
- 先确认容器内Tomcat的8080端口是否在监听:
docker exec -it tomcat_docker netstat -tulpn | grep 8080 - 再检查宿主机的8080端口是否被其他进程占用:
# Linux/macOS netstat -tulpn | grep 8080 # Windows netstat -ano | findstr :8080 - 另外,
192.168.99.100是Docker Machine的IP吗?如果用的是Docker Desktop(Windows/Mac),可以直接用localhost访问试试:http://localhost:8080/rest/clients,如果能访问,说明你用错了宿主机IP。
4. 容器内文件权限问题
如果挂载的应用目录/文件权限不对,Tomcat可能无法读取,导致部署失败。可以修改挂载时的权限:
volumes: - /docker/AW317/Taskman:/usr/local/tomcat/webapps/Taskman:ro
或者进入容器手动修改权限:
docker exec -it tomcat_docker chown -R tomcat:tomcat /usr/local/tomcat/webapps/Taskman
按照上面的步骤排查,应该能找到问题所在。如果还有疑问,可以把完整的docker-compose.yml和Tomcat日志片段贴出来,方便进一步分析。
内容的提问来源于stack exchange,提问作者vimalDev

