docker-compose部署MERN应用时Mongoose连接Mongo容器报ECONNREFUSED错误
问题根因与修复方案
核心错误点
- 官方Mongo镜像默认内部监听端口为
27017,你所有配置中错误使用了27018作为容器内部端口,导致连接被拒绝 - 使用MongoDB root角色用户连接业务库时,未指定认证源
authSource=admin,会出现认证失败问题 - 本地运行正常是因为你本地Mongo实例自行修改为监听27018端口,和Docker容器内的默认配置不匹配
修复步骤
1. 修改docker-compose.yml中mongodb服务配置
修正端口映射与暴露配置:
version: '3.1' services: app: restart: always build: . ports: - 3000:3000 # links为废弃特性,同compose下服务默认网络互通,可直接删除该配置 # links: # - mongodb depends_on: - mongodb mongodb: image: mongo ports: # 左侧为宿主机映射端口,右侧为容器内部Mongo默认监听端口27017 - 27018:27017 expose: - "27017" environment: MONGO_INITDB_ROOT_USERNAME: admin MONGO_INITDB_ROOT_PASSWORD: password MONGO_INITDB_DATABASE: names mongo-express: image: mongo-express ports: - 8080:8081 depends_on: - mongodb environment: ME_CONFIG_MONGODB_ADMINUSERNAME: admin ME_CONFIG_MONGODB_ADMINPASSWORD: password ME_CONFIG_MONGODB_SERVER: mongodb restart: unless-stopped
2. 修改Mongoose连接配置
修正连接端口,新增认证源参数:
// 容器内网使用服务名mongodb+容器内部端口27017,新增authSource指定认证库为admin const mongoURI = `mongodb://${MONGOUN}:${MONGOPW}@mongodb:27017/names?authSource=admin`; mongoose.connect(mongoURI, { useUnifiedTopology: true, useNewUrlParser: true }) .then(() => { console.log('mongo connection established'); }) .catch((error) => { console.log(`mongo connect error on ${mongoURI}`); console.log(error); });
可选优化(解决启动顺序问题)
如果修改后仍偶发连接失败,是因为Node应用启动速度远快于Mongo初始化速度,可直接保留现有restart: always配置,应用会自动重试直到Mongo启动完成。
通用排查方向
- 进入容器内部验证网络连通性:执行
docker exec -it 你的app容器名 sh,先后执行ping mongodb验证域名解析、nc -zv mongodb 27017验证端口连通性 - 查看Mongo容器运行日志:执行
docker logs 你的mongodb容器名,确认Mongo启动是否正常、有无报错信息
内容的提问来源于stack exchange,提问作者membrain
相关产品推荐
相关产品推荐

