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

Spring Boot应用Docker部署时出现MongoSocketOpenException问题

解决Docker环境下Spring Boot连接Mongo的MongoSocketOpenException异常

核心排查方向及解决方案

1. 检查Spring Boot配置是否正确读取环境变量

本地运行时你大概率用localhost连接Mongo,但Docker容器内的localhost指向容器自身,而非Mongo容器。必须确保应用通过环境变量动态读取Mongo地址:

application.properties 配置示例:

spring.data.mongodb.uri=${MONGO_URL:mongodb://localhost:27017}

application.yml 配置示例:

spring:
  data:
    mongodb:
      uri: ${MONGO_URL:mongodb://localhost:27017}

如果配置里是硬编码的mongodb://localhost:27017,即使传入MONGO_URL环境变量也不会生效,这会导致Docker容器内尝试连接自身的27017端口,必然失败。

2. 避免Mongo未就绪时启动Spring Boot

Mongo启动需要时间完成初始化,若Spring Boot先于Mongo启动并发起连接,就会抛出连接异常。

  • 临时解决:手动等待Mongo启动完成——通过docker logs mongo查看日志,出现waiting for connections on port 27017时再启动myapp容器。
  • 长期解决:用Docker Compose配置健康检查,确保Spring Boot在Mongo就绪后启动,示例docker-compose.yml:
version: '3.8'
services:
  mongo:
    image: mongo
    networks:
      - mynet
    healthcheck:
      test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
      interval: 5s
      timeout: 5s
      retries: 5
  myapp:
    image: myapp
    ports:
      - "8088:8080"
    environment:
      - MONGO_URL=mongodb://mongo:27017
    networks:
      - mynet
    depends_on:
      mongo:
        condition: service_healthy

3. 验证容器网络一致性与连通性

从你提供的网络检查信息来看,网络名称是enote,但你启动容器时指定的是--network=mynet,这可能是名称不匹配导致容器未加入同一网络。先确认网络:

# 查看所有Docker网络
docker network ls

若实际网络是enote,启动容器时需改为--network=enote。

另外,可进入myapp容器手动验证连通性:

# 进入myapp容器
docker exec -it myapp /bin/bash

# 测试Mongo容器名的DNS解析
ping mongo

# 测试27017端口是否开放
telnet mongo 27017

如果ping不通或telnet失败,说明网络配置存在问题,需重新创建并指定正确的网络名称。

内容的提问来源于stack exchange,提问作者elgunssh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:12:52