본문 바로가기
IT

[Docker] Error: connect ECONNREFUSED 0.0.0.0:3306

by csongin 2023. 3. 11.
728x90

목적 : 에러 해결 과정 기록

구현하고자 했던 내용

  1. Docker-compose를 이용해 서버와 MySQL 컨테이너를 실행시키기
    Dockerfiledocker-compose.yaml
  2. version: '3.7' services: app: build: context: . dockerfile: Dockerfile ports: - 3000:3000 volumes: - ./:/app environment: MYSQL_HOST: mysql MYSQL_USER: root MYSQL_PASSWORD: password MYSQL_DB: workout mysql: image: mysql:8.0 restart: always environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: workout volumes: - mydata:/var/lib/mysql ports: - 3306:3306 volumes: mydata:
  3. FROM node:14 WORKDIR /app/ COPY ./package.json /app/ COPY ./yarn.lock /app/ RUN yarn install COPY . /app/ CMD yarn start:dev
  4. Entity를 정의하고 정의된 Entity를 TypeORM을 통해 Docker 컨테이너에 MySQL에 mapping하기
    app.module.ts
  5. import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { AppController } from './app.controller'; import { AppService } from './app.service'; @Module({ imports: [ TypeOrmModule.forRoot({ type: 'mysql', host: 'localhost', port: 3306, username: 'root', password: 'root', database: 'workout', entities: [__dirname + '/apis/**/*.entity.*'], synchronize: true, logging: true, }), ], controllers: [AppController], providers: [AppService], }) export class AppModule {}

에러 발생 과정

Docker-compose를 통해 서버와 데이터베이스는 문제없이 실행되었음
그런데 TypeORM을 통해 entity를 적용하던 과정에서 에러 발생
에러메시지

Error: connect ECONNREFUSED 0.0.0.0:3306

에러 원인

MySQL에 접근할 때 host: 'localhost'('127.0.0.1')로 접근했는데 node의 3306 포트가 MySQL의 3306 포트로 연결이 되지 않았으므로, localhost로 접근하지 않고, MySQL의 ip로 접근을 해야 한다.
Docker에 존재하는 MySQL ip 확인하는 명령어

docker inspect <container_id>

"IPAddress": "172.18.0.2" 라는 걸 찾아볼 수 있다.

최종 해결 코드

app.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: '172.18.0.2',
      port: 3306,
      username: 'root',
      password: 'password',
      database: 'workout',
      entities: [__dirname + '/apis/**/*.entity.*'],
      synchronize: true,
      logging: true,
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
반응형