본문 바로가기

내일배움 캠프/TIL

Django, Celery, rabbitmq를 docker compose로 deploy하기

Docker compose는 docker-compose.yml 파일을 통해서 컨테이너 여러개를 한번에 구축하게되는데 Celery를 Django에서 실행하기 위해서는 message broker인 rabbitmq도 같이 실행해서 연결을 해줘야한다.

 

version: '3.8'

volumes:
  postgres: {}
  django_media: {}
  django_static: {}

services:
  backend:
    container_name: backend
    build: ./backend/
    entrypoint: sh -c "python manage.py collectstatic --no-input && python manage.py makemigrations && python manage.py migrate && gunicorn BFFs.wsgi --workers=5 -b 0.0.0.0:8000 && celery -A BFFs worker --loglevel=info"
    volumes:
      - ./backend/django/:/app/
      - /etc/localtime:/etc/localtime:ro
      - django_media:/app/media/
      - django_static:/app/static/
    env_file:
      - .env
    depends_on:
      - postgres
      - rabbitmq
      - redis
    restart: always
    
  ...

  rabbitmq:
    container_name: rabbitmq
    image: rabbitmq:3-management-alpine
    environment:
      - RABBITMQ_USER=guest
      - RABBITMQ_PASSWORD=guest
    ports:
      - 5672:5672
      - 15672:15672 
    restart: always

처음에는 위와같은 방법으로 backend안에서 실행하려했지만 celery worker가 정상적으로 작동하는지 확인을 하기위해 celery컨테이너를 하나더 만들어서

version: '3.8'

volumes:
  postgres: {}
  django_media: {}
  django_static: {}

services:
  backend:
    container_name: backend
    build: ./backend/
    entrypoint: sh -c "python manage.py collectstatic --no-input && python manage.py makemigrations && python manage.py migrate && gunicorn BFFs.wsgi --workers=5 -b 0.0.0.0:8000"
    volumes:
      - ./backend/django/:/app/
      - /etc/localtime:/etc/localtime:ro
      - django_media:/app/media/
      - django_static:/app/static/
    env_file:
      - .env
    depends_on:
      - postgres
      - rabbitmq
      - redis
    restart: always
    
  ...

  rabbitmq:
    container_name: rabbitmq
    image: rabbitmq:3-management-alpine
    environment:
      - RABBITMQ_USER=guest
      - RABBITMQ_PASSWORD=guest
    ports:
      - 5672:5672
      - 15672:15672 
    restart: always
    
  celery_worker:
    container_name: celery_worker
    build:
      context: ./backend/
    depends_on:
      - backend
      - rabbitmq
    volumes:
      - ./backend/django/:/app/
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    ports: []
    command: sh -c "celery -A BFFs worker --loglevel=info"

celery를 backend에 의존을 두어서 컨테이너가 생성되게하고 volumes를 통해 django 프로젝트의 settings.py에 있는 설정에 접근을 할수있게 해서 celery가 rabbitmq랑 장고파일내부에 있는 task를 읽어올수있게했습니다