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

