Docker化SpringBoot与MongoDB时遇MongoSocketOpenException及ConnectException
SpringBoot容器化连接MongoDB失败的解决方案
核心问题分析
你的配置存在三处关键错误:
- Docker Compose文件版本使用错误(误用了Docker Desktop版本号)
- SpringBoot配置的MongoDB用户名/密码与容器初始化的账号不匹配
- 网络连接配置未根据SpringBoot运行环境调整
修复步骤
1. 修正Docker Compose配置
将compose文件的版本改为规范的3.8,同时给Mongo容器映射本地端口(方便本地SpringBoot连接):
version: '3.8' services: mongo: image: mongo restart: always ports: - "27017:27017" environment: MONGO_INITDB_ROOT_USERNAME: nim MONGO_INITDB_ROOT_PASSWORD: 123 mongo-express: image: mongo-express restart: always ports: - 8081:8081 environment: ME_CONFIG_MONGODB_ADMINUSERNAME: nim ME_CONFIG_MONGODB_ADMINPASSWORD: 123 ME_CONFIG_MONGODB_URL: mongodb://nim:123@mongo:27017/
2. 统一MongoDB认证信息
Docker初始化的Mongo root账号是nim/123,但SpringBoot配置用了不匹配的nimasha/1234,修改application.properties:
spring.data.mongodb.authentication-database=admin spring.data.mongodb.username=nim spring.data.mongodb.password=123 spring.data.mongodb.database=StudentDBDocker spring.data.mongodb.port=27017
3. 调整网络连接配置
- 本地运行SpringBoot:保持
spring.data.mongodb.host=localhost,依赖已映射的27017端口连接容器内MongoDB。 - SpringBoot也容器化部署:将host改为Docker Compose服务名
mongo,并把SpringBoot服务加入compose文件(确保同网络):
# 在docker-compose.yml中新增SpringBoot服务 services: # ... 保留mongo、mongo-express配置 ... spring-boot-app: build: . restart: always ports: - "8080:8080" depends_on: - mongo environment: SPRING_DATA_MONGODB_HOST: mongo SPRING_DATA_MONGODB_USERNAME: nim SPRING_DATA_MONGODB_PASSWORD: 123
4. 重启服务生效
执行命令重启容器:
docker-compose down docker-compose up -d
再启动SpringBoot应用(本地或容器化)。
内容的提问来源于stack exchange,提问作者Nimasha Madhushani
相关产品推荐
相关产品推荐

