-
Notifications
You must be signed in to change notification settings - Fork 3
Docker Guideline
아직 docker를 설치하지 않았다면, 이 글(윈도우)을 참고해서 WSL과 docker를 설치해주세요.
하나의 서버에서 여러 프로그램을 구동시키는 것은 까다로운 일입니다. 한 컴퓨터 안에서 여러 서비스를 동시에 구동시키기 위해 우리는 가상환경을 이용합니다. 기존의 가상환경은 운영체제 위에서 또 다른 운영체제를 구동시키고, 그 위에서 서비스를 구동시켜 성능이 크게 저하됩니다(Hosted Virtual Machine). Docker는 이 구조에서 벗어나, 실행 중인 application 각각을 격리시키는 방식으로 동작해, native로 동작하는 것만큼 뛰어난 성능을 보장합니다. Docker가 익숙치 않은 분들은 이 글을 읽어보길 권합니다.
SKKU Coding Platform은 총 4개의 컨테이너를 구동합니다. 아래 그림과 같이 coding-platform
컨테이너를 중심으로 동작하며, 이는 나머지 3개의 컨테이너에 의존합니다.
컨테이너 실행 시(docker compose) data
폴더가 생성된 것을 볼 수 있는데, 이 폴더는 컨테이너가 mount한 것으로 각종 log와 데이터를 저장하는 곳입니다.
가장 중심이 되는 컨테이너로, 대부분의 수정 작업 또한 이 컨테이너를 생성하는 이미지(skkunpc/coding-platform
)를 대상으로 합니다. /app
디렉토리에는 frontend
를 빌드한 내용인 dist
폴더와 backend
의 파일이 담겨있습니다. 따라서 frontend나 backend의 변경사항을 바로 적용해보고 싶으면 이 컨테이너에 해당 내용을 복사하면 됩니다.
# frontend 반영
> yarn build
> find ./dist -name "*.*" -type f -exec sed -i "s/__STATIC_CDN_HOST__\///g" {} \;
> docker cp dist coding-platform:/app
# backend 반영 (예: problem 폴더 내용)
# 반영 후 docker 재시작 필요할 수 있음
> docker cp problem coding-platform:/app
coding-platform
으로부터 코드 채점 요청을 받고, 이를 실행한 후 출력 결과, 실행 시간 및 메모리 사용량 등을 측정하여 응답합니다. 이는 기존 Qingdao OJ의 것을 그대로 차용하였습니다.
각종 데이터를 저장하는 DB입니다. 각 컨테이너의 파일은 로컬에 mount되므로 컨테이너를 삭제하더라도 데이터가 유지됩니다.
현재 docker image는 master 브랜치에 push가 일어날 때마다 자동으로 빌드되도록 세팅되어 있습니다. 이미지는 Docker Hub에 올려져 있습니다. 아래 내용은 참고용으로만 보면 됩니다.
빌드는 backend/Dockerfile
을 대상으로 이루어집니다. 파일 내용은 아래와 같습니다.
FROM python:3.7-alpine3.9
ENV OJ_ENV production
ADD . /app
WORKDIR /app
HEALTHCHECK --interval=5s --retries=3 CMD python2 /app/deploy/health_check.py
RUN apk add --update --no-cache build-base nginx openssl curl unzip supervisor jpeg-dev zlib-dev postgresql-dev freetype-dev && \
pip install --no-cache-dir -r /app/deploy/requirements.txt && \
apk del build-base --purge
RUN curl -L https://github.com/skku-npc/skku-coding-platform/releases/download/v0.1-alpha/dist.tar.gz -o dist.tar.gz && \
tar -zxf dist.tar.gz && \
rm dist.tar.gz
ENTRYPOINT /app/deploy/entrypoint.sh
전반적인 흐름은 다음과 같습니다.
- Alpine Linux 기반 환경 생성
-
backend
디렉토리 내용을 컨테이너 내/app
에 복사 - 각종 패키지 설치
- GitHub에 release로 올라와있는
dist.tar.gz
다운받아 압축 해제