NodeJS + Mysql with Docker Compose 2

I´m trying to built a docker-compose file to deploy locally my NodeJS app that connects to a mysql server. I´ve tried everything ( read a lot of tutorials and some questions here in Stackoverflow ) but I keep getting the ECONNREFUSED error.
This is my Dockerfile from NodeJS:

##Nodejs

FROM node:latest

RUN useradd --user-group --create-home --shell /bin/false app

ENV HOME=/home/app

COPY package.json npm-shrinkwrap.json $HOME/playerground/
RUN chown -R app:app $HOME/*

USER app 
WORKDIR $HOME/playerground
RUN npm cache clean && npm install --silent --progress=false

USER root
COPY . $HOME/playerground
RUN chown -R app:app $HOME/*
USER app

This is my Mysql Dockerfile:

FROM mysql:latest

ENV MYSQL_ROOT_PASSWORD root  
ENV MYSQL_DATABASE playerground  
ENV MYSQL_USER root  
ENV MYSQL_PASSWORD root

And this is my docker-compose:

version: '2'
services: 
  db:
    build: ./database
    ports:
      - "3307:3306"  
  playerground:
      build:
        context: .
        dockerfile: Dockerfile
      command: node_modules/.bin/nodemon --exec npm start
      environment:
        ENVIRONMENT: development
      ports:
        - "9090:9090"
      links:
        - db  
      volumes:      
        - .:/home/app/playerground
        - /home/app/playerground/node_modules

Another thing is my configuration file from Nodejs:

//Database
'development' : {
  'host' : process.env.HOSTNAME || 'localhost',
  'user' : 'root',
  'password' : 'root',
  'database' : 'playerground'
},
//Server
'development' : {
  'host' : process.env.HOSTNAME || '127.0.0.1',
  'port' : 3000
},

Can you help me?
Thanks

Here is Solutions:

We have many solutions to this problem, But we recommend you to use the first solution because it is tested & true solution that will 100% work for you.

Solution 1

In your app config, the database host isn’t pointing at your MySql container. You’re pointing it at the local host, which is the app container. In the Compose file you can explicitly name the link to the db container using:

  links:
    - db:db  

And then your database container can be reached at the hostname db. You can hard-code that host in your app config, because it will be the same for all environments, as long as you use the same Compose file.

Also, if you’re using a recent version of Docker you don’t need to publish ports between containers in the same Docker network – so you can remove this from your Compose file:

ports:
  - "3307:3306"  

Then the db container will be accessible by the app container, but not externally.

Note: Use and implement solution 1 because this method fully tested our system.
Thank you 🙂

All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply