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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 00:13:13