Backend/Django

Django docker-compose 에서 로컬, 도커 환경 분리하기

Say simple 2024. 3. 16. 16:18
728x90
반응형

Django를 운영하기 위해 로컬, 도커 환경을 분리하게 되었다.

먼저, settings.py를 분해해보자. 아직은 settings.py를 삭제하지 말고 먼저 settings 폴더 아래와 위와 같이 만들어준다.

각 파일은 아래와 같다. 각 환경 파일에서 base.py의 환경 파일을 import 받아 사용하는 구조이다.

  • base.py: 기본 환경 파일
  • docker.py: 도커 환경 파일
  • local.py: 로컬 환경 파일

base.py를 아래와 같이 작성해준다. 시크릿 키에는 자신의 장고 프로젝트를 생성할 때 생성된 시크릿 키를 넣는다.

from .base import *  # noqa: F403, F40

DEBUG = False

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = "YOUR_KEY"

ALLOWED_HOSTS = ["*"]

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": "admin",
        "USER": "postgres",
        "PASSWORD": "postgres",
        "HOST": "172.17.0.1",
        "PORT": "5432",
    },
}

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://redis:6379/0",
    }
}

RATELIMIT_USE_CACHE = "default"

local.py도 비슷하다. 로컬 환경에서 사용할 환경 값들을 넣어준다.

from .base import *  # noqa: F403, F40

DEBUG = True

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = "YOUR_KEY"

ALLOWED_HOSTS = ["*"]

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": "admin",
        "USER": "postgres",
        "PASSWORD": "postgres",
        "HOST": "localhost",
        "PORT": "5432",
    },
}

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://localhost:6379/0",
    }
}

RATELIMIT_USE_CACHE = "default"

.gitignore에 아래와 같이 추가해준다. 해당 환경 설정 파일들엔 숨겨야 하는 환경 설정 값들도 모두 넣어준다. 나의 경우엔 시크릿 키와 디비 설정, 레디스 설정 등을 넣었다.

# settings
local.py
docker.py

완료 됐으면 이제 환경 설정 파일을 적용해준다. 아래와 같이 docker-compose 파일에 환경 전달 인자를 추가해준다.

version: '3.9'

services:
  app:
    container_name: app
    restart: "no"
    build:
      context: .
      args:
        - DJANGO_SETTINGS_MODULE=app.settings.docker
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - ./app:/app/
    working_dir: /app
    ports:
      - "8000:8000"
    networks:
      - app-network
    depends_on:
      - db
      - redis
      
  db:
    container_name: db
    image: postgres:15.6-alpine
    environment:
      POSTGRES_DB: admin
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    ports:
      - "5432:5432"
    volumes:
      - ./postgres/data:/var/lib/postgresql/data/
    networks:
      - app-network

  redis:
    container_name: redis
    image: redis:7.2.4-alpine
    ports:
      - "6379:6379"
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

이제 로컬 설정을 해준다. app(django project의 이름) 폴더 하위 asgi.py 파일에서 아래와 같이 변경해준다.

"""
ASGI config for helloworld project.

It exposes the ASGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/
"""

import os

from django.core.asgi import get_asgi_application

# 장고 환경 모듈 경로 설정
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings.local")

application = get_asgi_application()

app 폴더의 wsgi.py 파일도 동일하게 변경해준다.

"""
WSGI config for helloworld project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/
"""

import os

from django.core.wsgi import get_wsgi_application

# 장고 환경 모듈 경로 설정
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings.local")

application = get_wsgi_application()

이제 로컬에서 장고를 실행 한다. 아래와 같이 설정 모듈이 변경 되었음을 알 수 있다.

이제 도커에서 실행해보자. 마찬가지로 역시 설정 모듈이 변경 된 것을 확인할 수 있다.

이제 위의 환경 분리를 응용하면 prod, test, dev 등의 환경을 만들 수 있다. 이를 통해 운영 및 개발 환경을 분리할 수 있게 된다.

728x90
반응형