개발 프로젝트가 커질수록 단순한 로컬 환경으로는 전체 시스템을 재현하기가 어렵습니다. 특히 백엔드, 프론트엔드, 데이터베이스, 캐시 서버 등 여러 서비스를 동시에 실행해야 하는 경우, 개발환경 구성은 더욱 복잡해지죠. 이런 문제를 해결해주는 도구가 바로 Docker Compose입니다. 이 글에서는 Docker Compose를 사용해 복잡한 개발환경을 효율적으로 구성하는 방법을 단계별로 소개합니다.
Docker Compose란 무엇인가?
Docker Compose는 여러 개의 컨테이너 서비스를 정의하고 동시에 실행할 수 있도록 돕는 도구입니다. 개발자가 모든 서비스를 수동으로 설정하고 실행하는 수고를 덜어주며, 하나의 설정 파일(docker-compose.yml
)로 전체 환경을 관리할 수 있게 합니다.
주요 장점
- 모든 서비스를 하나의 파일로 정의
- 명령어 한 줄로 전체 서비스 시작/종료 가능
- 컨테이너 간 네트워크 자동 구성
- 환경 설정을 팀원 간 공유 가능
복잡한 환경 예시: 웹 애플리케이션 스택
다중 서비스 구성
예를 들어 다음과 같은 구성의 애플리케이션이 있다고 가정해 봅시다:
- Node.js 백엔드 API 서버
- React 기반 프론트엔드 애플리케이션
- PostgreSQL 데이터베이스
- Redis 캐시 서버
- NGINX 리버스 프록시 서버
기본 Compose 예시
version: '3.9'
services:
backend:
build: ./backend
ports:
- "4000:4000"
environment:
- NODE_ENV=development
depends_on:
- db
- redis
frontend:
build: ./frontend
ports:
- "3000:3000"
depends_on:
- backend
db:
image: postgres:13
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: appdb
volumes:
- pgdata:/var/lib/postgresql/data
redis:
image: redis:alpine
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
depends_on:
- frontend
volumes:
pgdata:
실무 적용을 위한 고급 설정 팁
복잡한 환경에서 Compose를 더욱 효율적으로 활용하려면 몇 가지 고급 기능을 함께 사용하는 것이 좋습니다.
1. .env 파일 사용
환경 변수는 코드와 분리해 관리하는 것이 좋습니다. .env
파일에 데이터베이스 비밀번호, 포트 정보 등을 저장하고 Compose 파일에서 불러올 수 있습니다.
2. 헬스 체크 설정
서비스 간 의존성이 있는 경우, depends_on
외에도 헬스 체크 기능을 사용하면 더 안정적인 시작 순서를 보장할 수 있습니다.
3. 데이터 유지 관리
데이터베이스나 Redis 등의 서비스는 Docker 볼륨을 통해 데이터를 보존할 수 있도록 설정해야 합니다. 이를 통해 컨테이너 재시작 시에도 데이터가 유지됩니다.
4. 개발/운영 환경 분리
docker-compose.override.yml
파일을 사용하면 개발과 운영 환경에 따라 구성 파일을 분리해 관리할 수 있습니다.
디버깅 및 컨테이너 관리 팁
유용한 명령어
docker-compose logs -f [서비스명]
: 실시간 로그 확인docker-compose ps
: 현재 실행 중인 컨테이너 상태 확인docker exec -it [컨테이너명] bash
: 컨테이너 내부 진입docker-compose down -v
: 컨테이너 및 볼륨 전체 정리
이 외에도 --build
, --remove-orphans
등의 옵션을 활용하면 보다 유연하게 환경을 제어할 수 있습니다.
마무리: Compose로 환경 구성 자동화하기
Docker Compose는 복잡한 개발환경을 간단하고 일관되게 설정할 수 있는 강력한 도구입니다. 명령어 한 줄로 전체 스택을 시작하거나 종료할 수 있어, 초기 설정은 물론 유지 관리에도 큰 도움이 됩니다.
처음에는 조금 복잡하게 느껴질 수 있지만, 익숙해지면 개발 속도와 품질 모두에서 큰 향상을 경험할 수 있습니다. 여러분의 프로젝트에도 적용해 보세요. 로컬 환경에서의 생산성을 극대화하는 데 큰 도움이 될 것입니다.