도커3

이지훈·2022년 4월 27일
0

디비를 연결해보자

우선 DB를 연결하려면 , RDS 사용할 때와 같이 로컬, 배포 환경을 분리시켜야한다.

나는 settings 디렉토리를 만들고 안에 기본이 되는 base환경, 그리고 나눠야하는 로컬, 배포 환경을 만들었다.

base는 그냥 settings.py랑 똑같다.


local 환경 세팅

from .base import *


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


# Take environment variables from .env file
environ.Env.read_env(os.path.join(BASE_DIR, '.env'))

# False if not in os.environ because of casting above
DEBUG = True

# Raises Django's ImproperlyConfigured
# exception if SECRET_KEY not in os.environ
SECRET_KEY = env('SECRET_KEY')

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

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

배포환경 세팅

from .base import *


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


# Take environment variables from .env file
environ.Env.read_env(os.path.join(BASE_DIR, '.env'))

# False if not in os.environ because of casting above
DEBUG = False

# Raises Django's ImproperlyConfigured
# exception if SECRET_KEY not in os.environ
SECRET_KEY = env('SECRET_KEY')

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

# maria db도 mysql이라서 똑같음
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': # potainer DB 이름
        'USER': # potainer env이름
        'PASSWORD': # env pw
        'HOST': # portainer 컨테이너 이름
        'PORT': '3306',
    }
}

바뀌는 것은 debug, db세팅 2개뿐이다.

세팅을 다했으면 manage.py도 바꿔준다.

보통 python manage.py runserver는 로컬환경을 돌리기위한 명령어이다. 배포환경은 gunicorn을 통해 백그라운드로 돌리니까 다른 세팅이 필요하다.

#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys


def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'pragmatic.settings.local')
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == '__main__':
    main()

원래 'pragmatic.settings' 로 되어있을 것이다.
pragmatic.settings.local 이라고 돌리고 싶은 세팅파일을 넣어준다.
-> 프로젝트명.디렉토리명.파일명이다.


마지막으로 도커파일을 수정해준다.

# 파이썬 이미지 다운로드
FROM python:3.9.0

WORKDIR /home/

# 캐시된 데이터를 변경사항 추가해줌 - 의미없는 명령어임
RUN echo "testing"

# 깃 저장소와 파일 디렉토리 이름이 같아야 쉬움
RUN git clone https://github.com/wlgns410/pragmatic.git


# root 위치
WORKDIR /home/pragmatic/

# 라이브러리 다 설치 -> 컨테이너 안이니까 가상환경 불필요
RUN pip install -r requirements.txt

RUN pip install gunicorn

# 우분투는 mysql이 없으니까 추가로 설치해줘야함
RUN pip install mysqlclient


# 이 마이그래이트를 cmd로 옮겨줌
# RUN python manage.py migrate

RUN python manage.py collectstatic

# 서버 포트 주소
EXPOSE 8000


# 마이그레이트와 런서버를 동시에 돌리게.
# manage.py가 local로 되어있는데, local -> deploy로 바꾸는 역할도 동시에 함 and gunicorn도 deploy 설정 추가해줘야함
CMD ["bash", "-c", "python manage.py migrate --settings=프로젝트명.settings.deploy && gunicorn 프로젝트명.wsgi --env DJANGO_SETTINGS_MODULE=프로젝트명.settings.deploy --bind 0.0.0.0:8000"]

마리아db 컨테이너를 만든다.

네트워크도 연결해주고

env에서 환경변수도 추가해주고

볼륨도 넣어준다.

그리고 포트도 3306 ->3306으로 넣어준다.


마지막으로 gunicorn 컨테이너를 만들어주고
볼륨, 네트워크 넣어주고 새로만든 이미지도 넣어준다.
(기존에 만든 gunicorn 컨테이너는 삭제한다.
어차피 컨테이너는 볼륨을 이용해서 만들기 때문에 본체는 사라지지 않는다.)


그리고 연결해보면, 끝.

profile
꾸준하게 🐌

0개의 댓글