Cant connect to docker mongodb

13,017

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.

Share:
13,017
pethel
Author by

pethel

Updated on June 06, 2022

Comments

  • pethel
    pethel almost 2 years

    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
    
  • pethel
    pethel over 7 years
    Thanks. I do not want to use that port. It was only a tet to see if things was up running.