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

Docker环境下SpringBoot集成MongoDB连接失败配置求助

解决Docker中Spring Boot连接MongoDB的MongoSocketOpenException问题

一、先检查docker-compose.yml配置(关键)

容器间通信必须依赖同一网络,且MongoDB要允许外部容器访问。以下是包含Spring Boot、PostgreSQL、MongoDB的完整docker-compose.yml示例:

version: '3.8'

services:
  postgres:
    image: postgres:15-alpine
    container_name: postgres-db
    environment:
      POSTGRES_USER: your_postgres_user
      POSTGRES_PASSWORD: your_postgres_pass
      POSTGRES_DB: your_postgres_db
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - app-network

  mongodb:
    image: mongo:6-jammy
    container_name: mongodb-db
    environment:
      MONGO_INITDB_ROOT_USERNAME: your_mongo_user
      MONGO_INITDB_ROOT_PASSWORD: your_mongo_pass
      MONGO_INITDB_DATABASE: your_mongo_db
    ports:
      - "27017:27017"
    volumes:
      - mongo_data:/data/db
    networks:
      - app-network
    # 核心配置:允许所有IP访问(默认仅绑定127.0.0.1,容器内无法跨服务连接)
    command: ["mongod", "--bind_ip_all"]

  spring-boot-app:
    build: .
    container_name: spring-boot-service
    ports:
      - "8080:8080"
    environment:
      # PostgreSQL配置
      SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/your_postgres_db
      SPRING_DATASOURCE_USERNAME: your_postgres_user
      SPRING_DATASOURCE_PASSWORD: your_postgres_pass
      # MongoDB配置:用服务名`mongodb`而非localhost,容器间通过服务名通信
      SPRING_DATA_MONGODB_URI: mongodb://your_mongo_user:your_mongo_pass@mongodb:27017/your_mongo_db?authSource=admin
    depends_on:
      - postgres
      - mongodb
    networks:
      - app-network

volumes:
  postgres_data:
  mongo_data:

networks:
  app-network:
    driver: bridge

配置核心要点:

  • 三个服务必须加入同一app-network网络,容器间才能通过服务名(postgres/mongodb)通信
  • MongoDB必须添加command: ["mongod", "--bind_ip_all"],解除IP绑定限制
  • Spring Boot的MongoDB连接地址必须使用服务名mongodb,不能用localhost(容器内的localhost指向自身容器)

二、Spring Boot项目依赖配置(pom.xml)

确保引入MongoDB的starter依赖:

<dependencies>
    <!-- PostgreSQL相关 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- MongoDB相关 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

三、Spring Boot MongoDB CRUD代码示例

1. 实体类

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "users")
public class MongoUser {
    @Id
    private String id;
    private String name;
    private int age;

    // 构造函数、getter、setter
    public MongoUser(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 自动生成getter和setter即可
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
}

2. Repository接口

import org.springframework.data.mongodb.repository.MongoRepository;

public interface MongoUserRepository extends MongoRepository<MongoUser, String> {
}

3. API控制器

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MongoUserController {
    private final MongoUserRepository userRepository;

    // 构造注入
    public MongoUserController(MongoUserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @PostMapping("/mongo/users")
    public MongoUser createUser(@RequestBody MongoUser user) {
        return userRepository.save(user);
    }
}

四、常见问题排查步骤

如果仍出现连接错误,按以下顺序排查:

  1. 验证容器网络连通性:进入Spring Boot容器执行ping mongodb,如果不通,确认三个服务都在同一网络
    • 进入容器命令:docker exec -it spring-boot-service /bin/sh
  2. 测试MongoDB本地连接:在宿主机执行mongo mongodb://your_mongo_user:your_mongo_pass@localhost:27017/your_mongo_db,验证数据库本身是否可访问
  3. 检查认证参数:如果设置了MongoDB用户名密码,连接URI必须包含authSource=admin(默认用户存储在admin库)
  4. 查看MongoDB日志:执行docker logs mongodb-db,检查是否有IP绑定失败、认证错误等日志信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 12:40:20