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
반응형
'웹 프로그래밍' 카테고리의 다른 글
[배포해보기 (13)] Stack을 위한 yml파일 작성 (0) | 2021.07.17 |
---|---|
[배포해보기 (12)] Docker Stack, Docker Swarm 의 이해 (0) | 2021.07.16 |
[배포해보기 (10)] collectstatic; static file 받지 못하는 문제의 해결 (0) | 2021.06.29 |
[배포해보기 (9)] Static 의 이해 (0) | 2021.06.29 |
[배포해보기 (8)] Docker Network의 이해 및 구현 (0) | 2021.06.28 |