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:

  • Mount linux image in docker container
  • How to select Docker host to use with new Eclipse Liberty WDT tools
  • Docker hello world not working
  • Docker machine is active, but shown as aborted in Virtual Box
  • How to use port forwarding to connect to docker container using DNS name
  • How to debug dockerized self-detaching program?
  • 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]'
    

  • What is the relationship between the docker host OS and the container base image OS?
  • Multiple docker servers using same containers
  • how to implement Sensu Check for checking if Docker Container is running or not
  • How to run Python Flask within a Docker container [duplicate]
  • Can't overwrite file in docker compose
  • Bitbucket pipelines: No toolchains found in the NDK toolchains folder for ABI with prefix: aarch64-linux-android
  • 2 Solutions collect form web for “Cannot connect to MongoDB via node.js in Docker”

    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
    

    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

    Docker will be the best open platform for developers and sysadmins to build, ship, and run distributed applications.