Alok G.
Alok G.

Reputation: 1558

MongoDB Connection with nodeJs through mongoose in docker-compose environment

I am facing weird issue while connecting MongoDB running in a separate container from my nodejs server container, it displays the following error while trying to connect to MongoDB

{ MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017]
todo-node-server_1     |     at Pool.<anonymous> (/usr/src/app/node_modules/mongodb-core/lib/topologies/server.js:503:11)
todo-node-server_1     |     at emitOne (events.js:116:13)
todo-node-server_1     |     at Pool.emit (events.js:211:7)
todo-node-server_1     |     at Connection.<anonymous> (/usr/src/app/node_modules/mongodb-core/lib/connection/pool.js:326:12)
todo-node-server_1     |     at Object.onceWrapper (events.js:317:30)
todo-node-server_1     |     at emitTwo (events.js:126:13)
todo-node-server_1     |     at Connection.emit (events.js:214:7)
todo-node-server_1     |     at Socket.<anonymous> (/usr/src/app/node_modules/mongodb-core/lib/connection/connection.js:245:50)
todo-node-server_1     |     at Object.onceWrapper (events.js:315:30)
todo-node-server_1     |     at emitOne (events.js:116:13)
todo-node-server_1     |     at Socket.emit (events.js:211:7)
todo-node-server_1     |     at emitErrorNT (internal/streams/destroy.js:64:8)
todo-node-server_1     |     at _combinedTickCallback (internal/process/next_tick.js:138:11)
todo-node-server_1     |     at process._tickCallback (internal/process/next_tick.js:180:9)
todo-node-server_1     |   name: 'MongoNetworkError',
todo-node-server_1     |   message: 'failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017]' }

which clearly states that connection refused. The code works absolutely fine when I run all services locally.

connection to MongoDB through mongoose in following manner

const options = {
  autoIndex: true, // Don't build indexes
  reconnectTries: Number.MAX_VALUE, // Never stop trying to reconnect
  reconnectInterval: 500, // Reconnect every 500ms
  poolSize: 10, // Maintain up to 10 socket connections
  // If not connected, return errors immediately rather than waiting for reconnect
  bufferMaxEntries: 0
};
console.log(options);
mongoose.connect('mongodb://localhost:27017/tododb',options).then(
  () => { console.log("connected !!!"); },
  err => { console.log(err);  }
);

docker-compose.yaml

version : '3.3'

services:
  mongo-database:
    image: mongo
    ports:
      - "27017:27017"

  todo-node-server:
    build: server
    ports:
      - "3000:3000"
    links:
      - mongo-database   

  angular4-todoclient:
    build: todo-app
    ports:
      - "4200:4200"

Complete Docker build logs

