개발/devOps

[docker] 쉽고 빠른 서비스를 향해 (1)

김키쿠 2023. 11. 20. 18:57

때는 바야흐로 2020년. 코로나로 인해 비대면 수업을 하던 시절이었다. 1년동안 아무도 학교에 나오지 않았고, 학과 회장 선거에 비상이 걸렸다. 왜나하면 선거 투표는 항상 대면으로 진행했으까.

 

그 때 소수의 인원들이 모여서 온라인 투표 시스템을 구축했고, 따라서 우리 과는 2020년도부터 지금까지 온라인으로 투표를 진행할 수 있었다. 현재 시스템은 오픈소스 프로젝트로 관리되고 있다.

https://github.com/ampm-jbnu/jbnu-se-voting

 

GitHub - ampm-jbnu/jbnu-se-voting: 전북대학교 소프트웨어공학과 온라인 투표 시스템

전북대학교 소프트웨어공학과 온라인 투표 시스템. Contribute to ampm-jbnu/jbnu-se-voting development by creating an account on GitHub.

github.com

  

내가 메인테이너가 된 건 2022년부터다. 학생회 학술부장과 개표위원장을 맡으면서 투표 시스템의 유지보수가 내 책임이 되었다. 하지만 시스템을 급하게 만들어서 그런지 엉성한 부분이 많았고 현재까지 많은 개선이 이루어지고 있다.

 

올해 내가 마무리 할 작업은 쉽고 빠른 서비스를 위한 패키지 의존성 제거와 자동화 작업이다.

 

현재 시스템은 프로덕션 서버에서 github를 통해 직접 소스파일을 다운받고 코드 수정과 서비스를 하는 방식으로 운영되고 있다. 이 방식에는 문제가 많은데 stable하지 않은 프로덕션 서버 때문에 서비스 환경의 리셋과 이로 인해 인수인계시 러닝커브가 꽤 있는편이다. 또한 환경변수 파일과 mongoDB와의 커넥션 부분도 직접 구성해줘야하는 번거로움이 있다.

 

이러한 불편함을 없애고자 서비스를 도커라이징 및 자동화하여 프로덕션 서버에서 컨테이너 배포를 통해 쉽고 빠른 서비스 운영을 하고자 한다.

 

before / after

 

우선 현재 디렉토리 구조가 꽤 난잡한 편이다. 가시성을 위해 디렉토리 구조를 조금 수정했다. 동시에 dockerfile과 .dockerignore도 작성해주었다. dockerfile의 내용은 다음과 같다.

FROM node:20  

ENV SERVICE_PORT 3001
ENV SRC_DIR /tmp/src

COPY src ${SRC_DIR}
ARG CACHEBUST=1
WORKDIR ${SRC_DIR}

RUN apt update && apt upgrade -y
RUN npm install yarn
RUN yarn global add forever
RUN yarn global add nodemon

EXPOSE ${SERVICE_PORT}

CMD ["yarn", "dev"]

 

nodejs 환경을 베이스로 필요한 정보와 패키지를 설치해주는 파일을 작성했다. 서비스가 잘 되는지 테스트를 위해 로컬환경에서 이미지를 빌드하고 컨테이너를 생성해보았다.

 

 

일단 잘 되는 모습을 볼 수있다. 하지만 여기에는 문제점이 있는데, 현재 도커 이미지는 환경변수 파일을 넣은 상태로 빌드되었다는 점이다. 하지만 보안상의 문제로 환경변수 파일은 github과 dockerhub에 올라가지 못하도록 설정되어있다. 즉, 지금은 서비스가 잘 되나 테스트하기 위해 내가 임의로 환경변수 파일을 만들어주었다는 뜻이다.

 

환경변수 파일

 

문제는 어떻게 하면 환경변수 파일을 외부에 존재하게 하고 도커 컨테이너에 주입시키냐는 것이다.

 

우선 처음 생각난 방법은 docker swarm에서 제공하는 secret 기능을 통해 환경변수를 다루는 것이었다. 하지만 오른쪽 같은 형태를 secret으로 다루는데 있어서 방법을 찾지 못했다.

 

두 번째로 생각난 방법은 docker volume을 통해 환경변수 파일을 관리하는 것이다. 이 방법은 아직 해보지 않아서 지금부터 해볼 예정이다.