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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:05:37