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

Docker部署Spring Boot连接MongoDB失败求助

Docker部署Spring Boot连接MongoDB失败问题分析与解决

核心问题原因

你的Spring Boot应用容器连接失败的根本原因是代码硬编码了MongoDB连接地址为localhost:27017:
在ProductsDAO的静态初始化代码中,直接写死了连接字符串,完全忽略了docker-compose中配置的spring.data.mongodb.host=mongodb环境变量。

容器内的localhost指向容器自身,而非MongoDB容器。而mongo-express能正常连接,是因为它正确读取了ME_CONFIG_MONGODB_SERVER: mongodb配置,用容器名称作为连接地址(Docker Compose会自动为同一网络内的容器解析域名)。

修复方案

方案一:改用Spring Boot自动配置的MongoClient(推荐)

放弃手动静态初始化MongoClient,让Spring根据配置自动注入,代码示例:

@Repository
public class ProductsDAO {
    private static final String COLLECTION_NAME = "products";
    private static final String DATABASE_NAME = "products";
    
    private final MongoCollection<Document> collection;

    // 由Spring自动注入配置好的MongoClient
    public ProductsDAO(MongoClient mongoClient) {
        this.collection = mongoClient.getDatabase(DATABASE_NAME).getCollection(COLLECTION_NAME);
    }

    public long numberOfProducts() {
        return collection.countDocuments();
    }
}

这样Spring会自动读取docker-compose中spring.data.mongodb.host=mongodb的配置,无需硬编码连接地址。

方案二:手动读取配置/环境变量创建MongoClient

如果必须保留手动初始化逻辑,修改代码读取环境变量或配置文件的连接地址:

public class ProductsDAO {
    private static final String COLLECTION_NAME = "products";
    private static final String DATABASE_NAME = "products";
    private static MongoClient mongoClient;
    private static MongoCollection<Document> collection;

    static {
        // 优先读取环境变量中的MongoDB连接地址
        String mongoUri = System.getenv("SPRING_DATA_MONGODB_URI");
        if (mongoUri == null) {
            // 本地开发 fallback
            mongoUri = "mongodb://localhost:27017";
        }
        MongoClientSettings settings = MongoClientSettings.builder()
                .applyConnectionString(new ConnectionString(mongoUri))
                .build();
        mongoClient = MongoClients.create(settings);
        collection = mongoClient.getDatabase(DATABASE_NAME).getCollection(COLLECTION_NAME);
    }

    public static long numberOfProducts() {
        return collection.countDocuments();
    }
}

同时在docker-compose的my-final-app服务中添加对应环境变量:

my-final-app:
  build: .
  restart: unless-stopped
  ports:
    - "8080:8080"
  environment:
    - spring.data.mongodb.host=mongodb
    - SPRING_DATA_MONGODB_URI=mongodb://mongodb:27017/
  depends_on:
    - mongodb

检查容器内连接MongoDB的方法

1. 验证容器网络连通性

进入Spring Boot应用容器:

docker exec -it my-final-app /bin/sh

(如果是Alpine镜像用/bin/sh,其他镜像可能用/bin/bash)

安装ping工具(Alpine环境):

apk add iputils

Ping MongoDB容器名称,测试网络可达性:

ping mongodb

能收到响应说明网络连通正常。

2. 测试MongoDB端口可达性

用curl测试MongoDB端口(MongoDB 3.0+支持HTTP探测):

curl http://mongodb:27017

返回It looks like you are trying to access MongoDB over HTTP on the native driver port.说明端口正常开放。

3. 用MongoDB客户端测试连接

如果容器内有MongoDB客户端(或安装),直接连接测试:

mongo mongodb://mongodb:27017

能成功进入MongoDB shell说明连接完全正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 07:44:57