Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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: tcmalloc 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
like image 345
pethel Avatar asked Jan 25 '17 21:01

pethel


1 Answers

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.

like image 103
Ivan Vasiljevic Avatar answered Oct 14 '22 10:10

Ivan Vasiljevic