MongoDB on with Docker“failed to connect to server [localhost:27017] on first connect“

wqlqzqxt  于 2023-05-06  发布在  Docker
关注(0)|答案(5)|浏览(402)

我正在使用mongoDB和NodeJS后端。问题是我得到以下错误
node:16)UnhandledPromiseRejectionWarning:MongoNetworkError:无法在第一次连接时连接到服务器[localhost:27017][MongoNetworkError:connect ECONNREFUSED 127.0.0.1:27017]
这是我的docker-compose

version: '3.4'

services:
  db:
    image: mongo:latest
    ports:
      - '27017:27017'

  rest-api-node:
    build: .
    ports:
      - '5000:5000'
    links:
      - db
    restart: on-failure

我也试过depends_on,没有用。
在后端,我是mongoose作为与数据库通信的中间件。这是我的index.js部分

mongoose.Promise = global.Promise
mongoose.connect('mongodb://localhost/demo')
app.listen(port, () => console.log("live"))

我也试过使用promise,但没有改变。请帮帮我。先谢谢你了
完整错误日志
at Pool.(/app/node_modules/mongodb-core/lib/topologies/server.js:505:11)rest-api-node_1|at Pool.emit(events.js:180:13)rest-api-node_1|在连接。(/app/node_modules/mongodb-core/lib/connection/pool.js:329:12)rest-api-node_1|at Object.onceWrapper(events.js:272:13)rest-api-node_1|at Connection.emit(events.js:180:13)rest-api-node_1|at Socket.(/app/node_modules/mongodb-core/lib/connection/connection.js:245:50)rest-api-node_1|at Object.onceWrapper(events.js:272:13)rest-api-node_1|at Socket.emit(events.js:180:13)rest-api-node_1|at emitErrorNT(internal/streams/destroy.js:64:8)rest-api-node_1|at process._tickCallback(internal/process/next_tick.js:178:19)rest-api-node_1|name:'MongoNetworkError',rest-api-node_1|
消息:'第一次连接时无法连接到服务器[localhost:27017][MongoNetworkError:连接ECONNREFUSED 127.0.0.1:27017]' }

qgzx9mmu

qgzx9mmu1#

默认情况下,Compose为您的应用设置单个网络。服务的每个容器都加入默认网络,并且可以由该网络上的其他容器访问,并且可以在与容器名称相同的主机名下被它们发现。
根据您的docker-compose.yaml文件,您只能从主机访问127.0.0.1:27017上的mongo容器。为了从NodeJS后端容器访问它,你应该使用db:27017

ikfrs5lh

ikfrs5lh2#

我有同样的问题,其他的解决方案对我不起作用,但我这样做了

注意:

对于mongo URI,必须使用MongoDB service name,而不是127.0.0.1localhost
例如,在下面的docker-compose文件中,我的mongo服务名称是mongodb-myapp,我将URI更改为mongodb://mongodb-myapp:27017/myapp,它对我有效

services:
  boilerplate-api-app:
    build: .
    environment:
      - MONGO_URI=mongodb://mongodb-myapp:27017/myapp
    volumes:
      - .:/app
    ports:
      - "5000:5000"
    depends_on:
      - mongodb-myapp

 mongodb-myapp:
    image: mongo
    ports:
      - "27017:27017"
3htmauhk

3htmauhk3#

我也被困在这几个小时!在连接字符串中设置db:27017,在rest-api-node上设置restart: always,可确保连接到正确的IP,并确保节点服务器继续尝试连接到数据库。这对我很有效!

mmvthczy

mmvthczy4#

docker-compose.yaml

version: "3"
services:
  node-app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - PORT=3000
  mongo:
    image: mongo
    environment:
      - MONGO_INITDB_ROOT_USERNAME=imran
      - MONGO_INITDB_ROOT_PASSWORD=test_password
    volumes:
      - mongo-db:/data/db

volumes:
  mongo-db:

上面的代码是docker-compose.yaml文件,MongoDB的服务名称是'mongo'。您不必手动插入容器的IP地址。相反,只需在MongoDB URI中插入服务名称,如下面给出的示例代码:

const express = require("express");
const mongoose = require("mongoose");

const app = express();
mongoose
  .connect("mongodb://imran:test_password@mongo:27017/?authSource=admin")
  .then(() => {
    console.log("Successfully connected to the DB");
  })
  .catch((e) => {
    console.log(e);
  });

const port = process.env.PORT || 3000;

// routes
app.get("/", (req, res) => {
  res.send("<h1>Running on Container!</h1>");
});

app.listen(port, () => console.log(`listening on port ${port}`));
mbzjlibv

mbzjlibv5#

我遇到这个问题是因为MongoDB已经在端口27017上运行(本地,而不是在docker上),并且具有不同的凭据,这优先于在docker上运行的数据库。
在这种情况下,解决方案是杀死本地MongoDB或更改端口:

ports:
    - "27018:27017"

相关问题