Azure容器组中Spring Boot应用无法解析MongoDB容器主机问题排查
我希望通过Azure容器组运行两个容器:一个是MongoDB容器,另一个是Spring Boot应用容器。Spring Boot应用已创建azstaging配置文件并配置MongoDB连接URL,构建镜像后推送至ACR;MongoDB镜像在容器组部署时从Docker Hub公共仓库拉取。
容器组创建成功且两个容器均正常启动,但Spring Boot容器启动日志显示连接MongoDB失败,报错信息为:
com.mongodb.MongoSocketException: mongodb-container: Name or service not known
容器组配置
apiVersion: 2019-12-01 location: centralus name: azUserProfileConainerGroup properties: containers: - name: mongodb-container properties: image: mongo:latest resources: requests: cpu: 1 memoryInGb: 1.5 ports: - port: 27017 environmentVariables: - name: MONGO_INITDB_ROOT_USERNAME value: az-userprofile_user - name: MONGO_INITDB_ROOT_PASSWORD value: az-userprofile_password - name: MONGO_INITDB_DATABASE value: az-userprofile-db - name: az-userprofile-containerinstance properties: image: azcontainerregistry2025.azurecr.io/az-userprofile-containerinstance:4.0.0 resources: requests: cpu: 1 memoryInGb: 1.5 ports: - port: 8080 environmentVariables: - name: SPRING_PROFILES_ACTIVE value: azstaging osType: Linux ipAddress: type: Public ports: - protocol: tcp port: 8080 imageRegistryCredentials: - server: azcontainerregistry2025.azurecr.io username: username password: password - server: index.docker.io username: username password: password tags: {exampleTag: tutorial} type: Microsoft.ContainerInstance/containerGroups
Spring Boot azstaging配置文件
spring.data.mongodb.uri=mongodb://az-userprofile_user:az-userprofile_password@mongodb-container:27017/az-userprofile-db?authSource=admin
根据文档说明,容器组内的容器处于同一网络,应可通过容器名称访问其他容器,但实际无法连接,请问我的配置存在什么问题?
1. 容器启动顺序与初始化延迟
这是最常见的原因:虽然容器组内的容器会同时启动,但MongoDB需要一定时间完成初始化并就绪,而Spring Boot应用启动速度更快,此时容器名称的DNS解析可能尚未完成,或者MongoDB还没准备好接受连接,导致解析失败。
解决方法:
- 添加启动等待逻辑:在Spring Boot容器的镜像中加入
wait-for-it.sh脚本,修改启动命令,等待MongoDB的27017端口可用后再启动应用。例如:./wait-for-it.sh mongodb-container:27017 -- java -jar your-spring-boot-app.jar - 启用Spring Boot连接重试:在
azstaging配置文件中添加MongoDB连接重试相关配置,让应用自动重试连接:spring.data.mongodb.connect-timeout=5000 spring.data.mongodb.socket-timeout=5000 spring.data.mongodb.max-wait-time=10000 spring.data.mongodb.retry-writes=true
2. 移除多余的Docker Hub凭证
你在imageRegistryCredentials中配置了index.docker.io的认证信息,但拉取Docker Hub上的公共MongoDB镜像不需要认证,这部分配置属于冗余,可能会带来潜在的干扰,建议移除:
imageRegistryCredentials: - server: azcontainerregistry2025.azurecr.io username: username password: password
3. 验证MongoDB容器的网络监听状态
查看MongoDB容器的启动日志,确认其监听地址为0.0.0.0:27017(而不是仅localhost),确保容器组内的Spring Boot容器可以访问。mongo:latest镜像默认会监听所有地址,这一步通常无需额外配置,但可以通过日志确认。
4. 手动指定DNS服务器(可选排查步骤)
如果上述方法无效,可以尝试在容器组配置中手动指定公共DNS服务器(如8.8.8.8),排查是否是默认DNS解析的问题:
properties: # 其他配置... dnsConfig: nameservers: - 8.8.8.8
内容的提问来源于stack exchange,提问作者springbootlearner

