Docker部署Node.js连接MongoDB遇ECONNREFUSED错误求助
问题排查与修复方案
核心问题分析
你遇到的MongoServerSelectionError: connect ECONNREFUSED错误,根源在于两处端口配置错误,以及容器间通信逻辑的误解:
1. 修正Mongo容器的端口映射配置
Mongo镜像默认监听端口是27017,但你的docker-compose中错误地写为2716,导致容器内的Mongo服务无法被正确访问。
修改docker-compose的mongo服务配置:
version: '3.8' services: mongo: image: mongo environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: root ports: - "2617:27017" # 宿主机端口2617映射到容器内部默认的27017 web: build: context: . ports: - "8080:8080" environment: NODE_ENV: production depends_on: - mongo
2. 修正Node应用的Mongo连接端口
在Docker Compose的内部网络中,web容器连接mongo服务时,必须使用容器内部的端口(27017),而非宿主机的映射端口(2617)。端口映射仅用于宿主机外部访问Mongo,容器间通信直接用服务内部端口。
修改.env文件中的DB_PORT:
BASE_URL=http://localhost:8080 MONGO_INITDB_ROOT_USERNAME=root MONGO_INITDB_ROOT_PASSWORD=root DB_HOST=mongo DB_PORT=27017 # 改为容器内部的Mongo默认端口 DB_NAME=ptcgp
修改后生成的正确连接字符串为:
mongodb://root:root@mongo:27017/ptcgp?retryWrites=true&writeConcern=majority&authSource=admin
3. 可选优化:确保Mongo服务就绪后启动应用
depends_on仅保证容器启动顺序,不确保Mongo服务完全就绪。添加健康检查可避免应用在Mongo未初始化完成时发起连接:
mongo: image: mongo environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: root ports: - "2617:27017" healthcheck: test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"] interval: 5s timeout: 5s retries: 5 web: build: context: . ports: - "8080:8080" environment: NODE_ENV: production depends_on: mongo: condition: service_healthy # 等待Mongo健康检查通过后启动
内容的提问来源于stack exchange,提问作者Masiar
相关产品推荐
相关产品推荐

