nest프로젝트에 docker를 통해서 mysql 사용하기

송인성·2021년 10월 24일
0
nest new nest-mysql

을 통해서 프로젝트를 하나 만든다.

이제 해야할 일은 docker의 mysql Image를 다운로드 하는 것이다.
제가 사용하는 하드웨어의 경우에는 m1 cpu를 사용하기때문에 amd cpu기반의 mysql이미지를 다운로드 받습니다.

mac m1 cpu의 경우

docker run --rm --platform linux/amd64 -it mysql:5.7

일반 intel cpu의 경우

docker pull mysql:8.0.17

을 사용하여 mysql image를 다운로드 받습니다.
여기서 질문이 있을 수 있습니다. intel칩의 경우 docker pull을 해서 image를 받는데 왜 mac의 m1은 docker pull이 아니라 docker run으로 받느냐 이경우에는 cpu의 차이로 이러한 문제가 나타나는 것으로 보입니다.

저는 m1을 사용하기때문에 m1을 가지고 터미널 창에서

docker run --rm --platform linux/amd64 -it mysql:5.7

를 입력완료 하였다면
mysql image가 생성된것을 확인할 수 있습니다. 그러나 run을 하면서 mysql

	- MYSQL_ROOT_PASSWORD
    - MYSQL_ALLOW_EMPTY_PASSWORD
    - MYSQL_RANDOM_ROOT_PASSWORD

와 같은 정보를 입력하지 않았기때문에

2021-10-24 05:22:09+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.36-1debian10 started.
2021-10-24 05:22:10+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2021-10-24 05:22:10+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.36-1debian10 started.
2021-10-24 05:22:11+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
    You need to specify one of the following:
    - MYSQL_ROOT_PASSWORD
    - MYSQL_ALLOW_EMPTY_PASSWORD
    - MYSQL_RANDOM_ROOT_PASSWORD

와 같은 에러가 발생합니다. 따라서 이부분은 docker-compose를 통해서 설정하도록 하겠습니다.

docker-compose.yml

version: '3'
services:
  local-db:
    image: library/mysql:5.7
    container_name: [컨테이너 이름]
    restart: always
    ports:
      - [로컬 포트]:3306
    environment:
      MYSQL_ROOT_PASSWORD: [루트 유저 비밀번호]
      TZ: Asia/Seoul
    volumes:
      - ./db/mysql/data:/var/lib/mysql
      - ./db/mysql/init:/docker-entrypoint-initdb.d
    platform: linux/x86_64

docker-compose.yml 적용예시

version: '3'
services:
  local-db:
    image: library/mysql:5.7
    container_name: nest-mysql
    restart: always
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: root
      TZ: Asia/Seoul
    volumes:
      - ./db/mysql/data:/var/lib/mysql
      - ./db/mysql/init:/docker-entrypoint-initdb.d
    platform: linux/x86_64

위와 같이 작성을 해주고 난후 아직

docker-compose up

를 입력하지말고, nestjs의 typeorm을 사용하여 해당 nest-mysql을 연결하는 작업을 진행하겠습니다.

$ npm install --save @nestjs/typeorm typeorm mysql2

를 이용해서 nest프로젝트에서 위의 코드를 입력해줍니다.

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: 'localhost',
      port: 3306,
      username: 'root',
      password: 'root',
      database: 'mysql',
      entities: [],
      synchronize: true,
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

와같이 연결해줍니다. 그리고 나서 이제

docker-compose up -d

를 통해서 mysql을 열어주고

npm run start

를 통해서 nest프로젝트가 mysql과 제대로 연결되어있는지 확인하는 작업을 가집니다.

profile
코드 한줄에 의미를 생각할 수 있는 개발자가 되어 가는중... 🧑🏻‍💻

0개의 댓글