1

The Dockerfile for my application is as follows

               # Tells the Docker which base image to start.
               FROM node

               # Adds files from the host file system into the Docker container.  
               ADD . /app

               # Sets the current working directory for subsequent instructions
               WORKDIR /app

                RUN npm install
                RUN npm install -g bower
                RUN bower install --allow-root
                RUN npm install -g nodemon

                #expose a port to allow external access
                EXPOSE 9000 9030 35729

                # Start mean application
                CMD ["nodemon", "server.js"]

The docker-compose.yml file is as follows

                          web:
                                 build: .
                                 links:
                                            - db
                                  ports:
                                           - "9000:9000"
                                           - "9030:9030"
                                           - "35729:35729"
                                   db:
                                           image: mongo:latest
                                           ports: 
                                                  - "27017:27017"

And the error generated while running is as follows:-

   web_1  | [nodemon] 1.11.0
   web_1  | [nodemon] to restart at any time, enter `rs`
   web_1  | [nodemon] watching: *.*
   web_1  | [nodemon] starting `node server.js`
   web_1  | Server running at http://127.0.0.1:9000
   web_1  | Server running at https://127.0.0.1:9030
   web_1  | 
   web_1  | /app/node_modules/mongodb/lib/server.js:261
   web_1  |         process.nextTick(function() { throw err; })
   web_1  |                                       ^
  web_1  | MongoError: failed to connect to server [localhost:27017] on first connect
   web_1  |     at Pool.<anonymous> (/app/node_modules/mongodb-core/lib/topologies/server.js:313:35)
  web_1  |     at emitOne (events.js:96:13)
  web_1  |     at Pool.emit (events.js:188:7)
  web_1  |     at Connection.<anonymous> (/app/node_modules/mongodb-core/lib/connection/pool.js:271:12)
 web_1  |     at Connection.g (events.js:291:16)
 web_1  |     at emitTwo (events.js:106:13)
 web_1  |     at Connection.emit (events.js:191:7)
 web_1  |     at Socket.<anonymous> (/app/node_modules/mongodb-core/lib/connection/connection.js:165:49)
web_1  |     at Socket.g (events.js:291:16)
web_1  |     at emitOne (events.js:96:13)
web_1  |     at Socket.emit (events.js:188:7)
web_1  |     at emitErrorNT (net.js:1281:8)
web_1  |     at _combinedTickCallback (internal/process/next_tick.js:74:11)
web_1  |     at process._tickCallback (internal/process/next_tick.js:98:9)
web_1  | [nodemon] app crashed - waiting for file changes before starting...

I have uploaded the image for my application at DockerHub as crissi/airlineInsurance.

cmr
  • 147
  • 9

1 Answers1

0

In docker you can't connect to an other container via localhost because each container is independend and has its own IP. You should use container_name:port. In your example it should be db:27017 to connect from your NodeJS application in 'web' to the MongoDB in 'db'.

So it's not the problem of your Dockerfile. It's the connection URL from your NodeJS application that points to localhost instead of db.

Piu130
  • 1,288
  • 3
  • 16
  • 28
  • I have changed my config file for application.The above specified Database issue is solved. But the application won't get loaded on the ports 9000,9030. – cmr Nov 13 '16 at 15:36
  • I think you are using Boot2Docker. Boot2Docker has an own IP address because it's a VM. You can use port forwarding like [here](https://stackoverflow.com/questions/28403341/boot2docker-access-webserver-as-localhost#28405278) or you can get the Boot2Docker IP with `docker inspect $(docker ps -q) | grep IPA` and use it like Boot2DockerIP:port because the port is forwarded to the Boot2Docker. – Piu130 Nov 14 '16 at 10:08