Spring Boot连接Docker Compose部署的MongoDB端口映射异常排查
解决Spring Boot连接Docker MongoDB时的端口映射错误
问题重现
运行Spring Boot应用连接Docker Compose管理的MongoDB时,抛出错误:
java.lang.IllegalStateException: No host port mapping found for container port 27017
尽管docker-compose.yml中已将MongoDB配置为使用27018端口,且Spring Boot的application.yml也指向了localhost:27018。
可能的原因及解决方案
1. 检查Spring Boot配置是否被覆盖
Spring Boot配置存在优先级,可能有其他配置覆盖了application.yml的端口设置:
- 查看系统环境变量,确认是否存在
SPRING_DATA_MONGODB_PORT=27017,或SPRING_DATA_MONGODB_URI包含27017端口的情况。 - 检查环境特定配置文件(如
application-dev.yml),看是否重新设置了MongoDB端口。 - 排查代码中是否有硬编码的MongoClient配置,比如手动指定了27017端口:
// 错误示例:硬编码27017端口 MongoClient mongoClient = MongoClients.create("mongodb://admin:secret@localhost:27017/character_data");
2. 验证MongoDB容器是否真的在27018端口运行
确保Docker容器内的MongoDB确实监听27018端口:
- 执行命令查看容器内端口监听状态:
输出应显示docker exec character-media netstat -tulpn | grep mongod0.0.0.0:27018,说明Mongo在27018端口正常监听。 - 查看容器启动日志,确认端口配置生效:
日志中应包含类似docker logs character-mediawaiting for connections on port 27018的内容。如果没有,检查command: mongod --port 27018是否存在拼写错误。
3. 若Spring Boot也在Docker容器中运行
如果你的Spring Boot应用同样通过Docker Compose部署,不要用localhost连接MongoDB:
- 修改application.yml中的URI,使用Docker Compose服务名
mongo代替localhost:
Docker Compose会自动解析服务名到对应容器IP,内部通信无需依赖主机端口映射。spring: data: mongodb: uri: mongodb://admin:secret@mongo:27018/character_data
4. 检查是否使用了Testcontainers等测试工具
如果是测试环境出现该错误,可能是Testcontainers自动启动的Mongo容器默认用27017端口,需在测试配置中指定端口:
@Container public static MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:latest") .withExposedPorts(27018);
总结
先确认Mongo容器的端口配置是否生效,再排查Spring Boot的配置优先级问题,最后根据部署环境调整连接地址。
内容的提问来源于stack exchange,提问作者Maxwell
相关产品推荐
相关产品推荐

