Nest.js를 배워보자/13. NestJS + Docker 배포하기

Docker Compose + MySQL (Local Development Environment)

_Blue_Sky_ 2025. 12. 3. 12:50
728x90

 

 

Docker Compose는 여러 개의 컨테이너(예: NestJS 애플리케이션, 데이터베이스, Redis 등)를 하나의 파일(docker-compose.yml)로 정의하고, 단일 명령어로 손쉽게 빌드, 실행, 관리할 수 있도록 해주는 도구입니다.

로컬 개발 환경에서 NestJS 앱과 MySQL 데이터베이스를 연동할 때 이 패턴을 사용하는 것이 가장 일반적이고 효율적입니다.

A. docker-compose.yml 기본 구조

다음은 NestJS 앱 컨테이너와 MySQL 데이터베이스 컨테이너를 함께 구동하는 docker-compose.yml 파일의 예시입니다.

# docker-compose.yml
version: '3.8'
services:
  # 1. NestJS 애플리케이션 서비스 정의
  app:
    # 1-1. 현재 디렉토리의 Dockerfile을 사용하여 이미지 빌드
    build:
      context: . 
      dockerfile: Dockerfile
    container_name: nestjs_app
    restart: always
    # 1-2. 포트 포워딩 (로컬의 3000번 포트로 접근 가능)
    ports:
      - "3000:3000"
    # 1-3. 환경변수 주입 (DB 접속 정보)
    environment:
      NODE_ENV: development
      DATABASE_HOST: database # Hostname은 아래 services의 이름과 일치
      DATABASE_PORT: 3306
      DATABASE_USERNAME: user # DB 접속 계정
      DATABASE_PASSWORD: password123!
      DATABASE_NAME: nest_db
    # 1-4. 의존성 정의
    depends_on:
      - database # database 서비스가 먼저 시작되도록 보장
    # 1-5. 로컬 코드와 컨테이너 코드 동기화 (개발 시 핫 리로딩 등에 유리)
    volumes:
      - .:/usr/src/app
      - /usr/src/app/node_modules # 호스트의 node_modules 동기화 방지

  # 2. MySQL 데이터베이스 서비스 정의
  database:
    image: mysql:8.0 # 사용할 공식 MySQL 이미지
    container_name: mysql_db
    restart: always
    # 2-1. 외부 포트 노출 (선택 사항: 로컬 툴로 접근 필요 시)
    # ports:
    #   - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword # Root 비밀번호
      MYSQL_USER: user 
      MYSQL_PASSWORD: password123!
      MYSQL_DATABASE: nest_db
    # 2-2. 데이터 지속성 확보 (컨테이너가 삭제되어도 데이터는 유지)
    volumes:
      - dbdata:/var/lib/mysql

# 3. Volume 정의 (데이터 지속성 유지)
volumes:
  dbdata:
728x90

B. 주요 연동 포인트

  1. 네트워크 (Hostname):
    • docker-compose는 서비스들을 동일한 내부 네트워크에 묶어줍니다.
    • app 서비스의 환경변수 DATABASE_HOST는 database 서비스의 이름인 database로 설정해야 합니다. 컨테이너들은 이 서비스 이름을 통해 서로 통신합니다.
  2. 환경변수 동기화:
    • database 서비스의 environment에 설정된 MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE 값과
    • app 서비스의 environment에 설정된 DATABASE_USERNAME, DATABASE_PASSWORD, DATABASE_NAME 값이 일치해야 NestJS 애플리케이션이 DB에 접속할 수 있습니다.
  3. 데이터 지속성 (Volumes):
    • volumes 섹션에 정의된 dbdata 볼륨을 MySQL 컨테이너의 데이터 저장 경로(/var/lib/mysql)에 마운트하여, 컨테이너를 재생성해도 DB 데이터가 손실되지 않도록 합니다.
728x90

C. 실행 명령어

작성된 docker-compose.yml 파일을 사용하여 모든 서비스를 한 번에 빌드하고 실행합니다.

# Dockerfile이 있는 디렉토리에서 실행
docker-compose up --build 

 

728x90