Skip to content

Docker Guideline

윤성 edited this page Sep 6, 2021 · 3 revisions

Docker Guide

Docker 설치

아직 docker를 설치하지 않았다면, 이 글(윈도우)을 참고해서 WSL과 docker를 설치해주세요.


What is Docker? 🐳

하나의 서버에서 여러 프로그램을 구동시키는 것은 까다로운 일입니다. 한 컴퓨터 안에서 여러 서비스를 동시에 구동시키기 위해 우리는 가상환경을 이용합니다. 기존의 가상환경은 운영체제 위에서 또 다른 운영체제를 구동시키고, 그 위에서 서비스를 구동시켜 성능이 크게 저하됩니다(Hosted Virtual Machine). Docker는 이 구조에서 벗어나, 실행 중인 application 각각을 격리시키는 방식으로 동작해, native로 동작하는 것만큼 뛰어난 성능을 보장합니다. Docker가 익숙치 않은 분들은 이 글을 읽어보길 권합니다.

Container List 🧾

SKKU Coding Platform은 총 4개의 컨테이너를 구동합니다. 아래 그림과 같이 coding-platform 컨테이너를 중심으로 동작하며, 이는 나머지 3개의 컨테이너에 의존합니다.

컨테이너 실행 시(docker compose) data 폴더가 생성된 것을 볼 수 있는데, 이 폴더는 컨테이너가 mount한 것으로 각종 log와 데이터를 저장하는 곳입니다.

1. coding-platform

가장 중심이 되는 컨테이너로, 대부분의 수정 작업 또한 이 컨테이너를 생성하는 이미지(skkunpc/coding-platform )를 대상으로 합니다. /app 디렉토리에는 frontend 를 빌드한 내용인 dist 폴더와 backend 의 파일이 담겨있습니다. 따라서 frontend나 backend의 변경사항을 바로 적용해보고 싶으면 이 컨테이너에 해당 내용을 복사하면 됩니다.

# frontend 반영
> yarn build
> docker cp dist coding-platform:/app

# backend 반영 (예: problem 폴더 내용)
# 반영 후 docker 재시작 필요할 수 있음
> docker cp problem coding-platform:/app

2. judge-server

coding-platform 으로부터 코드 채점 요청을 받고, 이를 실행한 후 출력 결과, 실행 시간 및 메모리 사용량 등을 측정하여 응답합니다. 이는 기존 Qingdao OJ의 것을 그대로 차용하였습니다.

3. oj-postgres , oj-redis

각종 데이터를 저장하는 DB입니다. 각 컨테이너의 파일은 로컬에 mount되므로 컨테이너를 삭제하더라도 데이터가 유지됩니다.

Docker Image 빌드 과정 🔨

현재 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

전반적인 흐름은 다음과 같습니다.

  1. Alpine Linux 기반 환경 생성
  2. backend 디렉토리 내용을 컨테이너 내 /app 에 복사
  3. 각종 패키지 설치
  4. GitHub에 release로 올라와있는 dist.tar.gz 다운받아 압축 해제