본문 바로가기

DevOps/Docker

[Docker] 로컬 환경에서 Django와 MySQL을 docker-compose로 구동 (with. .env파일생성) (1)

본인이 공부하기 위해 작성한 것이므로 오류가 있을 수 있습니다.

 

1. .env 파일 생성

 mange.py 파일이 있는 경로에서 .env 파일을 새로 생성한다.

pip install django-environ # 설치​
위의 라이브러리를 설치한 다음, settings.py를 수정해야한다.

# config/settings.py

import environ, os


env = environ.Env(
    DEBUG=(bool, False)
)

# 경로에 있는 .env 파일 연동
environ.Env.read_env(
    env_file=os.path.join(BASE_DIR, '.env')
)

# 장고 스페셜 키를 .env 파일에서 가져오기
SECRET_KEY = env('SECRET_KEY')​
위의 코드를 settings.py 파일을 수정.

# .env 파일

DEBUG=1
SECRET_KEY="KEY"​

.env 파일을 새로 생성하고 위의 코드들을 입력해서 저장한다. 
추가적으로 DB의 정보들과 allow_host도 입력이 가능하다.

 

2. Dockerfile 생성

도커파일을 만들기 전에, 설치했던 모든 라이브러리를 저장할 txt파일을 만들 것이다.
 pip freeze > requirements.txt​

그 다음에, 도커파일을 생성한다.

FROM python:3.9.0
ENV PYTHONUNBUFFERED=1

COPY . /app/server/madup

WORKDIR /app/server/madup

RUN apt-get update
RUN apt-get install -y --no-install-recommends gcc
RUN pip install -r requirements.txt​
FROM python:3.9.0 : 도커가 파이썬 기본 이미지를 불러온다.
ENV PYTHONDONTWRITEBYTECODE 1 : 도커를 이용할 때 .pyc 파일이 필요하지 않으므로 생성하지 않도록 한다.
ENV PYTHONUNBUFFERED=1 : 파이썬 로그가 버퍼링 없이 즉각적으로 출력하게 만든다.
COPY . /app/server/madup : 로컬 컴퓨터의 현재 위치에 있는 파일을 모두 작업 폴더(WORKDIR)로 복사한다.
WORKDIR /app/server/madup : 프로젝트의 작업 폴더를 /app/server/madup으로 지정한다.
RUN apt-get updateRUN apt-get install -y --no-install-recommends gccRUN pip install -r requirements.txt
: requirements.txt에 나열된 라이브러리를 설치한다.

 

2. docker-compose.yml 파일 생성

도커 컴포즈 파일을 사용하면 컨테이너 여러 개를 한 번에 실행시킬 수 있다.

# docker-compose.yml

# version: '3'

services:
  web:
    build: .
    command:
      - bash
      - -c
      - |
        python manage.py migrate
        python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/app/server/madup
    ports:
      - 8000:8000
    env_file:
      - ./.env
    depends_on:
      - db
    restart: always

  db:
    image: mysql:5.7
    platform: linux/amd64
    container_name: mysql
    volumes:
      - data:/var/lib/mysql/
    environment:
      MYSQL_DATABASE: 'madup'
      MYSQL_USER: 'root'
      MYSQL_ROOT_PASSWORD: '1234'
      MYSQL_PASSWORD: '1234'
    ports:
      - 3306:3306
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    restart: always


volumes:
  data:​

version: '3' : 도커 컴포즈 파일 포맷을 최신 버전으로 사용하겠다는 의미이다. 특별한 이유가 없다면 3으로 설정.
build: . : 현재 폴더를 build한다. 앞에서 만든 도커파일이 현재 폴더에 있으므로 이 파일을 이용해 컨테이너 이미지를 만든다.
command: - bash - -c - | python manage.py migrate python manage.py runserver 0.0.0.0:8000
: command로 터미널에서 직접 입력했던 서버 실행 명령을 대신한다.
volumes : 로컬 컴퓨터의 폴더와 도커의 폴더를 연결한다.
env_file: - ./.env : 다른 사람들에게 보이지 않도록 생성했던 .env 파일을 지정.
. . .

추가적으로 settings.py의 DATABASE 옵션도 변경해주어야 한다.
# config.settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'madup',
        'USER': 'root',
        'PASSWORD': '1234',
        'HOST': 'db',   # <--- 이 부분! docker-compose의 db: 이름으로 정해둔 부분으로 이름을 바꾼다.
        'PORT': '3306',
        'OPTIONS': {
            # 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",  # 추가, 만약에 이 부분 때문에 오류가 난다면, 이 라인을 지우고 다시 시도해주세요.
            'charset': 'utf8mb4',
            'use_unicode': True,
        },
    }
}​

 

 

3. 실행

# 실행
docker-compose up -d

# 중지
docker-compose down

# 빌드 및 실행
docker-compose up -d --build