mik3fly-4steri5k
mik3fly-4steri5k

Reputation: 862

I m not able to connect to mongo with a container docker

I m new to docker so i followed up a tutorial here , part 6,7 and 8 in order to use and learn docker in a project.

The problem is that when i use docker-compose.yml to build images on my laptop, my stack_server can connect to mongo.

But if i build images from docker hub and i pull and run them seperately on my laptop,my stack_server CAN't connect to mongo.

here is my docker-compose.yml :

client:
    build: ./client
    restart: always
    ports:
      - "80:80"
    links:
      - server
mongo:
  image: mongo
  command: --smallfiles
  restart: always
  ports:
    - "27017:27017"
server:
    build: ./server
    restart: always
    ports:
     - "8080:8080"
    links:
     - mongo

However, my stack_client can connect to the stack_server.

and my commands to run my image (my images are public)

docker-run -i -t -p 27017:27017 mongo
docker-run -i -t -p 80:80 mik3fly4steri5k/stack_client 
docker-run -i -t -p 8080:8080 mik3fly4steri5k/stack_server

and my error log

bryan@debian-dev7:~$ sudo docker run -i -t -p 8080:8080 mik3fly4steri5k/stack_server
[sudo] password for bryan: 
Express server listening on 8080, in development mode
connection error: { Error: connect ECONNREFUSED 127.0.0.1:27017
    at Object._errnoException (util.js:1021:11)
    at _exceptionWithHostPort (util.js:1043:20)
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1175:14)
  name: 'MongoError',
  message: 'connect ECONNREFUSED 127.0.0.1:27017' }

here is my stack_server dockerfile

FROM node:latest

# Set in what directory commands will run
WORKDIR /home/app

# Put all our code inside that directory that lives in the container
ADD . /home/app

# Make sure NPM is not cached, remove everything first
RUN rm -rf /home/app/node_modules/npm \
 && rm -rf  /home/app/node_modules

# Install dependencies
RUN npm install

# Tell Docker we are going to use this port
EXPOSE 8080

# The command to run our app when the container is run
CMD ["node", "app.js"]

First Solution but deprecated

docker-run -i -t -p 27017:27017 --name:mongo mongo
docker-run -i -t -p 80:80 mik3fly4steri5k/stack_client 
docker-run -i -t -p 8080:8080 --link mongo:mongo mik3fly4steri5k/stack_server

I had to put a name on my mongo and to link it with the parameter --link when i run my stack_server

docker documentation

Warning: The --link flag is a deprecated legacy feature of Docker. 
It may eventually be removed. 
Unless you absolutely need to continue using it,
we recommend that you use user-defined networks to facilitate communication 
between two containers instead of using --link.
One feature that user-defined networks do not support that you can do with 
--link is sharing environmental variables between containers.
However, you can use other mechanisms such as volumes to share environment 
variables between containers in a more controlled way.

Upvotes: 2

Views: 2931

Answers (4)

Juan Pablo Astorga
Juan Pablo Astorga

Reputation: 121

Your container is running. But is it healthy? I recommend that you implement Healthcheck

It’s actually would look pretty much the same: (Docker-compose YAML)

healthcheck:
  test: curl -sS http://127.0.0.1:8080 || echo 1
  interval: 5s
  timeout: 10s
  retries: 3

Docker health checks is a cute little feature that allows attaching shell command to container and use it for checking if container’s content is alive enough.

I hope it can help you.

more info https://docs.docker.com/compose/compose-file/compose-file-v2/#healthcheck

Upvotes: 1

Sounak Saha
Sounak Saha

Reputation: 933

Run your stack_server with below command

sudo docker run -i -t -p 8080:8080 --link mongo:mongo mik3fly4steri5k/stack_server

Note: --link flag is a deprecated

Upvotes: 2

Bukharov Sergey
Bukharov Sergey

Reputation: 10185

Lets look at error

connection error: { Error: connect ECONNREFUSED 127.0.0.1:27017

Server trying to connect to localhost instead of mongo. You need to configure server to connect mongo to mongo:27017

mongo is alias created by docker for linking containers to each other.

Upvotes: 0

Sergiu
Sergiu

Reputation: 3185

To start MongoDB on a desire port you would have to do the followings:

client:
    build: ./client
    restart: always
    ports:
      - "80:80"
    links:
      - server
mongo:
  image: mongo
  command: mongod --port 27017
  restart: always
  ports:
    - "27017:27017"
server:
    build: ./server
    restart: always
    ports:
     - "8080:8080"
    links:
     - mongo

Upvotes: 0

Related Questions