Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot connect to MongoDB via node.js in Docker

My node.js express app cannot connect to the MongoDB in a Docker. I'm not that familiar with Docker.

node.js connection:

import mongodb from 'mongodb';
...
mongodb.MongoClient.connect('mongodb://localhost:27017', ... );

Dockerfile:

FROM node:argon
RUN mkdir /app
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
EXPOSE 3000
CMD ["npm", "start"]

docker-compose.yml

version: “2”
 services:
  web:
   build: .
   volumes:
     — ./:/app
   ports:
   — “3000:3000”
   links:
    — mongo
   mongo:
    image: mongo
    ports:
      — “27017:27017”

Build command: docker build -t NAME .

Run command: docker run -ti -p 3000:3000 NAME

Connection error:

[MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]]
  name: 'MongoError',
  message: 'failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]'
like image 479
Idemax Avatar asked Jul 06 '17 01:07

Idemax


3 Answers

Try:

mongodb.MongoClient.connect('mongodb://mongo:27017', ... );

Change your docker-compose.yml:

version: "2"

services:

  web:
    build: .
    volumes:
      - ./:/app
    ports:
      - "3000:3000"
    links:
      - mongo

  mongo:
    image: mongo
    ports:
      - "27017:27017"

And use some docker compose commands:

docker-compose down
docker-compose build
docker-compose up -d mongo
docker-compose up web
like image 150
messivanio Avatar answered Nov 14 '22 14:11

messivanio


Try this.

  1. When using linked docker containers you should use the name of the container in this case for example your connection to mongodb should be mongodb.MongoClient.connect('mongodb://mongo:27017', ... ); instead of mongodb.MongoClient.connect('mongodb://localhost:27017', ... );. The reason for changing it to mongo is because you used the links attribute to mongo in your docker-compose.yml. That would result to a hostname of mongo in your /etc/hosts of the web docker container. Reference linking-containers.
  2. The docker-compose.yml seems to be lacking an indention. On the mongo attribute should be the same level as web.

    version: '2'
    services:
      web:
       build: .
       volumes: ['./:/app']
       ports: [ '3000:3000' ]
       links: [ mongo ]
      mongo:
       image: mongo
       ports: [ '27017:27017' ]
    
  3. I tried your configuration using my docker what Ive done is update docker-compose.yml then I docker-compose build then docker-compose up. Logs of my local run

like image 32
Gideon Rosales Avatar answered Nov 14 '22 13:11

Gideon Rosales


I am not sure if you still have this question, but the datasources.json should be:

"host": "mongo" 

rather than "localhost".

In my logs I see:

mongo    |  NETWORK  [listener] connection accepted from 172.22.0.3:47880 #1 (1 connection now open)

As you can see, docker compose will NAT mongo to another V-LAN. The IP address 172.22.0.0 is an internal IP address used by the daemon to route a docker-compose image. So localhost is now not in the game.

At least, it works for me.

datasources.json

"mongoDS": {
    "host": "mongo",
    "port": 27017,

...

like image 1
Bruno Serralheiro Avatar answered Nov 14 '22 13:11

Bruno Serralheiro