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

Docker Compose下MongoDB与Mongo-Express无法连接求助

MongoDB与Mongo-Express容器连接问题排查与解决

问题描述

作为Docker新手,我使用docker-compose配置了最新版MongoDB和Mongo-Express,但Mongo-Express始终无法连接MongoDB。开启Mongo-Express的重启功能后,容器陷入持续重启循环;尝试添加网络配置也未能解决问题。

原配置文件

version: "3"
services:
  mongodb:
    image: mongo
    ports:
      - "27017:27017"
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=password
    # networks:
    #   - mongo-network
  mongo-express:
    image: mongo-express
    # restart: on-failure
    ports:
      - "8081:8081"
    environment:
      - ME_CONFIG_MONGODB_ADMINUSERNAME=admin
      - ME_CONFIG_MONGODB_ADMINPASSWORD=password
      - ME_CONFIG_MONGODB_ADMINSERVER=mongodb
      - ME_CONFIG_MONGODB_PORT=27017
    # networks:
    #   - mongo-network
    depends_on:
      - mongodb

容器报错日志

2022-11-15 10:39:21 Welcome to mongo-express
2022-11-15 10:39:21 ------------------------
2022-11-15 10:39:21 
2022-11-15 10:39:21 
2022-11-15 10:39:21 (node:7) [MONGODB DRIVER] Warning: 当前服务器发现和监控引擎已弃用,将在未来版本中移除。要使用新的服务器发现和监控引擎,请向MongoClient构造函数传递选项 { useUnifiedTopology: true }。
2022-11-15 10:39:26 无法使用连接字符串 mongodb://mongo:27017 连接到数据库
2022-11-15 10:39:26 (node:7) UnhandledPromiseRejectionWarning: MongoNetworkError: 首次连接时无法连接到服务器 [mongo:27017] [Error: getaddrinfo EAI_AGAIN mongo
2022-11-15 10:39:26     在 GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:66:26) {
2022-11-15 10:39:26   name: 'MongoNetworkError'
2022-11-15 10:39:26 }]
2022-11-15 10:39:26     在 Pool.<anonymous> (/node_modules/mongodb/lib/core/topologies/server.js:441:11)
2022-11-15 10:39:26     在 Pool.emit (events.js:314:20)
2022-11-15 10:39:26     在 /node_modules/mongodb/lib/core/connection/pool.js:564:14
2022-11-15 10:39:26     在 /node_modules/mongodb/lib/core/connection/pool.js:1000:11
2022-11-15 10:39:26     在 /node_modules/mongodb/lib/core/connection/connect.js:32:7
2022-11-15 10:39:26     在 callback (/node_modules/mongodb/lib/core/connection/connect.js:300:5)
2022-11-15 10:39:26     在 Socket.<anonymous> (/node_modules/mongodb/lib/core/connection/connect.js:330:7)
2022-11-15 10:39:26     在 Object.onceWrapper (events.js:421:26)
2022-11-15 10:39:26     在 Socket.emit (events.js:314:20)
2022-11-15 10:39:26     在 emitErrorNT (internal/streams/destroy.js:92:8)
2022-11-15 10:39:26     在 emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
2022-11-15 10:39:26     在 processTicksAndRejections (internal/process/task_queues.js:84:21)
2022-11-15 10:39:26 (node:7) UnhandledPromiseRejectionWarning: 未处理的Promise拒绝。此错误要么源于在没有catch块的异步函数中抛出,要么源于未使用.catch()处理的Promise拒绝。要在未处理的Promise拒绝时终止Node.js进程,请使用CLI标志 `--unhandled-rejections=strict`。(拒绝ID: 1)
2022-11-15 10:39:26 (node:7) [DEP0018] 弃用警告:未处理的Promise拒绝已被弃用。未来,未处理的Promise拒绝将以非零退出代码终止Node.js进程。

问题分析

从报错日志可见,Mongo-Express尝试连接的地址是mongodb://mongo:27017,但配置中MongoDB服务名是mongodb,说明环境变量配置有误;同时depends_on仅保证容器启动顺序,无法确保MongoDB完成初始化,导致连接失败。

解决方案

1. 修正环境变量

Mongo-Express的ME_CONFIG_MONGODB_ADMINSERVER是过时变量,需替换为ME_CONFIG_MONGODB_SERVER,确保指向正确的MongoDB服务名。

2. 启用自定义网络

显式定义Docker网络,避免默认网络的DNS解析不稳定问题,保障容器间通信可靠。

3. 添加健康检查与启动依赖

给MongoDB添加健康检查,让Mongo-Express仅在MongoDB完全就绪后启动,避免因服务未初始化导致的连接失败。

修正后的配置文件

version: "3"
services:
  mongodb:
    image: mongo
    ports:
      - "27017:27017"
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=password
    networks:
      - mongo-network
    healthcheck:
      test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
      interval: 5s
      timeout: 5s
      retries: 5
  mongo-express:
    image: mongo-express
    restart: unless-stopped
    ports:
      - "8081:8081"
    environment:
      - ME_CONFIG_MONGODB_ADMINUSERNAME=admin
      - ME_CONFIG_MONGODB_ADMINPASSWORD=password
      - ME_CONFIG_MONGODB_SERVER=mongodb
      - ME_CONFIG_MONGODB_PORT=27017
    networks:
      - mongo-network
    depends_on:
      mongodb:
        condition: service_healthy

配置说明

  • 健康检查:MongoDB通过mongosh执行ping命令,确认服务就绪后才允许Mongo-Express启动
  • 重启策略:Mongo-Express设置为unless-stopped,故障恢复后自动重启,避免无意义的持续重启
  • 网络配置:自定义网络mongo-network确保容器间DNS解析稳定

内容的提问来源于stack exchange,提问作者Saurabh Sikoria

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:10:28