无法连接到docker mongodb

时间:2017-01-25 21:23:24

标签: node.js mongodb docker docker-compose

我没有经常使用docker和node,所以我希望它是一个简单的错误。我正在使用docker compose。如果我通过浏览器访问, http://localhost:27017/我得到了:

  

看起来您正尝试通过HTTP访问本机上的MongoDB   司机口。

同时记录表明我的mongodb是健康的。从我尝试通过浏览器访问的最后一行我想。

  

2017-01-25T21:11:13.509 + 0000 I JOURNAL [initandlisten]期刊   dir = / data / db / journal 2017-01-25T21:11:13.509 + 0000 I JOURNAL   [initandlisten] recover:不存在日志文件,无需恢复   2017-01-25T21:11:13.546 + 0000 I JOURNAL [耐久性]耐久性线程   开始2017-01-25T21:11:13.547 + 0000 I JOURNAL [期刊作者]   期刊作者线程开始2017-01-25T21:11:13.568 + 0000 I CONTROL   [initandlisten] MongoDB启动:pid = 1 port = 27017 dbpath = / data / db   64位主机= 150c248f4cc7 2017-01-25T21:11:13.568 + 0000 I CONTROL   [initandlisten] db version v3.0.2 2017-01-25T21:11:13.568 + 0000 I   CONTROL [initandlisten] git版本:   6201872043ecbbc0a4cc169b5482dcf385fc464f 2017-01-25T21:11:13.569 + 0000   我控制[initandlisten] OpenSSL版本:OpenSSL 1.0.1e 2013年2月11日   2017-01-25T21:11:13.569 + 0000 I CONTROL [initandlisten]构建信息:   Linux ip-10-171-120-232 3.2.0-4-amd64#1 SMP Debian 3.2.46-1 x86_64   BOOST_LIB_VERSION = 1_49 2017-01-25T21:11:13.569 + 0000 I CONTROL   [initandlisten] allocator:tcmalloc 2017-01-25T21:11:13.569 + 0000 I   CONTROL [initandlisten]选项:{} 2017-01-25T21:11:13.573 + 0000我   NETWORK [initandlisten]等待端口27017上的连接   2017-01-25T21:11:17.843 + 0000 I NETWORK [initandlisten]连接   接受自172.20.0.1:44148#1(1连接现已开放)   2017-01-25T21:11:17.843 + 0000 I NETWORK [initandlisten]连接   接受自172.20.0.1:44146#2(2个连接现已开放)   2017-01-25T21:11:17.853 + 0000 I NETWORK [conn2]结束连接   172.20.0.1:44146(1连接现在打开)2017-01-25T21:11:17.998 + 0000 I NETWORK [conn1] end connection 172.20.0.1:44148(0连接   打开)

所以看起来我的mongodb正在运行。当我进入我的节点应用程序尝试访问它时,我得到了。

  

{MongoError:首先无法连接到服务器[localhost:27017]   连       在游泳池。 (/usr/src/app/node_modules/mongodb-core/lib/topologies/server.js:326:35)       在emitOne(events.js:96:13)       在Pool.emit(events.js:188:7)       在Connection。 (/usr/src/app/node_modules/mongodb-core/lib/connection/pool.js:270:12)       at Object.onceWrapper(events.js:290:19)       在emitTwo(events.js:106:13)       在Connection.emit(events.js:191:7)       在Socket。 (/usr/src/app/node_modules/mongodb-core/lib/connection/connection.js:175:49)       at Object.onceWrapper(events.js:290:19)       在emitOne(events.js:96:13)名称:'MongoError',消息:'在第一次连接''无法连接到服务器[localhost:27017]'}

我的代码试图访问mongodb

const express = require('express');
const gh = require('./src/fetch');
const MongoClient = require('mongodb').MongoClient;

const url = 'mongodb://localhost:27017/myApp';

// Constants
const PORT = 8888;

// App
const app = express();

app.get('/', function (req, res) {
    MongoClient.connect(url, function (err, db) {
        if (err) {
            console.log(err);
        } else {
            console.log("Connected correctly to server");
            db.close();
        }

    });
    res.send('Hello world\n');
});

app.listen(PORT);
console.log('Running on http://localhost:' + PORT);

我的docker-compose看起来像这样。

version: '2'
services:
  web:
    image: gh-api
    ports:
      - "8888:8888"
    environment:
      - KEY=abc
    restart: always
    links:
      - mongoDB
    depends_on:
          - mongoDB
  mongoDB:
      image: mongo:3.0.2
      ports:
        - "27017:27017"

gh-api的Dockerfile

FROM node:7.4-onbuild

EXPOSE 8888

3 个答案:

答案 0 :(得分:21)

你可以从以下网址更改你的mongodb网址:

const url = 'mongodb://localhost:27017/myApp';

const url = 'mongodb://mongoDB/myApp';

我遇到与my demo blog application类似的问题,并且该更改应用程序已开始正常运行。

修改

我能找到的最佳解释是explanation of docker-compose links

  

链接服务的容器可以通过主机名访问   与别名相同,如果未指定别名,则为服务名称。

因此,为了从mongoDB容器访问web容器,您应该在mongoDB容器中使用web作为主机名。

答案 1 :(得分:0)

  

看起来您正尝试在本机驱动程序端口上通过HTTP访问MongoDB。

该端口将由mongo驱动程序使用。如果您确实需要/需要访问其余接口,则必须使用端口28017并使用--rest标志启动mongo。一个例子:

$ docker run --rm -p 28017:28017 mongo mongod --rest

要使用docker compose访问另一个容器,请使用服务名称,如Ivan所述。

答案 2 :(得分:0)

在我的情况下,一切都正确设置就像在这个问题中回答,但是我得到了由“启动竞赛”引起的这个错误,基本上我的Node应用程序将在mongo映像之前启动,因此它会在它启动之前尝试连接到mongo运行。所以我改变了我的连接代码,再次使用类似的东西重试:

init().then((mongo) => main({ mongo })).catch(e => init())

function init(){
  return MongoClient.connect(mongoConnectionURL)
}

function main({ mongo }){
  const server = express()
  server.listen(port, host);
}

我认为,这应该是使用compose文件中的depends_on属性解决的,但据我所知,depends_on只确保启动其他服务,但不确定它们是按正确顺序初始化。