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
相关产品推荐
相关产品推荐

