Docker

[Docker] Nestjs와 Mysql 연결 (Container 간 연결)

hanrabong 2022. 3. 12. 22:07

 

 Docker-compose를 이용하면 여러 개의 컨테이너로 구성된 서비스들을 관리할 수 있습니다. 여러 개의 컨테이너로 구성된 서비스들끼리 연결하는 경우도 종종 있습니다. 저의 서비스의 경우 mysql과 Nest.js를 연동을 하려고 합니다. 연동을 할 때 어떤 점을 고려해야 하는지 간단하게 얘기해보겠습니다.

 

 

 먼저, Docker에 대해서 알고 있어야 합니다. Docker는 간략히 말해 container 단위로 프로세스들을 격리하기 때문에, container끼리 영향을 주지 않습니다. 따라서 컨테이너끼리 연결을 하고자 한다면 docker network를 설정해주어야 합니다. Network에 대한 내용은 다른 블로그에도 정리가 잘 되어 있고 공식 document에도 정리가 잘되어 있으니 참고하면 되겠습니다.

 

 

 

Docker-compose.yml 파일은 다음과 같습니다.

version: "3.7"
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    networks:
      - febnine-net
    depends_on:
      - mysql
  mysql:
    container_name: febnine-mysql
    # mac m1칩의 경우
    platform: linux/x86_64
    image: mysql
    env_file:
      - .env.production
    ports:
      -  "3306:3306"
    networks:
      - febnine-net
    volumes:
      - mysql:/var/lib/mysql
volumes:
  mysql:
networks:
  febnine-net:

 

 위의 코드를 보면 맨 밑에 networks라고 되어 있고 febnine-net이라고 적혀 있는것을 볼 수 있습니다. 그리고 web과 mysql에 networks 파트에 febnine-net라고 적힌 것을 볼 수 있습니다. 간략히 말해 docker에서 febnine-net 명칭의 network를 만들고 이 network를 통해서 febnine-mysql이라고 불리는 mysql container와 web container가 연결되어 있다는 것을 말합니다. 이렇게 하면 network 설정은 끝입니다.

 

그럼 이제 web container 내부 코드에서 mysql과 연결을 시켜야 합니다. 연결 시키는 코드를 살펴 보겠습니다.

 

 

다음은 nest.js에서 mysql을 연결하는 코드입니다. Nest.js에서 많이 사용하는 typeorm을 사용하여 연결을 하고 있습니다.

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


@Module({
  imports: [
    ConfigModule.forRoot({
      envFilePath:
        process.env.NODE_ENV === 'production'
          ? '.env.production'
          : '.env.development',
      isGlobal: true,
    }),
    TypeOrmModule.forRoot({
      type: 'mysql', //다른 DB 사용 가능
      host: process.env.MYSQL_HOST,
      port: parseInt(process.env.MYSQL_PORT, 10),
      username: process.env.MYSQL_USER,
      password: process.env.MYSQL_PASSWORD,
      database: process.env.MYSQL_DATABASE,
      entities: ['dist/**/*.entity{.ts,.js}'],
      timezone: '+09:00',
      synchronize: true,
      autoLoadEntities: true,
      logging: true,
      logger: 'file',
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

 

 위의 코드를 보면 host, port 등 여러 메타 데이터를 설정하고 있는것을 볼 수 있습니다. 여기서 중요한 부분은 host파트 입니다. host의 경우 mysql container와 연결을 하는 것이기에 localhost나 127.0.0.1로 설정을 하면 안됩니다. localhost나 127.0.0.1로 설정을 할 경우 web container 내부의 localhost를 찾기에 당연히 연결이 안된다는 오류가 나오게 됩니다. 따라서 host에는 위의 mysql container 이름을 기입해주면 됩니다. 그럼 연결을 할 수 있습니다.

 

 

※ 혼자 공부하면서 정리한 내용이기에 잘못된 내용 지적이나 굼금한 점 댓글 달아주세요

 

 

 

참고자료

https://stackoverflow.com/questions/53250559/connecting-nodejs-docker-container-to-a-mysql-docker-container-docker-compose

 

Connecting NodeJS Docker container to a MySQL Docker container - docker-compose 3

When I try to connect two docker containers on the same machine, one running a node.js server and the other running mysql dbms I get the following error: (node:32) UnhandledPromiseRejectionWarning:

stackoverflow.com

 

'Docker' 카테고리의 다른 글

[Docker] Docker Swarm이란? (2)  (0) 2022.04.14
[Docker] Docker Swarm이란? (1)  (0) 2022.04.06