connecting to local mongodb from docker container

34,772

Solution 1

On Docker for Mac, you can use host.docker.internal if your mongo is running on your localhost. You could have your code read in an env variable for the mongo host and set it in the Dockerfile like so:

ENV MONGO_HOST "host.docker.internal"

See here for more details on https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds

Solution 2

Adding @vlad-holubiev as answer here because it has worked for me and help users to find it.

Using the network host option on docker run, as specified in the docs:

With the network set to host a container will share the host’s network stack and all interfaces from the host will be available to the container. The container’s hostname will match the hostname on the host system.

docker run -d -e ROOT_URL=http://localhost -e MONGO_URL=mongodb://localhost:27017 --network="host"

Solution 3

A docker container is a separate from your computer,
So you will not be able to connect to your localhost.
You should run the mongo server on a container and the connect with the image name.

mongodb://CONTAINER-NAME:port
Share:
34,772
chaudharyp
Author by

chaudharyp

I love to write code and be more curious everyday.

Updated on July 12, 2020

Comments

  • chaudharyp
    chaudharyp almost 4 years

    I have a local mongoDB server running on mongodb://127.0.0.1:27017. My DB name is localv2. I have a node/express app with the Dockerfile as follows:

    FROM node:7.5
    
    RUN npm install -g pm2
    
    RUN mkdir -p /usr/src/app
    WORKDIR /usr/src/app
    
    COPY package.json /usr/src/app
    RUN npm install
    
    COPY . /usr/src/app
    
    EXPOSE 3002
    
    ENV NODE_ENV local
    
    CMD pm2 start --no-daemon server.js
    

    The server.js file has a connection to local mongodb with the following code:

    app.db = mongoose.connect("mongodb://127.0.0.1:27017/localv2", options);
    

    This doesn't work when I spin up a container from the image created using the Dockerfile above. I read somewhere that Docker creates a VLAN with a gatway IP address of its own. When I docker inspect my container, my gateway IP address: 172.17.0.1.

    Even on changing the mongodb connection to

    app.db = mongoose.connect("mongodb://172.17.0.1:27017/localv2", options)
    

    and re-building the image and starting a new container, I still get the error:

    MongoError: failed to connect to server [172.17.0.1:27017] on first connect [MongoError: connect ECONNREFUSED 172.17.0.1:27017]
    

    Command to run the container: docker run -p 3002:3002 image-name

    Please help.

  • Armeen Moon
    Armeen Moon almost 7 years
    This is a far better answer.
  • RaduM
    RaduM over 6 years
    It all depends if you exposed the port. If you exposed the internal docker container port you can connect using localhost.
  • Gibberish
    Gibberish about 5 years
    I prefer this solution to all others
  • MikeT
    MikeT over 4 years
    the docker container is separate but connected, so it is possible to connect to your local machine from inside the container you just need to figure out what the local machines ip address is on the docker network, this was easier beforethey broke the local network dns integration (~ version 19.0) when you could specify the local machines name and the dns would autolookup
  • JSking
    JSking over 4 years
    trying to solve same problem, did not understand how you used this: you used this code to run your container?
  • Rohit Rane
    Rohit Rane over 4 years
    Getting following error : node: bad option: --network=host ! What do I do?
  • vinsent paramanantham
    vinsent paramanantham about 4 years
    How to specify in docker-compose file for external mongo database connection..
  • Abhishek Pankar
    Abhishek Pankar about 3 years
    @jackOfAll, did you use windows/mac OS?
  • Rohit Rane
    Rohit Rane about 3 years
    @AbhishekPankar Mac
  • Abhishek Pankar
    Abhishek Pankar about 3 years
    Network host works only on linux machine. Check it here docs.docker.com/network/host