본격적으로 개발을 하기 전, 간단한 chat 기능 백엔드 목업 서버를 구성하기 위해 docker를 이용했다.
django의 channels로 백엔드를 구성하고 redis를 메세지 브로커로 이용하여 개발용 목업서버를 구성하기로 생각했다.
각자의 개발환경에서 간단히 서버를 실행할 수 있어야 해서 docker를 이용하기로 했다.
django channels의 docs에 제공되어 있는 채팅 튜토리얼을 따라 진행했다.
-> 채팅 서버 튜토리얼 바로가기
완성된 코드는 깃허브에 올려놓았다.
-> 채팅 서버 코드 깃허브 주소
이 글의 목적이 ❌django 코드를 리뷰하는 것❌이 아니기 때문에 링크로 대체한다!
Django 프로젝트의 상위 디렉토리에 Dockerfile을 생성한다.
현재의 디렉토리 구조이다.
django-chat-mock/
Dockerfile
djangoProject/
manage.py
...
Dockerfile을 다음과 같이 작성한다.
FROM python:3.8.9
RUN pip3 install django channels channels_redis
WORKDIR /usr/src/app
COPY . .
WORKDIR ./djangoProject
CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"]
EXPOSE 8000
사용할 이미지를 입력한다. 우린 python 3.8.9 버전을 이용한다.
이미지가 올라가고 실행할 명령어를 입력한다. pip로 django, channels, channels_redis를 install 해준다.
작업을 진행할 디렉토리를 지정한다. 없으면 만들어 줌!
빌드를 진행하기전, 호스트의 디렉토리를 복사한다. "COPY . ."을 통해 작성해놓은 django 프로젝트를 복사한다.
컨테이너를 시작할 때 실행할 명령어를 입력한다. "python3 manage.py runserver 0.0.0.0.8000" 명령어로 django 서버를 실행한다.
외부에 노출할 포트를 지정한다. 8000번 포트를 노출시킬 것이다.
먼저 다음의 명령어를 입력하여 dockerfile을 빌드한다.
docker build --tag (docker hub 아이디)/(이미지 이름):(버전)
예시)
docker build --tag eunjong147/backend-chat-mock:1.0.0
docker login
로 도커 허브에 로그인해 준 다음,
아래의 명령어를 입력하여 image를 업로드한다.
docker push (docker hub 아이디)/(이미지 이름):(버전)
예시)
docker push eunjong147/backend-chat-mock:1.0.0
redis와 백엔드 서버, 2개의 이미지를 사용해야하기 때문에 docker-compose를 이용한다.
docker-compose.yml 파일을 생성하고 다음과 같이 yml파일을 작성한다.
version: '3'
services:
backend:
image: eunjong147/backend-chat-mock:1.0.0
ports:
- "8000:8000"
depends_on:
- redis
redis:
image: redis:5
ports:
- "6379:6379"
도커 컴포즈 파일의 버전을 명시해준다.
컨테이너를 실행하기 위한 단위이다. backend 부분과 redis 부분으로 나뉜다.
사용할 이미지를 명시해준다. backend service에서는 위에서 배포한 backend-chat-mock 이미지를 사용하고, redis service에서는 redis 5버전을 사용한다.
포트포워딩을 지정한다. <호스트의 포트>:<컨테이너의 포트>로 바인딩한다.
실행순서를 보장한다. backend service에서 redis service에 depends_on을 지정하면, redis 컨테이너가 먼저 실행된다.
docker-compose up -d
명령어를 통해 백그라운드로 실행하고,
docker-compose down
명령어를 통해 docker 컨테이너를 일시중지한다.
이제 docker-compose.yml 파일만 공유해주면 도커가 설치된 아무나 같은 환경에서 chat server를 실행할 수 있다.
도커가 어떤 식으로 돌아가는지 이해할 수 있는 글이었습니다. 많은 도움 되었습니다. 감사합니다 : )