Docker Compose를 활용하여 Django 프로젝트의 환경을 구축하는 과정을 설명합니다. 일반적으로 Django 프로젝트에 붙이는 Postgres, Nginx, Redis, RabbitMQ, Celery와 같은 서비스들을 Docker Compose를 사용하여 연결할 수 있습니다.
Dockerization
Dockerization은 기존의 Django 프로젝트를 Docker Compose를 사용하여 컨테이너화하는 과정을 의미합니다. 이를 통해 Django와 필요한 다른 서비스들을 컨테이너로 띄울 수 있습니다. 기존 프로젝트가 있는 경우 해당 프로젝트를 가져와 진행하거나, 새 프로젝트를 시작하는 경우 장고 서버가 정상적으로 실행되는 상태에서 작업을 진행할 수 있습니다.
Docker Desktop 설치
이 글에서는 Mac을 기준으로 설명하며, Docker Desktop을 설치하겠습니다. 아래 링크에서 Docker Desktop을 다운로드 및 설치할 수 있습니다.
Docker Desktop 다운로드
Dockerfile이란?
Dockerfile은 컨테이너 내에 설치해야 하는 패키지, 소스 코드, 명령어, 환경 변수 등을 기록한 파일입니다. 이 파일을 사용하여 도커 이미지를 빌드하면 이미지가 생성되며, 해당 이미지를 사용하여 컨테이너를 실행할 수 있습니다. Dockerfile에는 초기 서버 설정 과정을 나열하면 됩니다.
Dockerfile 작성
이미지를 빌드하기 위한 Dockerfile을 작성합니다. 아래 내용은 예시입니다.
# Docker Hub에서 사용할 베이스 이미지 선택 (예: ubuntu 16.04)
FROM ubuntu:16.04
# 우분투 기본 설정
RUN apt-get update
RUN apt-get install -y software-properties-common
RUN add-apt-repository -y ppa:deadsnakes/ppa
# Python 3.6 설치
RUN apt-get update
RUN apt install -y python3.6
RUN apt install -y python3-pip
RUN apt install -y python3.6-dev libpq-dev
# Python 기본 버전을 3.5에서 3.6로 변경
RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 1
RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2
RUN update-alternatives --config python3
# 필요한 패키지 및 설정 설치
RUN apt-get install -y net-tools
RUN apt-get install -y dnsutils
RUN apt-get update
# Python 출력 버퍼 비활성화
ENV PYTHONUNBUFFERED 0
# 작업 디렉토리 설정
WORKDIR /home/project_name
# requirements.txt 설치
COPY requirements.txt /home/project_name
RUN pip3 install --upgrade pip
RUN pip3 install -r requirements.txt
# PostgreSQL을 위한 대기 스크립트 다운로드
ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /
wait-for-it.sh 스크립트: 해당 스크립트는 PostgreSQL 서비스의 5432 포트가 사용 가능해질 때까지 대기한 후 Django 개발 서버를 실행하는 역할을 합니다. 이 스크립트를 사용하지 않으면 Django가 데이터베이스를 찾을 수 없는 오류가 발생할 수 있습니다. 이 스크립트를 사용하여 PostgreSQL 서비스가 시작된 후 Django 서비스를 실행하게 됩니다.
settings.py 설정 변경: Django 프로젝트의 settings.py 파일에서 설정을 수정해야 합니다.
# 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'),
}
}
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://redis_service:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
RABBITMQ_HOSTS = (os.environ.get('RABBITMQ_HOST'), )
RABBITMQ_USER = os.environ.get('RABBITMQ_USER', 'guest')
RABBITMQ_PASSWORD = os.environ.get('RABBITMQ_PASSWORD', 'guest')
RABBITMQ_QUEUE_EXPIRES = 300.0
RABBITMQ_MESSAGE_EXPIRES = RABBITMQ_QUEUE_EXPIRES
위 내용처럼 settings.py 파일의 데이터베이스 설정을 변경하고, 환경 변수를 사용하여 DB 이름, 사용자명, 비밀번호 등을 설정한다. 추가로, Django의 Cache로 활용하기 위해 Redis 설정, Message Broker로 사용하기 위해 RabbitMQ 설정을 변경한다.
이제 이 Dockerfile을 프로젝트 루트 디렉토리에 위치시킵니다. 위의 Dockerfile 내용을 사용하여 이미지를 빌드하려면 다음 명령을 실행합니다.
docker build -t django .
위 명령은 현재 디렉토리에서 Dockerfile을 사용하여 "django"라는 이름의 이미지를 빌드합니다. 빌드된 이미지를 확인하려면 다음 명령을 실행합니다.
docker images
Docker Compose 사용
이제 Docker Compose를 사용하여 Django와 관련 서비스를 띄워보겠습니다. Docker Compose는 여러 개의 도커 컨테이너를 정의하고 실행하기 위한 도구입니다.
docker-compose.yml 작성
아래는 Django와 관련 서비스를 정의하는 docker-compose.yml 파일의 예시입니다.
version: "3"
volumes:
postgres_db_dev: {}
services:
postgres:
container_name : postgres_service
image: postgres:9.5
volumes:
- postgres_db_dev:/var/lib/postgresql/data
environment:
- POSTGRES_DB=leffedb
- POSTGRES_USER=leffe
- POSTGRES_PASSWORD=leffe
- POSTGRES_INITDB_ARGS=--encoding=UTF-8
django:
container_name : django_service
image: django
build:
context: .
dockerfile: ./Dockerfile
environment:
- POSTGRES_DB=leffedb
- POSTGRES_USER=leffe
- POSTGRES_PASSWORD=leffe
- POSTGRES_HOST=postgres
- POSTGRES_PORT=5432
- RABBITMQ_USER=guest
- RABBITMQ_PASSWORD=guest
- RABBITMQ_HOST=rabbitmq
volumes:
- ./:/home/
working_dir : /home/
command: >
bash -c "
chmod +x /wait-for-it.sh
&& /wait-for-it.sh postgres:5432 -t 10
&& python3 manage.py migrate
&& python3 manage.py runserver"
ports:
- "8000:8000"
depends_on:
- redis
- rabbitmq
redis:
container_name: redis_service
image: redis
ports:
- "6379:6379"
rabbitmq:
container_name: rabbitmq_service
image: rabbitmq:3.7.14-management-alpine
environment:
- RABBITMQ_USER=guest
- RABBITMQ_PASSWORD=guest
ports:
- "5672:5672"
- "15672:15672"
nginx:
image: nginx
container_name : nginx_service
volumes:
- ./leffe.conf:/etc/nginx/conf.d/leffe.conf
ports:
- "80:80"
depends_on :
- django
celery:
container_name: celery_service
image: django
environment:
- POSTGRES_DB=leffedb
- POSTGRES_USER=leffe
- POSTGRES_PASSWORD=leffe
- POSTGRES_HOST=postgres
- POSTGRES_PORT=5432
- RABBITMQ_USER=guest
- RABBITMQ_PASSWORD=guest
- RABBITMQ_HOST=rabbitmq
volumes:
- ./:/home/
working_dir: /home/
command: >
bash -c "celery -A tasks worker --loglevel=info"
depends_on:
- django
위의 내용을 사용하여 docker-compose.yml 파일을 프로젝트 루트 디렉토리에 위치시킵니다.
Docker Compose 실행
Django와 관련 서비스를 실행하기 위해 다음 명령을 실행합니다.
docker-compose up -d
위 명령은 docker-compose.yml 파일에 정의된 서비스들을 빌드하고 실행합니다. 실행 중인 서비스의 상태를 확인하려면 다음 명령을 사용합니다.
docker-compose ps
실행 중인 컨테이너에 명령어 실행은 다음 명령을 사용합니다.
docker-compose exec puddlr ./manage.py makemigrations
실행 중인 컨테이너를 중지하려면 다음 명령을 사용합니다.
docker-compose stop
마무리
이제 Docker Compose를 사용하여 Django 개발 환경을 구축하고 관리할 수 있습니다. 위 과정을 따라하면 Django와 필요한 서비스들을 효율적으로 컨테이너화하고 실행할 수 있습니다.
아래는 tasks.py 파일의 내용입니다.
from django.conf import settings
from celery import Celery
brokers = [f'amqp://{settings.RABBITMQ_USER}:{settings.RABBITMQ_PASSWORD}@{host}//'
for host in settings.RABBITMQ_HOSTS]
app = Celery('puddlr', broker=brokers,
broker_transport_options={'confirm_publish': True})
@app.task
def add(x, y):
return x + y
위 코드는 Celery 작업을 정의하는 tasks.py 파일의 내용입니다. 이 파일은 Django 프로젝트 내에 위치하며, Celery를 사용하여 비동기 작업을 수행하는데 필요한 설정과 작업들을 정의합니다. 이 예시 코드에서는 add 함수가 Celery 작업으로 정의되어 있습니다. 이 함수는 두 개의 숫자를 더한 결과를 반환하는 간단한 작업입니다.
settings.RABBITMQ_USER, settings.RABBITMQ_PASSWORD, 그리고 settings.RABBITMQ_HOSTS는 Django 프로젝트의 설정 파일(settings.py)에 정의된 환경 변수입니다. 이 정보는 RabbitMQ 서버에 연결하기 위해 사용됩니다. Celery는 이를 활용하여 RabbitMQ 브로커와의 연결을 설정하고 비동기 작업을 처리합니다.
이 코드는 Celery 작업을 정의하는 기본 예시입니다. 프로젝트에 맞게 작업을 추가하고 설정을 조정하여 원하는 비동기 작업을 실행할 수 있습니다.
댓글