Docker와 Docker Compose로 일관성 있는 환경 구축하기
개발, 테스트, 운영 환경에서 동일하게 동작하는 Django 애플리케이션 환경을 Docker 컨테이너로 구축하여 "내 컴퓨터에서는 잘 됐는데..." 문제를 해결하고 팀원 간 환경 불일치를 방지
Docker 사용 이유
환경 불일치 문제 해결
팀원 간의 Python 버전, OS별 라이브러리 차이 해결
복잡한 개발 환경 설정 과정 단순화
개발 환경과 운영 환경 차이로 인한 배포 후 에러 방지
Docker 핵심 개념
컨테이너: 애플리케이션과 실행 환경을 격리된 공간에 패키징
이미지: 컨테이너 실행을 위한 패키지
Docker Compose: 여러 컨테이너를 하나의 파일로 정의하고 관리
Dockerfile 작성
기본 구조
FROM python:3.11-slim
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000"]최적화 팁
slim 버전 사용으로 이미지 크기 감소
requirements.txt 먼저 복사 후 코드 복사로 빌드 캐시 활용
.dockerignore 파일로 불필요한 파일 제외
Docker Compose 환경 구축
개발 환경 구성
version: '3.8'
services:
db:
image: postgres:15-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=${DB_NAME}
app:
build: .
volumes:
- .:/app
ports:
- "8000:8000"
command: python manage.py runserver 0.0.0.0:8000
depends_on:
- db
volumes:
postgres_data:환경변수 관리
.env 파일로 민감 정보 분리
운영 환경에서는 AWS Secrets Manager 등 전문 도구 사용 권장
운영 환경 아키텍처
Nginx + Gunicorn 구성
Gunicorn: Python WSGI 서버로 Django 요청 병렬 처리
Nginx: 리버스 프록시로 정적 파일 처리, 로드 밸런싱, SSL 암호화
운영 환경 특징
코드 볼륨 마운트 제거
정적/미디어 파일 볼륨 분리
Health Check를 통한 서비스 상태 모니터링
Graceful Shutdown 처리로 안전한 서비스 종료
실무 핵심 팁
보안 및 안정성
민감 정보는 전용 서비스에서 관리
Multi-Stage Build로 운영용 이미지 최적화
DB 연결 대기 로직 추가로 안정적인 서비스 시작
성능 최적화
Docker 레이어 캐시 활용으로 빌드 속도 향상
불필요한 파일 제외로 이미지 크기 감소
Health Check로 실제 서비스 가용성 확인
Last updated
