이제 여태까지는 python consumer.py를 backend bash쉘로 들어가서 직접 브로커로부터 오는 메시지를 확인해야 했습니다. 하지만 이러한 명령어를 치기 귀찮으니까, 그냥 하나의 컨테이너를 만들어서 거기서 아예 CMD로 python consumer.py를 command로 주어 백그라운드에서 확인할 수 있게 해 보겠습니다. 이를 위해서는 당연히 docker-compose.yml을 조금 수정해야 합니다.
Django
/docker-compose.yml
version: '3.8'
services:
backend:
build:
context: .
dockerfile : Dockerfile
command: 'python manage.py runserver 0.0.0.0:8000'
ports:
- 8000:8000
volumes:
- .:/app
depends_on:
- db
queue:
build:
context: .
dockerfile : Dockerfile
command: 'python consumer.py'
depends_on:
- backend
db:
image: mysql:5.7.22
restart: always
environment:
MYSQL_DATABASE: admin
MYSQL_USER: root
MYSQL_PASSWORD: root
MYSQL_ROOT_PASSWORD: root
volumes:
- .dbdata:/var/lib/mysql
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
ports:
- 3306:3306
이와 같이 새로운 서비스인 queue를 정의하고 backend에 의존한다 했고, python consumer.py를 command에 넣어주었습니다.
그리고 당연히 Dockerfile에서는 CMD를 삭제해 주었습니다.
/Dockerfile
FROM python:3.9
ENV PYTHONUNBUFFERED 1
WORKDIR /app
COPY requirements.txt /app/requirements.txt
RUN pip install -r requirements.txt
COPY . /app
# CMD python manage.py runserver 0.0.0.0:8000
그리고 왠진 모르지만 db의존성이 잘 안먹는거 같아가지고 저는 아래의 명령어를 쳐 주었습니다.
$docker-compose up -d db && docker-compose up backend queue
이제 Flask로 넘어오도록 하겠습니다
Flask
/docker-compose.yml
version: '3.8'
services:
backend:
build:
context: .
dockerfile: Dockerfile
command: 'python main.py'
ports:
- 8001:5001
volumes:
- .:/app
depends_on:
- db
queue:
build:
context: .
dockerfile: Dockerfile
command: 'python consumer.py'
depends_on:
- backend
db:
image: mysql:5.7.22
restart: always
environment:
MYSQL_DATABASE: main
MYSQL_USER: root
MYSQL_PASSWORD: root
MYSQL_ROOT_PASSWORD: root
volumes:
- .dbdata:/var/lib/mysql
ports:
- 33067:3306
이도 위와 마찬가지로 queue서비스를 하나 만들어주고 python consumer.py를 command로 주었습니다.
Producer Test
이전과 동일하게 GET /api/shop으로 boss에게 메세지를 보내보겠습니다
위가 order, 아래가 boss입니다. order는 로그가 찍히는것을 보실 수 있고, boss는 메시지가 정상적으로 boss-queue-1 컨테이너에서 정상적으로 'hello boss'가 찍히는 것을 보실 수 있습니다.
이는 전체 돌아가는 컨테이너 입니다.
그리고 마지막으로 consumer에 auto_ack=True를 주었는데, 이전의 메시지까지 저장되는 것을 막기 위함입니다.
/consumer.py
...
channel.basic_consume(queue='order', on_message_callback=callback, auto_ack=True)
...
이로서 docker-compose.yml로 간단하게 패키징을 해보는 실습을 완료했습니다.