[~/dev/aguha/docker-compose] $ docker-compose up
dockercompose_mongo-database_1 is up-to-date
dockercompose_angular4-todoclient_1 is up-to-date
Starting dockercompose_todo-node-server_1 ... 
Starting dockercompose_todo-node-server_1 ... done
Attaching to dockercompose_mongo-database_1, dockercompose_angular4-todoclient_1, dockercompose_todo-node-server_1
angular4-todoclient_1  | 
angular4-todoclient_1  | > todo-app@0.0.0 start /usr/src/app
angular4-todoclient_1  | > ng serve
angular4-todoclient_1  | 
angular4-todoclient_1  | ** NG Live Development Server is listening on localhost:4200, open your browser on http://localhost:4200/ **
mongo-database_1       | 2018-01-21T07:00:22.275+0000 I CONTROL  [initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=02d79173d565
mongo-database_1       | 2018-01-21T07:00:22.275+0000 I CONTROL  [initandlisten] db version v3.6.2
mongo-database_1       | 2018-01-21T07:00:22.275+0000 I CONTROL  [initandlisten] git version: 489d177dbd0f0420a8ca04d39fd78d0a2c539420
mongo-database_1       | 2018-01-21T07:00:22.275+0000 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.1t  3 May 2016
mongo-database_1       | 2018-01-21T07:00:22.275+0000 I CONTROL  [initandlisten] allocator: tcmalloc
mongo-database_1       | 2018-01-21T07:00:22.275+0000 I CONTROL  [initandlisten] modules: none
mongo-database_1       | 2018-01-21T07:00:22.275+0000 I CONTROL  [initandlisten] build environment:
mongo-database_1       | 2018-01-21T07:00:22.275+0000 I CONTROL  [initandlisten]     distmod: debian81
mongo-database_1       | 2018-01-21T07:00:22.275+0000 I CONTROL  [initandlisten]     distarch: x86_64
mongo-database_1       | 2018-01-21T07:00:22.275+0000 I CONTROL  [initandlisten]     target_arch: x86_64
mongo-database_1       | 2018-01-21T07:00:22.275+0000 I CONTROL  [initandlisten] options: { net: { bindIpAll: true } }
mongo-database_1       | 2018-01-21T07:00:22.276+0000 I STORAGE  [initandlisten] 
mongo-database_1       | 2018-01-21T07:00:22.276+0000 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
mongo-database_1       | 2018-01-21T07:00:22.276+0000 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
mongo-database_1       | 2018-01-21T07:00:22.276+0000 I STORAGE  [initandlisten] wiredtiger_open config: create,cache_size=487M,session_max=20000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),statistics_log=(wait=0),verbose=(recovery_progress),
mongo-database_1       | 2018-01-21T07:00:22.308+0000 I CONTROL  [initandlisten] 
mongo-database_1       | 2018-01-21T07:00:22.308+0000 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
mongo-database_1       | 2018-01-21T07:00:22.308+0000 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
mongo-database_1       | 2018-01-21T07:00:22.308+0000 I CONTROL  [initandlisten] 
mongo-database_1       | 2018-01-21T07:00:22.308+0000 I STORAGE  [initandlisten] createCollection: admin.system.version with provided UUID: a336e5c8-1032-4095-8fc2-37de71d12006
mongo-database_1       | 2018-01-21T07:00:22.318+0000 I COMMAND  [initandlisten] setting featureCompatibilityVersion to 3.6
mongo-database_1       | 2018-01-21T07:00:22.321+0000 I STORAGE  [initandlisten] createCollection: local.startup_log with generated UUID: 5b3f3374-6f4e-4f63-aee1-4727eeb1c2e1
mongo-database_1       | 2018-01-21T07:00:22.328+0000 I FTDC     [initandlisten] Initializing full-time diagnostic data capture with directory '/data/db/diagnostic.data'
mongo-database_1       | 2018-01-21T07:00:22.328+0000 I NETWORK  [initandlisten] waiting for connections on port 27017
mongo-database_1       | 2018-01-21T07:00:22.898+0000 I NETWORK  [listener] connection accepted from 172.18.0.1:57658 #1 (1 connection now open)
mongo-database_1       | 2018-01-21T07:00:28.682+0000 I NETWORK  [conn1] end connection 172.18.0.1:57658 (0 connections now open)
todo-node-server_1     | 
todo-node-server_1     | > server@0.0.0 start /usr/src/app
todo-node-server_1     | > node ./bin/www
todo-node-server_1     | 
todo-node-server_1     | yes,connecting to db....
todo-node-server_1     | { autoIndex: true,
todo-node-server_1     |   reconnectTries: 1.7976931348623157e+308,
todo-node-server_1     |   reconnectInterval: 500,
todo-node-server_1     |   poolSize: 10,
todo-node-server_1     |   bufferMaxEntries: 0 }
todo-node-server_1     | done with tries
todo-node-server_1     | { MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017]
todo-node-server_1     |     at Pool.<anonymous> (/usr/src/app/node_modules/mongodb-core/lib/topologies/server.js:503:11)
todo-node-server_1     |     at emitOne (events.js:116:13)
todo-node-server_1     |     at Pool.emit (events.js:211:7)
todo-node-server_1     |     at Connection.<anonymous> (/usr/src/app/node_modules/mongodb-core/lib/connection/pool.js:326:12)
todo-node-server_1     |     at Object.onceWrapper (events.js:317:30)
todo-node-server_1     |     at emitTwo (events.js:126:13)
todo-node-server_1     |     at Connection.emit (events.js:214:7)
todo-node-server_1     |     at Socket.<anonymous> (/usr/src/app/node_modules/mongodb-core/lib/connection/connection.js:245:50)
todo-node-server_1     |     at Object.onceWrapper (events.js:315:30)
todo-node-server_1     |     at emitOne (events.js:116:13)
todo-node-server_1     |     at Socket.emit (events.js:211:7)
todo-node-server_1     |     at emitErrorNT (internal/streams/destroy.js:64:8)
todo-node-server_1     |     at _combinedTickCallback (internal/process/next_tick.js:138:11)
todo-node-server_1     |     at process._tickCallback (internal/process/next_tick.js:180:9)
todo-node-server_1     |   name: 'MongoNetworkError',
todo-node-server_1     |   message: 'failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017]' }
angular4-todoclient_1  | Date: 2018-01-21T07:00:35.368Z
angular4-todoclient_1  | Hash: 9bc58c25a75cb62a0c88
angular4-todoclient_1  | Time: 9909ms
angular4-todoclient_1  | chunk {inline} inline.bundle.js (inline) 5.79 kB [entry] [rendered]
angular4-todoclient_1  | chunk {main} main.bundle.js (main) 33.9 kB [initial] [rendered]
angular4-todoclient_1  | chunk {polyfills} polyfills.bundle.js (polyfills) 548 kB [initial] [rendered]
angular4-todoclient_1  | chunk {scripts} scripts.bundle.js (scripts) 387 kB [initial] [rendered]
angular4-todoclient_1  | chunk {styles} styles.bundle.js (styles) 546 kB [initial] [rendered]
angular4-todoclient_1  | chunk {vendor} vendor.bundle.js (vendor) 11.1 MB [initial] [rendered]
angular4-todoclient_1  | 
angular4-todoclient_1  | webpack: Compiled successfully.
mongo-database_1       | 2018-01-21T07:05:22.332+0000 I STORAGE  [thread2] createCollection: config.system.sessions with generated UUID: 276d07dc-b507-4684-a3a6-75e560b44679
mongo-database_1       | 2018-01-21T07:05:22.347+0000 I INDEX    [thread2] build index on: config.system.sessions properties: { v: 2, key: { lastUse: 1 }, name: "lsidTTLIndex", ns: "config.system.sessions", expireAfterSeconds: 1800 }
mongo-database_1       | 2018-01-21T07:05:22.347+0000 I INDEX    [thread2]   building index using bulk method; build may temporarily use up to 500 megabytes of RAM
mongo-database_1       | 2018-01-21T07:05:22.347+0000 I INDEX    [thread2] build index done.  scanned 0 total records. 0 secs

Please guide where exactly I am missing. Thanks in advance.

Upvotes: 3

Views: 3212

Answers (1)

Sumedha Gamage
Sumedha Gamage

Reputation: 148

Change the connection string "localhost" to "mongo-database"

mongoose.connect('mongodb://mongo-database:27017/tododb',options)

when you use docker-compose it creates two containers so localhost for node is different from localhost to mongo. run "docker container ls" this will give you the mongo container name use that in the connection string.

Upvotes: 7

Related Questions