본문 바로가기
카테고리 없음

제로부터 DevOps까지 8편 - Node.js, DB, Nginx 통합 실습

by 타임 플레그 2025. 5. 29.
반응형

Docker Compose로 Node.js, DB, Nginx 통합 실습

“하나의 명령어로 API, DB, Nginx까지 모두 실행됩니다.”
이제 우리는 진짜 서비스를 구성하는 실전 단계로 들어섭니다. 이번 편에서는 Docker Compose를 통해 멀티 컨테이너 서비스를 구성하는 법을 배우게 됩니다.


🧭 왜 Docker Compose가 필요할까?

Docker는 컨테이너 하나를 관리하는 데 뛰어난 도구입니다. 하지만 실무에서는 서비스가 보통 하나로 끝나지 않습니다.

  • Node.js API 서버
  • MySQL 또는 MongoDB 데이터베이스
  • Nginx 프록시 서버

이처럼 서로 다른 기능을 가진 컨테이너 여러 개를 한꺼번에 관리하고 실행하려면, Docker Compose가 필요합니다.

Docker Compose의 장점

  • docker-compose.yml 하나로 모든 설정 관리
  • 여러 컨테이너를 하나의 네트워크로 연결
  • 환경변수, 볼륨, 포트 등 쉽게 정의 가능
  • 로컬과 서버 환경 구성이 동일하게 유지됨
  • 하나의 명령어로 전체 서비스 일괄 재시작 및 중단 가능

📦 실무에서 흔한 멀티 컨테이너 구조 예시

대부분의 서비스는 다음과 같은 구조를 가집니다:

[Client] → [Nginx] → [Node.js API] → [DB]

이 중 하나라도 다운되면 전체 서비스 품질에 영향을 줍니다.
따라서 모든 구성 요소를 유기적으로 함께 관리하는 오케스트레이션 도구가 필요한 것이죠.


⚙️ 프로젝트 구조 설계

project-root/
├── backend/ # Node.js Express API
│ ├── Dockerfile
│ └── app.js
├── db/ # DB 데이터 저장 볼륨
├── nginx/ # Nginx 설정 파일
│ └── default.conf
├── docker-compose.yml
└── .env

📄 docker-compose.yml 작성 예시

version: '3.8'
 
services:
api:
build: ./backend
ports:
- "3000:3000"
depends_on:
- db
environment:
- DB_HOST=db
 
db:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- ./db:/var/lib/mysql
 
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- api

이 설정 파일 하나로 전체 인프라를 구축할 수 있습니다.
예전에는 각각 명령어로 실행하고 연결했어야 했지만, Compose는 이 과정을 한 줄로 단순화합니다.


🌐 Nginx 설정 예시

nginx/default.conf:

server {
listen 80;
 
location / {
proxy_pass http://api:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}

이 설정은 외부에서 오는 요청을 Nginx가 받아 내부의 api:3000 컨테이너로 전달합니다.


🔑 환경변수 .env 사용 예시

DB_PASSWORD=example
NODE_ENV=production
  • 보안과 유연성 모두를 확보할 수 있는 방식입니다.
  • 코드에서 민감 정보를 분리하고, .env .gitignore에 추가하는 것이 좋습니다.

🏗️ 실행 및 테스트

  1. 전체 컨테이너 빌드
docker-compose build
  1. 실행 시작
docker-compose up -d
  1. 상태 확인
docker-compose ps
  1. 로그 확인
docker-compose logs -f
  1. 중지 및 정리
docker-compose down

Tip:
down으로 내릴 때 -v 옵션을 쓰면 볼륨까지 삭제되니 주의하세요.


🚀 EC2에 적용하기

  1. EC2에 전체 폴더 전송 (scp or git clone)
  2. Docker & Compose 설치 확인
  3. docker-compose up -d로 실행

주의할 점:

  • EC2는 퍼블릭 IP 사용 시 방화벽과 보안 그룹 설정을 명확히 해야 합니다
  • .env, 데이터 볼륨 폴더는 직접 서버에서 구성하세요

🧪 트러블슈팅 & 팁

문제원인해결 방법

DB 연결 실패 컨테이너명 또는 포트 오류 depends_on, DB_HOST=db 확인
Nginx 502 오류 API 컨테이너 미기동 docker-compose ps 상태 확인
로그 안 나옴 컨테이너 내부 에러 docker-compose logs 로 추적
포트 충돌 호스트 포트 중복 사용 docker ps, 다른 서비스 포트 확인
데이터 초기화 안 됨 볼륨 캐시 문제 docker volume rm 으로 수동 삭제 후 재실행

🧭 회고: 이제 진짜 서비스다

우리는 지금 하나의 프로젝트에 API, DB, 프록시를 구성했습니다.
이는 바로 실제 SaaS 서비스의 기본 구조이기도 합니다.

Docker Compose는 단순한 자동 실행 도구가 아니라, 복잡한 서비스 구조를 손쉽게 로컬 및 서버에서 재현할 수 있는 강력한 무기입니다.

팀원과 환경을 일치시킬 수 있다는 점에서 협업에도 큰 도움이 되며,
이는 곧 실무 적응력으로 이어집니다.


🔮 다음 편 예고: 운영 환경에서의 Docker, 모니터링, 로깅 시스템 구성

이제 서비스는 돌아가고 있습니다. 하지만 실제 운영 환경에서는 다음을 고려해야 합니다:

  • 에러 추적 (로그 수집)
  • 사용량 확인 (모니터링)
  • 장애 알림 (Alert)

이를 위해 우리는 모니터링 도구 (Grafana, Prometheus)  로그 수집 (ELK Stack) 에 대해 배워보게 됩니다.


📦 이제 우리는 단일 앱이 아닌 ‘서비스 아키텍처’를 다루고 있습니다.
운영의 문이 열렸습니다.

반응형