오류코드

[DevOps 09] Docker Compose로 Django, DB, Redis 한 번에 올리기

jumemory 2025. 9. 3. 11:48

 

[DevOps 09] Docker Compose로 Django, DB, Redis 한 번에 올리기

지난 시간에는 Dockerfile로 Django 이미지를 만들었습니다. 하지만 실제 서비스는 DB도 필요하고 캐시 서버도 필요하죠. 이 여러 개의 컨테이너를 일일이 docker run으로 띄우는 건 매우 번거로운 일입니다. Docker Compose는 이 모든 설정을 yaml 파일 하나로 정의하고 관리하게 해줍니다.


1. Docker Compose란 무엇인가?

Docker Compose는 다중 컨테이너 애플리케이션을 정의하고 실행하기 위한 도구입니다.

  • 설정의 문서화: 네트워크, 볼륨, 환경 변수 등 복잡한 실행 옵션을 파일로 기록합니다.
  • 단일 명령어 제어: docker-compose up 한 번으로 모든 서비스를 동시에 띄울 수 있습니다.
  • 격리된 환경: 프로젝트별로 독립적인 가상 네트워크를 생성하여 컨테이너끼리 안전하게 통신하게 합니다.

2. 실전 docker-compose.yml 작성법

프로젝트 루트에 파일을 생성하고 아래 구조를 작성합니다. (2026년 기준 최신 표준 규격 사용)

YAML
 
version: '3.8'

services:
  # 1. 데이터베이스 서비스 (PostgreSQL)
  db:
    image: postgres:15-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_DB=my_django_db
      - POSTGRES_USER=my_user
      - POSTGRES_PASSWORD=my_password
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U my_user -d my_django_db"]
      interval: 5s
      timeout: 5s
      retries: 5

  # 2. 캐시 서비스 (Redis)
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

  # 3. 웹 애플리케이션 서비스 (Django)
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    environment:
      - DATABASE_URL=postgres://my_user:my_password@db:5432/my_django_db
      - REDIS_URL=redis://redis:6379/1
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started

volumes:
  postgres_data:

3. 핵심 설정 포인트 (심화 분석)

① 볼륨(Volumes)의 중요성

컨테이너는 삭제되면 내부 데이터도 사라집니다. postgres_data:/var/lib/postgresql/data/ 설정을 통해 컨테이너가 꺼져도 DB 데이터가 내 컴퓨터(Host)에 안전하게 보존되도록 합니다.

② 서비스 이름 기반 통신

DATABASE_URL을 보면 호스트 주소가 localhost가 아닌 **db**로 되어 있습니다. Docker Compose 네트워크 안에서는 서비스 이름이 곧 도메인 이름이 됩니다. Django는 db라는 이름만으로 PostgreSQL 컨테이너를 찾아갈 수 있습니다.

③ depends_on & healthcheck

Django는 DB가 완전히 켜지기 전에 접속을 시도하면 에러가 납니다. healthcheck를 통해 DB가 '준비 완료' 상태인지 확인하고, depends_on을 통해 그 이후에 Django를 실행하도록 순서를 보장합니다.


4. Docker Compose 주요 명령어

이제 터미널에서 다음 명령어를 사용해 보세요.

  • docker-compose up -d: 모든 서비스를 백그라운드(-d)에서 실행합니다.
  • docker-compose logs -f: 실행 중인 컨테이너들의 로그를 실시간으로 확인합니다.
  • docker-compose exec web python manage.py migrate: 실행 중인 Django 컨테이너 안에서 명령어를 실행합니다. (DB 마이그레이션 시 필수)
  • docker-compose down: 모든 컨테이너를 정지하고 삭제합니다. (데이터 볼륨은 유지됨)

5. [선생님의 심화 보충] 개발용 vs 배포용 Compose 분리

실무에서는 로컬 개발용(docker-compose.yml)과 실제 서버 배포용(docker-compose.prod.yml)을 따로 관리합니다.

  • 개발용: 코드 변경이 즉시 반영되도록 로컬 폴더를 컨테이너에 연결(bind mount)하고 runserver를 씁니다.
  • 배포용: 소스코드를 이미지 안에 고정하고, Gunicorn을 사용하며 보안을 강화합니다.

✍️ 블로그 작성을 위한 마지막 조언

독자들에게 **"이제 환경 설정 지옥에서 해방되었습니다"**라고 축하의 인사를 건네보세요. docker-compose up 명령어 하나로 Django와 DB가 톱니바퀴처럼 맞물려 돌아가는 모습을 캡처해서 보여주면 독자들이 훨씬 직관적으로 이해할 것입니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

판다스

문제의 본질: Series.apply(내 함수) 내부에서 정규식 split이 실행될 때, 문자열이 아닌 값(특히 NaN → float) 을 받으면서 TypeError: expected string or bytes-like object가 발생.

'오류코드' 카테고리의 다른 글

깃오류  (1) 2025.09.16
스터디 1 오류코드  (0) 2025.06.11