docker在尝试连接到mongodb时出错

我想做简单的宁静的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机docker run -it mongo:3.2 /bin/bash

 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 

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

我相信的问题是使用CMD node app.js只启动节点而不是数据库。 通常当创build这种简单的应用程序,你使用两个容器。 一个用于节点的mongo,因为您不使用mongo或节点的自定义configuration,您可以使用映像并将当前文件夹中的代码映射到容器中的/ opt /目录,这意味着您所需要的只是一个撰写文件,并可能不需要任何Dockerfile

免责声明显然,这是不够的生产,在某些时候,你可能会想为你的应用程序使用Dockerfile,因为最好是以用户而不是root启动节点,并将文件放在一个有意义的目录中。 但是,如果你想要做的就是作为一个沙箱使用,这应该做的。

你的docker工作人员看起来像

 version: "2" services: db: image: mongo:3.2 ports: - 27017 app: image: node links: - db volumes: - '.:/opt/' command: node /opt/app.js ports: - 3000:3000 

如果你想全面进入并为每个指定一个Dockerfile。

/泊坞窗,文件/程序/ Dockerfile

 # take from the latest node build FROM node # Make a directory /opt/app RUN mkdir /opt/app # Set work dir to /opt/app WORKDIR /opt/app # Do all your npm install etc.... CMD node app.js 

/泊坞窗,文件/数据库/ Dockerfile

 FROM mongo:3.2 # Do some fancy mongo stuff. 

/docker-compose.yml

 version: "2" services: db: build: context: docker-files/db dockerfile: Dockerfile ports: - 27017 app: build: context: docker-files/app dockerfile: Dockerfile links: - db volumes: - '.:/opt/app' ports: - 3000:3000 

令人惊讶的是,我很高兴我find了这个线程。 我将为其他人添加一些关键字。

如果您收到此错误消息,则可以在本地计算机上运行MongoDB,同时尝试从Docker容器中访问它。 原因是在Docker容器中,localhost或127.0.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]' } 

可能的修正:

  1. 启用来自MongoDB的远程连接,并使用您的公共IP从Docker容器中访问它。

  2. 在Container中运行MongoDB,然后用localhost引用它。

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

远程连接在MongoDB中默认是禁用的,例如:不正确地检查Docker容器。

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