Docker容器中Spring Boot应用无法连接MongoDB容器
问题分析与解决方案
核心问题
从报错信息能看到,你的Spring Boot容器仍在尝试连接localhost:27017——容器内的localhost指向容器自身,而非MongoDB容器。你提到尝试过修改主机名为mongo或docker-mongo但无效,大概率是旧配置已经被打包进镜像,修改后没有重新构建镜像导致的。
报错信息翻译
2023-01-07 08:50:03.146 INFO 1 --- [localhost:27017] org.mongodb.driver.cluster : 连接服务器localhost:27017时,监控线程发生异常 wacaj | wacaj | com.mongodb.MongoSocketOpenException: 打开套接字时发生异常 wacaj | at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:70) ~[mongodb-driver-core-4.6.1.jar!/:na] wacaj | at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:180) ~[mongodb-driver-core-4.6.1.jar!/:na] wacaj | at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:193) ~[mongodb-driver-core-4.6.1.jar!/:na] wacaj | at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:157) ~[mongodb-driver-core-4.6.1.jar!/:na] wacaj | at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na] wacaj | 引起原因: java.net.ConnectException: 连接被拒绝 wacaj | at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na] wacaj | at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) ~[na:na] wacaj | at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:539) ~[na:na] wacaj | at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:594) ~[na:na] wacaj | at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) ~[na:na] wacaj | at java.base/java.net.Socket.connect(Socket.java:633) ~[na:na] wacaj | at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:107) ~[mongodb-driver-core-4.6.1.jar!/:na] wacaj | at com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:79) ~[mongodb-driver-core-4.6.1.jar!/:na] wacaj | at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65) ~[mongodb-driver-core-4.6.1.jar!/:na]
具体解决步骤
1. 修正Spring Boot配置
修改application.properties中的MongoDB主机为docker-compose服务名mongo:
spring.data.mongodb.port=27017 spring.data.mongodb.host=mongo
2. 重新构建Spring Boot镜像
因为之前的镜像包含旧的配置,必须重新构建:
docker-compose build wacaj_docker
3. 重启服务
用docker-compose重新启动所有服务:
docker-compose down && docker-compose up -d
4. 优化:确保MongoDB就绪后启动Spring Boot(可选)
depends_on仅保证启动顺序,不保证MongoDB完全就绪。可以给MongoDB添加健康检查,让Spring Boot等待MongoDB就绪后再启动:
修改docker-compose.yaml:
version: '3' services: mongo: image: mongo:latest container_name: docker-mongo ports: - "27017:27017" healthcheck: test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"] interval: 5s timeout: 5s retries: 5 wacaj_docker: image: wacaj depends_on: mongo: condition: service_healthy container_name: wacaj build: . ports: - "8080:8080"
验证逻辑
Docker Compose默认会为所有服务创建一个自定义网络,服务名(如mongo)会被解析为对应容器的IP,因此Spring Boot容器通过mongo:27017可以直接访问MongoDB容器,无需映射端口(映射端口仅用于宿主机访问)。
内容的提问来源于stack exchange,提问作者Vishal Poddar
相关产品推荐
相关产品推荐

