简体   繁体   中英

Cant connect to docker mongodb

I am have not used both docker and node a lot so I hope its a simple mistake. I am using docker compose. If I through a browser access, http://localhost:27017/ I get an:

It looks like you are trying to access MongoDB over HTTP on the native driver port.

Also logs suggest my mongodb is healty. Last line from when I tried to access through my browser I guess.

2017-01-25T21:11:13.509+0000 I JOURNAL [initandlisten] journal dir=/data/db/journal 2017-01-25T21:11:13.509+0000 I JOURNAL [initandlisten] recover : no journal files present, no recovery needed 2017-01-25T21:11:13.546+0000 I JOURNAL [durability] Durability thread started 2017-01-25T21:11:13.547+0000 I JOURNAL [journal writer] Journal writer thread started 2017-01-25T21:11:13.568+0000 I CONTROL [initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=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 version: 6201872043ecbbc0a4cc169b5482dcf385fc464f 2017-01-25T21:11:13.569+0000 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.0.1e 11 Feb 2013 2017-01-25T21:11:13.569+0000 I CONTROL [initandlisten] build info: 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: tcmal loc 2017-01-25T21:11:13.569+0000 I CONTROL [initandlisten] options: {} 2017-01-25T21:11:13.573+0000 I NETWORK [initandlisten] waiting for connections on port 27017 2017-01-25T21:11:17.843+0000 I NETWORK [initandlisten] connection accepted from 172.20.0.1:44148 #1 (1 connection now open) 2017-01-25T21:11:17.843+0000 I NETWORK [initandlisten] connection accepted from 172.20.0.1:44146 #2 (2 connections now open) 2017-01-25T21:11:17.853+0000 I NETWORK [conn2] end connection 172.20.0.1:44146 (1 connection now open) 2017-01-25T21:11:17.998+0000 I NETWORK [conn1] end connection 172.20.0.1:44148 (0 connections now open)

So it looks that my mongodb is up running. When I in in my node application try to access it I get.

{ MongoError: failed to connect to server [localhost:27017] on first connect at Pool. (/usr/src/app/node_modules/mongodb-core/lib/topologies/server.js:326:35) at emitOne (events.js:96:13) at Pool.emit (events.js:188:7) at Connection. (/usr/src/app/node_modules/mongodb-core/lib/connection/pool.js:270:12) at Object.onceWrapper (events.js:290:19) at emitTwo (events.js:106:13) at Connection.emit (events.js:191:7) at Socket. (/usr/src/app/node_modules/mongodb-core/lib/connection/connection.js:175:49) at Object.onceWrapper (events.js:290:19) at emitOne (events.js:96:13) name: 'MongoError', message: 'failed to connect to server [localhost:27017] on first connect' }

My code trying to access the 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);

My docker-compose looks like this.

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"

Dockerfile for gh-api

FROM node:7.4-onbuild

EXPOSE 8888

Could you change url to your mongodb from:

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

to

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

I had similar issue with my demo blog application and with that change application started working.

Edit

The best explanation that I could found is explanation of docker-compose links .

Containers for the linked service will be reachable at a hostname identical to the alias, or the service name if no alias was specified.

So in order to access mongoDB container from web container you should use mongoDB as host name in web container.

It looks like you are trying to access MongoDB over HTTP on the native driver port.

That port is to be used by the mongo driver. If you really want/need to access the rest interface you have to use port 28017 and start mongo with the --rest flag. An example:

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

To access a container from another, with docker compose use the service name, as pointed out by Ivan.

In my case everything was correctly setup just like answered in this question however I got this error caused by "boot race", basically my Node app would boot before mongo image and therefore it would try to connect to mongo before it's up and running. So I changed my connection code to retry again with something like this:

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

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

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

I tought, this was supposed to be solved using depends_on property inside compose file, but as far as I understand, depends_on only makes sure to start other services, doesn't make sure they were initialized in proper order.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM