SpringBoot API本地正常,Docker端口映射后访问出现404问题求助
容器端口映射访问SpringBoot API失败排查请求
本地直接访问http://localhost:8080/api/categories可正常获取响应,但通过Docker端口映射访问http://localhost:9090/api/categories时出现Whitelabel Error Page,容器日志显示:
No mapping for GET /api/categories
相关配置代码
Dockerfile
FROM openjdk:17-alpine EXPOSE 8080 ADD target/spring-boot-ecommerce.jar spring-boot-ecommerce.jar ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.7.3/wait /wait RUN chmod +x /wait ENTRYPOINT ["java", "-jar", "spring-boot-ecommerce.jar"]
docker-compose端口配置
ports: - '9090:8080'
Controller类代码
@RestController @CrossOrigin(origins = "http://localhost:4200") @RequestMapping("/api/categories") public class CategoryController{ ... }
Controller方法代码
@GetMapping() public ResponseEntity<?> getAllCategories() { ... }
更新信息
- 本地访问API的请求截图:

- 通过Docker端口访问的请求截图:

排查方向
- 确保容器使用最新Jar包
本地能正常运行说明本地target/spring-boot-ecommerce.jar没问题,但镜像内的Jar可能不是最新版本。重新构建镜像时添加--no-cache参数强制更新:
docker-compose build --no-cache
- 验证容器内SpringBoot实际启动端口
虽然Dockerfile声明了EXPOSE 8080,但SpringBoot可能被配置为其他端口启动。进入容器检查:
# 替换container_name为你的容器名称 docker exec -it container_name sh # 查看配置文件中的端口 cat application.properties | grep server.port # 或直接查看启动日志里的端口信息
如果端口不是8080,需修改docker-compose的端口映射规则,或调整SpringBoot配置文件中的server.port为8080。
核对请求路径的一致性
仔细对比本地和Docker访问的请求路径,确认没有大小写错误、额外空格或冗余参数,保证路径完全匹配/api/categories。检查SpringBoot组件加载情况
查看容器完整启动日志:
docker logs container_name
确认CategoryController是否被正确扫描加载,是否存在@ComponentScan配置错误导致Controller未注册。
- 测试容器内部API访问
进入容器后用curl直接访问内部端口:
curl http://localhost:8080/api/categories
如果内部访问也失败,说明问题出在容器内的SpringBoot应用本身;如果内部访问正常,再用docker ps检查端口映射是否生效,确认9090端口已正确绑定到容器的8080端口。
内容的提问来源于stack exchange,提问作者coder87
相关产品推荐
相关产品推荐

