node.js - docker 尝试连接 mongodb 时出错

标签 node.js bash mongodb

我想制作简单的restful API。我正在使用 docker 来执行此操作。这是我的Dockerfile :

FROM mongo:3.2
EXPOSE 3000
RUN apt-get update;  apt-get install curl -y
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash -
RUN apt-get install -y nodejs
ADD . . 
CMD node app.js

我的docker-compose.yml看起来像这样:

version: '2'
services:
  db:
    build: ../images/mongodb
    ports:
     - "27017:27017"
     - "3000:3000"

我的app.js文件看起来像这样:

var express = require('express')
var app = express()
var mongoose = require('mongoose');
mongoose.Promise = global.Promise;
mongoose.connect('mongodb://127.0.0.1:27017/sample');
app.get('/', function (req, res) {
  res.send('Hello World!')
})


app.listen(3000, function () {
  console.log('Example app listening on port 3000!')
})

运行时docker-compose up --build ,我遇到错误:

db_1       | Example app listening on port 3000!
db_1       | 
db_1       | events.js:160
db_1       |       throw er; // Unhandled 'error' event
db_1       |       ^
db_1       | MongoError: failed to connect to server [127.0.0.1:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]
db_1       |     at Pool.<anonymous> (/node_modules/mongodb-core/lib/topologies/server.js:327:35)
db_1       |     at emitOne (events.js:96:13)
db_1       |     at Pool.emit (events.js:188:7)
db_1       |     at Connection.<anonymous> (/node_modules/mongodb-core/lib/connection/pool.js:274:12)
db_1       |     at Connection.g (events.js:291:16)
db_1       |     at emitTwo (events.js:106:13)
db_1       |     at Connection.emit (events.js:191:7)
db_1       |     at Socket.<anonymous> (/node_modules/mongodb-core/lib/connection/connection.js:177:49)
db_1       |     at Socket.g (events.js:291:16)
db_1       |     at emitOne (events.js:96:13)
db_1       |     at Socket.emit (events.js:188:7)
db_1       |     at emitErrorNT (net.js:1281:8)
db_1       |     at _combinedTickCallback (internal/process/next_tick.js:80:11)
db_1       |     at process._tickCallback (internal/process/next_tick.js:104:9)

我尝试使用docker run -it mongo:3.2 /bin/bash进入docker机器

root@67062897d4f0:/# mongo
MongoDB shell version: 3.2.12
connecting to: test
2017-03-23T07:01:07.587+0000 W NETWORK  [thread1] Failed to connect to 127.0.0.1:27017, in(checking socket for error after poll), reason: errno:111 Connection refused
2017-03-23T07:01:07.588+0000 E QUERY    [thread1] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed :
connect@src/mongo/shell/mongo.js:229:14

root@67062897d4f0:/# mongod
2017-03-23T07:01:12.025+0000 I CONTROL  [initandlisten] MongoDB starting : pid=29 port=27017 dbpath=/data/db 64-bit host=67062897d4f0
2017-03-23T07:01:12.025+0000 I CONTROL  [initandlisten] db version v3.2.12
2017-03-23T07:01:12.025+0000 I CONTROL  [initandlisten] git version: ef3e1bc78e997f0d9f22f45aeb1d8e3b6ac14a14
2017-03-23T07:01:12.025+0000 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.1t  3 May 2016
2017-03-23T07:01:12.025+0000 I CONTROL  [initandlisten] allocator: tcmalloc
2017-03-23T07:01:12.025+0000 I CONTROL  [initandlisten] modules: none
2017-03-23T07:01:12.025+0000 I CONTROL  [initandlisten] build environment:
2017-03-23T07:01:12.025+0000 I CONTROL  [initandlisten]     distmod: debian81
2017-03-23T07:01:12.025+0000 I CONTROL  [initandlisten]     distarch: x86_64
2017-03-23T07:01:12.025+0000 I CONTROL  [initandlisten]     target_arch: x86_64
2017-03-23T07:01:12.025+0000 I CONTROL  [initandlisten] options: {}
2017-03-23T07:01:12.029+0000 I STORAGE  [initandlisten] wiredtiger_open config: create,cache_size=8G,session_max=20000,eviction=(threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),checkpoint=(wait=60,log_size=2GB),statistics_log=(wait=0),
2017-03-23T07:01:12.222+0000 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2017-03-23T07:01:12.222+0000 I CONTROL  [initandlisten] 
2017-03-23T07:01:12.223+0000 I CONTROL  [initandlisten] 
2017-03-23T07:01:12.223+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2017-03-23T07:01:12.223+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2017-03-23T07:01:12.223+0000 I CONTROL  [initandlisten] 
2017-03-23T07:01:12.228+0000 I FTDC     [initandlisten] Initializing full-time diagnostic data capture with directory '/data/db/diagnostic.data'
2017-03-23T07:01:12.228+0000 I NETWORK  [HostnameCanonicalizationWorker] Starting hostname canonicalization worker
2017-03-23T07:01:12.283+0000 I NETWORK  [initandlisten] waiting for connections on port 27017
^C2017-03-23T07:01:13.447+0000 I CONTROL  [signalProcessingThread] got signal 2 (Interrupt), will terminate after current cmd ends
2017-03-23T07:01:13.448+0000 I FTDC     [signalProcessingThread] Shutting down full-time diagnostic data capture
2017-03-23T07:01:13.453+0000 I CONTROL  [signalProcessingThread] now exiting
2017-03-23T07:01:13.453+0000 I NETWORK  [signalProcessingThread] shutdown: going to close listening sockets...
2017-03-23T07:01:13.453+0000 I NETWORK  [signalProcessingThread] closing listening socket: 5
2017-03-23T07:01:13.453+0000 I NETWORK  [signalProcessingThread] closing listening socket: 6
2017-03-23T07:01:13.453+0000 I NETWORK  [signalProcessingThread] removing socket file: /tmp/mongodb-27017.sock
2017-03-23T07:01:13.453+0000 I NETWORK  [signalProcessingThread] shutdown: going to flush diaglog...
2017-03-23T07:01:13.453+0000 I NETWORK  [signalProcessingThread] shutdown: going to close sockets...
2017-03-23T07:01:13.453+0000 I STORAGE  [signalProcessingThread] WiredTigerKVEngine shutting down
2017-03-23T07:01:13.586+0000 I STORAGE  [signalProcessingThread] shutdown: removing fs lock...
2017-03-23T07:01:13.586+0000 I CONTROL  [signalProcessingThread] dbexit:  rc: 0

