[Django]Docker-compose로 Django 환경 구축하기 2 - Postgres
SW개발/Django

[Django]Docker-compose로 Django 환경 구축하기 2 - Postgres

대부분의 웹 프로젝트는 DB를 사용할 것이다. Django와 가장 잘어울리는 DB는 Postgres이며 Django의 공식 Dcoumentation에도 나와있다.

따라서 이번 포스팅에서도 역시 postgres를 사용하여 컨테이너로 띄우는 방법에 대해서 알아보려고 한다.

 

우선, 저번 포스팅에서 설명하지 못한 부분에 대해서 docker-compose.yml 파일과 함께 알아보자.

 

docker-compose.yml 추가
# yml 파일 포맷의 version 설정
version: "3"

# docker-compose 볼륨 정의 (이 볼륨은 도커가 관리함)
volumes:
  postgres_db_dev: {}

# 띄울 컨테이너 목록
services:
  # Database container, 추후에 설명
  postgres:
    container_name : postgres_service
    # dockerhub의 postgres9.5 이미지 사용
    image: postgres:9.5
    # postgres_db_dev를 컨테이너 ~/data에 마운트
    volumes:
      - postgres_db_dev:/var/lib/postgresql/data
    # postgres 환경 변수
    environment: 
      - POSTGRES_DB=leffedb
      - POSTGRES_USER=leffe
      - POSTGRES_PASSWORD=leffe
      - POSTGRES_INITDB_ARGS=--encoding=UTF-8

  # Django container
  django:
    # 컨테이너 명
    container_name : django_service
    # docker build 옵션
    build:
      # docker build 명령어를 실행할 디렉토리 경로
      context: .
      # 지정할 Dockerfile 경로
      dockerfile: ./Dockerfile
    # 환경 변수 설정  
    environment: 
      - POSTGRES_DB=leffedb
      - POSTGRES_USER=leffe
      - POSTGRES_PASSWORD=leffe
      - POSTGRES_HOST=postgres
      - POSTGRES_PORT=5432
    # 현재 디렉토리를 컨테이너 내의 /home/에 mount
    volumes: 
      - ./:/home/
    # 작업 폴더 지정
    working_dir : /home/
    # 실행할 명령어
    command: > 
      bash -c "
      chmod +x /wait-for-it.sh
      && /wait-for-it.sh postgres:5432 -t 10 # 5432 포트 사용 가능시 까지 대기
      && python3 manage.py migrate
      && python3 manage.py runserver"
    # 호스트 OS와 컨테이너의 포트를 바인딩
    ports: 
      - "8000:8000"
    # 호스트 OS에 포트를 공개하지 않고 컨테이너만 포트를 공개 (현재는 주석)
    #expose : 
    #  - "8000"

대부분의 내용은 주석에 설명한 것으로 쉽게 이해할 수 있다. 두 가지 유의해야 할 점은 volumes 옵션과 wait-for-it.sh 이다.

먼저, 위에 적힌 volumes 옵션은 도커에서 관리하는 가상 디스크와 같은 것으로 $ docker volume ls 명령어로 만들어진 볼륨을 확인할 수 있다.

services의 postgres 안에 적힌 voluems의 경우 위에 생성한 postgres_db_dev 볼륨을 컨테이너 내의 /var/lib/postgresql/data 디렉토리에 마운트 시킨다는 명령어이다. 위와 아래에 적힌 volumes 옵션에 유의하면서 docker-compose.yml 파일을 작성하면 될 것 이다.

 

두 번째로, wait-for-it.sh 스크립트는 postgres 서비스의 5432 포트가 사용 가능할 때 까지 기다린 후 Django 개발 서버를 실행하는 스크립트이다. 해당 스크립트에 대한 내용은 Github 에서 확인할 수 있다.

이 스크립트를 사용하지 않고 실행하게 되면 첫 실행시 Django 에서 데이터베이스를 찾을 수 없다는 오류를 발생시키기 때문이다. postgres 서비스가 시작되기 전 django 서비스가 실행되기 때문이다. 따라서 위의 스크립트를 활용하여 postgres 서비스가 가동된 후 django 서비스를 시작하게 한다.

 

여기까지 작성 했으면 장고 프로젝트에 존재하는 settings.py의 database 설정을 바꾸어 주어야 한다.

 

settings.py 수정
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.environ.get('POSTGRES_DB', 'leffedb'),
        'USER': os.environ.get('POSTGRES_USER', 'leffe'),
        'PASSWORD': os.environ.get('POSTGRES_PASSWORD', 'leffe'),
        'HOST': os.environ.get('POSTGRES_HOST', 'localhost'),
        'PORT': os.environ.get('POSTGRES_PORT', '5432'),
    }
}

 

장고의 settings.py에 존재하는 설정을 postgres에 맞게 변경해주어야 한다. 또한 docker-compose.yml 파일에서 작성한 환경 변수를 이 파일에서 이용하여 DB명, User, Password 등을 설정한다. 

 

모든 과정을 따라 했다면 $ docker-compose up -d --build 명령어를 통해 빌드를 재 진행하고 컨테이너(django, postgres) 2개를 띄울 수 있다.

또한, 띄워진 컨테이너들은 $ docker-compose ps 를 통해 어떤 상태에 있는지 확인할 수 있다.

 

지금까지 django와 postgres를 docker-compose로 환경을 구축해보았습니다. 다음 포스팅에서는 Redis를 붙여보는 과정에 대해서 다뤄보겠습니다.

 

공부하면서 정리한 내용이니 틀린 부분이 있을 수 있습니다. 댓글로 남겨주시면 감사하겠습니다.

 

728x90