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. 주요 연동 포인트
- 네트워크 (Hostname):
- docker-compose는 서비스들을 동일한 내부 네트워크에 묶어줍니다.
- app 서비스의 환경변수 DATABASE_HOST는 database 서비스의 이름인 database로 설정해야 합니다. 컨테이너들은 이 서비스 이름을 통해 서로 통신합니다.
- 환경변수 동기화:
- database 서비스의 environment에 설정된 MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE 값과
- app 서비스의 environment에 설정된 DATABASE_USERNAME, DATABASE_PASSWORD, DATABASE_NAME 값이 일치해야 NestJS 애플리케이션이 DB에 접속할 수 있습니다.
- 데이터 지속성 (Volumes):
- volumes 섹션에 정의된 dbdata 볼륨을 MySQL 컨테이너의 데이터 저장 경로(/var/lib/mysql)에 마운트하여, 컨테이너를 재생성해도 DB 데이터가 손실되지 않도록 합니다.
728x90
C. 실행 명령어
작성된 docker-compose.yml 파일을 사용하여 모든 서비스를 한 번에 빌드하고 실행합니다.
# Dockerfile이 있는 디렉토리에서 실행
docker-compose up --build
728x90
'Nest.js를 배워보자 > 13. NestJS + Docker 배포하기' 카테고리의 다른 글
| CI/CD 구성 예시 (Continuous Integration/Continuous Deployment) (0) | 2025.12.03 |
|---|---|
| 환경변수 관리 (0) | 2025.12.03 |
| Dockerfile 구성 (0) | 2025.12.03 |