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.1
或 localhost
例如,在下面的 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]”