有人可以帮我解决这个问题吗?

最佳答案

太棒了,我很高兴找到这个帖子。我将为其他人添加一些关键字。

如果您收到此错误消息,您可能正在本地计算机上运行 MongoDB,同时尝试从 Docker 容器内部访问它。原因是在 Docker 容器内部,localhost 或 127.0.0.1 可能是在本地计算机上运行 MongoDB。 0.1 指的是与您真正的本地计算机不同的界面。

错误输出:

 MongoError: failed to connect to server [127.0.0.1:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]
   at Pool.<anonymous> (/app/node_modules/mongodb-core/lib/topologies/server.js:329:35)
   at emitOne (events.js:96:13)
   at Pool.emit (events.js:191:7)
   at Connection.<anonymous> (/app/node_modules/mongodb-core/lib/connection/pool.js:280:12)
   at Object.onceWrapper (events.js:293:19)
   at emitTwo (events.js:106:13)
   at Connection.emit (events.js:194:7)
   at Socket.<anonymous> (/app/node_modules/mongodb-core/lib/connection/connection.js:187:49)
   at Object.onceWrapper (events.js:293:19)
   at emitOne (events.js:96:13)
   at Socket.emit (events.js:191:7)
   at emitErrorNT (net.js:1284:8)
   at _combinedTickCallback (internal/process/next_tick.js:80:11)
   at process._tickDomainCallback (internal/process/next_tick.js:128:9)
 name: 'MongoError',
 message: 'failed to connect to server [127.0.0.1:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]' }

Possible Fixes:

  1. 启用 MongoDB 的远程连接,并使用公共(public) IP 从 Docker 容器内部访问它。

  2. 从容器内部运行 MongoDB,然后您可以通过 localhost 引用它。

  3. 运行另一个 Docker 容器,并在其上启用远程连接。调查 MongoDB 配置文件中的 bind_ip。确保使用身份验证凭据保护数据库的安全。花一些时间确保其安全。

Remote connections are disabled by default in MongoDB, ie: going through a Docker container incorrectly.

这是一个有用的资源:https://hub.docker.com/_/mongo/

关于node.js - docker 尝试连接 mongodb 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42969375/

相关文章:

linux - 使用文件内容创建新目录

linux - BASH +如何验证数组中的单词是否包含在变量中

java - Spring mongo 动态添加条件和操作符

node.js - 如何在 Mongoose 中创建和使用枚举

node.js - 安装 npm 包时发生的事件?

node.js - 我怎样才能让jade模板在保存操作时在Visual Studio中自动编译?

linux - 如何在 bash 中重命名包含反斜杠的文件名?

mongodb - 在尝试升级到 4.0 之前使用 brew upgrade Mongo update from 3.4 to 4.0 error : The data files need to be fully upgraded to version 3. 6

javascript - Node.js 服务器 header

node.js - 在 mongodb nodejs 应用程序上使用客户端 session 时出现 `Use of expired sessions is not permitted` 错误