Docker Compose 를 사용하여 Django 서버 띄우기

JungSungHo·2023년 5월 6일
0

Docker

목록 보기
1/6
post-thumbnail
  • 도커 컴포즈 파일을 통해 도커의 이미지들 끼리의 통신을 훨씬 편안하게 이어줄 수 있다.

dockerfile 작성

우서 도커파일을 작성해서 환경변수 및 필요한 소프트웨어를 추가합니다.

# syntax=docker/dockerfile:1
FROM python:3

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

WORKDIR /code

COPY requirements.txt /code/

RUN pip install -r requirements.txt

COPY . /code/
  • 이 도커파일을 python3 이미지를 기반으로 합니다.
  • PYTHONDONTWRITEBYTECODE와 PYTHONUNBUFFERED 환경 변수를 설정합니다. 이 변수들은 Python 애플리케이션을 실행할 때 일부 설정을 변경합니다.
  • WORKDIR 지시어는 현재 작업 디렉토리를 /code로 설정합니다.
  • requirements.txt를 /code/ 디렉토리로 복사합니다.
  • pip install 명령어를 실행하여 requirements.txt에 지정된 패키지들을 설치합니다
  • 현재 디렉토리의 모든 파일과 폴더를 /code/ 디렉토리로 복사합니다.

의 순서로 위의 도커파일은 이루어져 있다

필요패키지 목록 작성

필요한 패키지 목록은 requirements.txt 파일을 생성하고

Django>=3.0,<4.0
psycopg2>=2.8

를 작성해주고 작업디렉토리 상에 저장해주면 된다.

docker-compose file 작성

docker compose file 의 경우 얌파일이라고 부르고 확장자명은
(.yml)이다

services:
  db:
    image: postgres
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    environment:
      - POSTGRES_NAME=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    depends_on:
      - db

이 docker-compose.yml 파일은 두개의 서비스를 정의하는데 하나씩 알아보자

첫번쨰 서비스

  • 첫번째 서비스인 'db'는 postgres 이미지를 기반으로 한다.
  • 컨터이너 내부 데이터 디렉토리를 ./data/db 디렉토리와 볼륨으로 공유한다.
  • 이 서비스는 OSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD 환경 변수를 설정하여 PostgreSQL 데이터베이스 서버를 구성한다.

두번째 서비스

  • 두번째 서비스인 'web'은 현재 디렉토리의 Dockerfile을 기반으로 이미지를 빌드한다.
  • 이 서비스는 'python manage.py runserver 0.0.0.0:8000' 명령어를 실행하여 웹 서버를 시작한다.
  • 호스트의 현재 디렉토리를 컨테이너 내부의 /code 디렉토리와 볼륨으로 공유한다.
  • 이 서비스는 POSTGRES_NAME, POSTGRES_USER, POSTGRES_PASSWORD 환경 변수를 설정하여 데이터베이스에 연결한다.
  • db 서비스가 먼저 시작되도록 depends_on을 설정한다.

파일을 저장하고 닫습니다.

이제 본격적으로 django 웹서버를 띄워보자.

sudo docker compose run web django-admin startproject composeexample .

위 명령어를 통해 django 프로젝트를 생성한다.

  • web 은 Docker Compose 파일에 정의된 서비스 이름이고,
  • 'django-admin startproject' 명령어는 컨테이너 내부에서 실행된다.
  • 'django-admin startproject' 명령어는 django 프로젝트를 실행하고 'composeexample'이라는 이름으로 새 프로젝트 디렉토리 및 기본 파일들을 설치해준다.
  • '.' 은 새 프로젝트 디렉토리를 현재 디렉토리에 생성하라는 옵션이다.

    작업폴더 상에 django 프로젝트가 생성된것을 확인할 수 있다.
  • 프로젝트 디렉토리 composeexample/settings.py 에서 DATABASES 항목을 다음과 같이 수정해주어야한다.
# settings.py

import os

[...]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.environ.get('POSTGRES_NAME'),
        'USER': os.environ.get('POSTGRES_USER'),
        'PASSWORD': os.environ.get('POSTGRES_PASSWORD'),
        'HOST': 'db',
        'PORT': 5432,
    }
}

이제 작업 최상위 디렉토리에서

docker compose up

명령어를 실행해준다

다음과 같이 웹 서버가 띄워진 것을 볼 수 있다.

** window10 기준에서는 composeexample/settings.py파일에 docker host 이름 또는 ip주소를 목록에 추가해주어야한다.

ALLOWED_HOSTS = ['*']
docker container ls

위의 명령어로 실행중인 컨테이너를 확인할 수 있다.

ctrl-c 를 통해 서버를 종료하고
docker compose down 을 통해 서비스를 종료해주자

앱을 종료하면 django 프로젝트 디렉토리 ex) rd /s /q folder_name 를 통해 전체 폴더를 제거할 수 있다.

  • 위 명령어에서 /s는 폴더의 하위 폴더와 파일도 모두 삭제하도록 지정한다.
  • /q는 삭제 작업을 확인하지 않고 바로 진행하도록 지정한다.
  • folder_name은 삭제할 폴더의 이름이다.

0개의 댓글