[배포해보기 (11)] MariaDB container를 이용한 DB분리
웹 프로그래밍

[배포해보기 (11)] MariaDB container를 이용한 DB분리

728x90
반응형

현재로써는 django container안에 db 파일이 있어서 그 안에 데이터를 보관하고 있다. 그런데 만약에 이 컨테이너가 꺼지게된다? 이 데이터는 모두 사라질 것이다. 이 데이터를 컨테이너를 따로 분리할 필요가 있다.

 

데이터가 증발하는 걸 막기위해 volume을 이용할 것이다. 컨테이너의 생애주기와 상관없이 데이터가 유지될 수 있도록 한다.

 

1. 개발환경(Local)과 배포환경(Deploy)의 분리

 

현재 로컬환경에 settings.py 하나만 있다.

settings 디렉토리를 만들어 안에 deploy.py, local.py를 만들어주고 settings.py는 base.py로 rename해 안에 넣었다.

 

base.py

from pathlib import Path
import os, environ

# Build paths inside the project like this: BASE_DIR / 'subdir'.
from django.urls import reverse_lazy


BASE_DIR = Path(__file__).resolve().parent.parent

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'newsapp',
    'accountapp',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'oconnect.urls'


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'oconnect.wsgi.application'

# Password validation
# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_DIRS = [
    BASE_DIR / "static",
]

# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

LOGIN_REDIRECT_URL = reverse_lazy('newsapp:home') # reverse_lazy 깜빡하지 말고 import하기!
LOGOUT_REDIRECT_URL = reverse_lazy('accountapp:login')

 

local.py

from .base import *

env = environ.Env(
    # set casting, default value
    DEBUG=(bool, False)
)

# reading .env file
environ.Env.read_env(
    env_file=os.path.join(BASE_DIR, '.env')
)

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = env('SECRET_KEY')

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ['*']

# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

 

deploy.py

from .base import *

env = environ.Env(
    # set casting, default value
    DEBUG=(bool, False)
)

# reading .env file
environ.Env.read_env(
    env_file=os.path.join(BASE_DIR, '.env')
)

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = env('SECRET_KEY')

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False //배포환경엔 폴스

ALLOWED_HOSTS = ['*']

# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', //마리아디비가 mysql에서 나온거라 상관 ㄴ
        'NAME': 'django', //아무꺼나
        'USER': 'django', //아무꺼나
        'PASSWORD': '[비번]',
        'HOST': 'mariadb', //도커 컨테이너 이름
        'PORT': '3306', //마리아디비가 3306씀
    }
}

 

 

이대로 실행한다면 오류가 발생할 것.

 

-base.py에서 BASE_DIR 을 하나 더 올라가줘야함.

BASE_DIR = Path(__file__).resolve().parent.parent.parent

-manage.py 에서 세팅파일 위치 재설정

 

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'oconnect.settings')

원래 이랬는데 settings 위치가 바뀌었으므로 아래와 같이 바꿔주자

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'oconnect.settings.local')

 

2. create volume

 

3. mariadb container create 

> network: nginx-django

> volume

>ENV

앞서 deploy.py 와 맞춘 환경변수

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', //마리아디비가 mysql에서 나온거라 상관 ㄴ
        'NAME': 'django', //아무꺼나
        'USER': 'django', //아무꺼나
        'PASSWORD': '[비번]',
        'HOST': 'mariadb', //도커 컨테이너 이름
        'PORT': '3306', //마리아디비가 3306씀
    }
}

 

 

4. Dockerfile 수정

FROM python:3.9.0

WORKDIR /home/

RUN echo "testing"   //깃허브 수정했는데 캐시문제로 적용이안되고있어서 의미없는거 하나 적어줌

RUN git clone https://github.com/Aiden-Kwak/oconnect2021_ver4.git

WORKDIR /home/oconnect2021_ver4/

RUN pip install -r requirements.txt

RUN pip install gunicorn

RUN pip install mysqlclient //마리아디비랑 장고 컨택트시켜주기위한 라이브러리

RUN echo "[SECRETKEY]" > .env

RUN python manage.py collectstatic

EXPOSE 8000

CMD ["bash", "-c", "python manage.py migrate --settings=oconnect.settings.deploy && gunicorn oconnect.wsgi --env DJANGO_SETTINGS_MODULE=oconnect.settings.deploy --bind 0.0.0.0:8000"]
//--settings=oconnect.settings.deploy 이건 뭐냐면 앞서 manage.py에서 디폴트롤 settings.local로
바꿔놨으니까 도커파일에서 deploy.py쓰라고 알려주기 위함

 

5. docker image create

 

6. create container

>network: nginx-django

>volume

 

728x90
반응형