티스토리 뷰

목차



    반응형

    목적 : 에러 해결 과정 기록

    구현하고자 했던 내용

    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 {}
    반응형