Docker Compose部署MongoDB与mongo-express报无法通过连接串连接数据库错误
问题根因
你遇到的getaddrinfo EAI_AGAIN mongodb、UnknownHostException: mongodb属于Docker容器内网DNS解析失效,和MongoDB账号密码、服务初始化状态无关。3个月前正常运行现在突发故障,90%以上概率是你配置的外部网络异常导致的。
排查修复步骤
按优先级从高到低操作:
- 优先检查外部网络状态
你在compose中指定default网络为product-poc-project-net且设置了external: true,这类外部网络不会随docker compose up自动创建。如果之前手动创建的该网络被误删、Docker服务重启后网络配置损坏,所有服务启动后不会加入同一个内网,自然无法通过服务名mongodb解析到对应容器。
先执行命令确认网络是否存在:
如果命令无返回结果,说明网络确实丢失,手动创建即可:docker network ls | grep product-poc-project-net
如果网络存在,先清理旧容器和残留缓存再重新启动,避免旧容器绑定了错误的网络配置:docker network create product-poc-project-netdocker compose down -v docker compose up -d - 修正mongo-express连接配置
你当前配置的ME_CONFIG_MONGODB_URL末尾带了无效斜杠,且最新版mongo-express会优先读取该URL覆盖其他连接参数,建议修改为带认证源的正确格式,避免解析恢复后出现认证失败:ME_CONFIG_MONGODB_URL: mongodb://root:root@mongodb:27017/?authSource=admin - 优化Spring服务Mongo配置(网络修复后仍连不上再操作)
现有Spring配置未明确指定认证库,建议直接使用统一连接串避免参数拼接异常,替换application.properties中所有mongo相关配置为:spring.data.mongodb.uri=mongodb://root:root@mongodb:27017/LoggerActivity?authSource=admin - 补全启动顺序依赖(解决偶发启动失败问题)
默认的depends_on配置只会保证mongodb容器先启动,不会等待MongoDB服务真正就绪,可能出现依赖服务发起连接时mongodb还没完成初始化的问题。可以通过健康检查机制保证启动顺序:
先在mongodb服务下新增健康检查配置:
再修改loggermicroservice和mongo-express的依赖配置,改为等待mongodb健康检查通过再启动:mongodb: image: mongo:latest # 原有配置全部保留,新增以下段 healthcheck: test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet interval: 10s timeout: 5s retries: 5depends_on: mongodb: condition: service_healthy
验证方式
服务重启后,先进入mongo-express容器测试DNS解析是否正常:
docker exec -it mongo-express ping -c 3 mongodb
如果能正常返回mongodb容器的内网IP,说明解析已经恢复,再依次验证mongo-express页面访问、微服务接口调用即可。
内容的提问来源于stack exchange,提问作者SpicySandwich
相关产品推荐
相关产品推荐

