MongoDB 与 Docker “首次连接时无法连接到服务器 [localhost:27017]”

Posted

技术标签:

【中文标题】MongoDB 与 Docker “首次连接时无法连接到服务器 [localhost:27017]”【英文标题】:MongoDB on with Docker "failed to connect to server [localhost:27017] on first connect " 【发布时间】:2018-12-03 07:48:43 【问题描述】:

我正在使用带有 NodeJS 后端的 mongoDB。问题是我收到以下错误

node:16) UnhandledPromiseRejectionWarning: MongoNetworkError: failed 在第一次连接时连接到服务器 [localhost:27017] [MongoNetworkError: 连接 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 ,但不起作用。

在后端,我是作为与 DB 通信的中间件的猫鼬。这是我index.js的一部分

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

我也尝试过使用 promise ,但没​​有任何变化。请帮帮我。 在此先感谢

完整的错误日志

在游泳池。 (/app/node_modules/mongodb-core/lib/topologies/server.js:505:11) 休息-api-node_1 |在 Pool.emit (events.js:180:13) rest-api-node_1 |在连接处。 (/app/node_modules/mongodb-core/lib/connection/pool.js:329:12) 休息-api-node_1 |在 Object.onceWrapper (events.js:272:13) 休息-api-node_1 |在 Connection.emit (events.js:180:13) 休息-api-node_1 |在套接字。 (/app/node_modules/mongodb-core/lib/connection/connection.js:245:50) 休息-api-node_1 |在 Object.onceWrapper (events.js:272:13) 休息-api-node_1 |在 Socket.emit (events.js:180:13) 休息-api-node_1 |在 emitErrorNT (内部/流/destroy.js:64:8)rest-api-node_1 |在 process._tickCallback (internal/process/next_tick.js:178:19) 休息-api-node_1 |名称:'MongoNetworkError',rest-api-node_1 | 消息:'第一次连接到服务器 [localhost:27017] 失败 连接 [MongoNetworkError: 连接 ECONNREFUSED 127.0.0.1:27017]'

【问题讨论】:

【参考方案1】:

默认情况下,Compose 会为您的应用设置单一网络。每个 服务的容器加入默认网络,并且两者都是 该网络上的其他容器可以访问,并且可以被该网络上的其他容器发现 它们的主机名与容器名称相同。

根据您的docker-compose.yaml 文件,您只能从主机访问127.0.0.1:27017 上的mongo 容器。 为了从 NodeJS 后端容器访问它,您应该使用 db:27017

【讨论】:

db:27017 是什么意思? 我相信这是 mongo 网址。我面临着同样的问题。容器内没有localhost。您必须将网址更改为mongodb://db:27017/demo。这解决了我的问题。 ERROR: The Compose file './docker-compose.yml' is invalid because: services.mongo.ports is invalid: Invalid port "db:27017", should be [[remote_ip:]remote_port[-remote_port]:]port[/protocol] -- 上述建议会导致此错误。我还尝试了我正在使用的数据库的名称。 @ChumiestBucket 我不明白你为什么对答案投了-1?您不需要在 docker-compose.yml 之上进行更改。当你改变它时,你得到了错误。我的帖子是关于应用程序设置的,我们在其中定义了 mongodb 容器的 url。它应该是 'db:27017' 而不是 'localhost:27017'。 如果您的 docker-compose 有用户名和密码,这将如何工作?【参考方案2】:

我有同样的问题,其他解决方案不适合我,但我是这样做的

注意:

对于 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"

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于MongoDB 与 Docker “首次连接时无法连接到服务器 [localhost:27017]”的主要内容,如果未能解决你的问题,请参考以下文章

MongoError:在 mongoDB atlas 中首次连接时无法连接服务

MongoError:在 mongoDB atlas 中首次连接时无法连接服务

Dockerizing NestJS APP 和 MongoDB “首次连接时无法连接到服务器 [localhost:27017]”

运行app.js文件时nodejs Mongodb错误

当我尝试在命令提示符下连接到 mongodb 时,它会显示错误如何解决?

无法将 MongoDB 与 NestJS ( Docker ) 连接