connecting to local mongodb from docker container

docker, dockerfile, mongodb, mongoose, node.js

Solution

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

Problem

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.

Original source