SpringBoot应用连接Docker化MongoDB遇域名解析失败问题求助
问题分析:SpringBoot连接Docker MongoDB失败报错MongoSocketException
问题描述
在Ubuntu 20.04系统上运行简单SpringBoot应用,相关配置如下:
pom.xml核心依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.4</version> <relativePath/> <!-- lookup parent from repository --> </parent> .... <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
application.properties配置
spring.data.mongodb.uri=mongodb://my_db:27017/test
文档与仓库定义
@Repository interface SomeDocumentRepository : CrudRepository<SomeDocument, String> @Document data class SomeDocument( @Id val id: String? = null, val name: String )
通过以下命令启动MongoDB容器:
docker run -d -p 27017:27017 --name my_db mongo:latest
启动SpringBoot应用时崩溃,报错:
com.mongodb.MongoSocketException: my_db: Temporary failure in name resolution
原因分析
核心问题是主机名解析失败:
- Docker容器的名称
my_db是Docker内部网络的专属主机名,只有处于同一个Docker网络中的容器才能通过这个名称互相访问。 - 你的SpringBoot应用是直接在Ubuntu宿主机上运行的,不属于Docker容器网络,宿主机的DNS系统无法识别
my_db这个名称,自然连不上MongoDB。
解决方案
有两种实用的解决方式:
方式1:改用宿主机localhost连接(快速解决)
因为你已经通过-p 27017:27017把MongoDB的端口映射到了宿主机,直接用localhost替换配置里的my_db即可:
修改application.properties:
spring.data.mongodb.uri=mongodb://localhost:27017/test
方式2:统一Docker网络(适合容器化部署场景)
如果后续打算把SpringBoot也容器化,推荐用自定义Docker网络来实现服务间通信:
- 创建自定义Docker网络:
docker network create my-app-network
- 启动MongoDB容器时加入该网络:
docker run -d -p 27017:27017 --name my_db --network my-app-network mongo:latest
- 把SpringBoot应用打包成Docker镜像后,启动时加入同一个网络:
docker run -d --name my-spring-app --network my-app-network your-spring-boot-image:tag
此时application.properties里的my_db可以正常解析,无需修改配置。
内容的提问来源于stack exchange,提问作者Weeedooo
相关产品推荐
相关产品推荐

