2
respostas

Erro ao se comunicar com o banco

Bom dia.

Estou testando oque estou aprendendo no curso e me deparei com um problema que não estou conseguindo resolver.

Eu tenho um sistema simples feito em nodeJs que faz alguns crudes com o banco de dados Mysql. O problema que estou tendo e que o contêiner não esta conseguindo se comunicar com meu banco de dados que está na maquina local. Ja tentei passar o ip da minha maquina mas mesmo assim ele não encontra.

Apresenta o seguinte erro no terminal.

❯ sudo docker-compose up
Starting api-nps_app_1 ... done
Attaching to api-nps_app_1
app_1  | 
app_1  | > api-nps@1.0.0 start /usr/app
app_1  | > nodemon ./src/server.js
app_1  | 
app_1  | [nodemon] 2.0.6
app_1  | [nodemon] to restart at any time, enter `rs`
app_1  | [nodemon] watching path(s): *.*
app_1  | [nodemon] watching extensions: js,mjs,json
app_1  | [nodemon] starting `node ./src/server.js`
app_1  | events.js:174
app_1  |       throw er; // Unhandled 'error' event
app_1  |       ^
app_1  | 
app_1  | Error: connect ECONNREFUSED 172.17.0.1:3306
app_1  |     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1107:14)
app_1  | Emitted 'error' event at:
app_1  |     at Connection._notifyError (/usr/app/node_modules/mysql2/lib/connection.js:225:12)
app_1  |     at Connection._handleFatalError (/usr/app/node_modules/mysql2/lib/connection.js:156:10)
app_1  |     at Connection._handleNetworkError (/usr/app/node_modules/mysql2/lib/connection.js:169:10)
app_1  |     at Socket.emit (events.js:198:13)
app_1  |     at emitErrorNT (internal/streams/destroy.js:91:8)
app_1  |     at emitErrorAndCloseNT (internal/streams/destroy.js:59:3)
app_1  |     at process._tickCallback (internal/process/next_tick.js:63:19)
app_1  | [nodemon] app crashed - waiting for file changes before starting..

Minha conexão com o banco de dados está da seguinte forma:

const mysql = require('mysql2')

const connection = mysql.createConnection({
    host: '192.168.10.6',
    port: 3306,
    user :'root',
    password: 'root123',
    database: 'relatorio'
});

module.exports = connection;

Não sei porque ele não está conseguindo se conectar com o banco de dados.

Eu tenho que fazer ele funcionar chamando o Ip de fora porque no ambiente de produção o mysql já esta funcionando e só conecto com ele via IP

E meu composer está asssim:

version: "3"

services: 
    app:
        build: .
        command: npm start 
        ports: 
            - "4001:4001"
        volumes:  
            - .:/usr/app

2 respostas

Olá, Thayrin. Tudo bem?

Você se certificou de permitir conexões de fora no seu banco de dados? Por padrão, creio que as conexões feitas de outros usuários endereços são bloqueadas.

Veja isso e diz aqui o resultado?

Ola, Vitor Almeida. Tudo bem?

Como não estava conseguindo dormir por conta do erro fiquei pesquisando e lendo sobre a sintax do docker-compose.

Percebi que não tinha informado o porta 3306 para que a aplicação conseguisse acessar o banco de dados Mysql. Também percebi que por padrão o docker de comunica somente entre componentes da mesma rede docker, foi ai que criei uma nova network_mode chamada host, assim o container acessa o lado externo e faz a conexão com o banco de dados.

Me corrija se eu estiver errado por favor kkk.

codigo docker compose.

version: "3"

services: 
   app:
    build: .
    command: npm start 
    network_mode: host
    ports: 
      - 4001:4001
      - 3306:3306
    volumes:  
      - .:/usr/app

codigo Dockerfile.

FROM node:12-alpine

WORKDIR /usr/app

COPY package.json yarn.lock ./

RUN npm install

COPY . .

EXPOSE 4001
CMD ["npm", "start"]