회고

Dokkaebi #3 하나의 Docker image에 NGINX, 서버, 데이터베이스를 다 넣은 이유

돌멩이1 2022. 6. 30. 00:27

배포를 알지 못하는 주니어 개발자들도 배포를 해 살아있는 프로젝트를 보여줄 수 있게 해주는 쉽고 빠른 배포 솔루션 도깨비는 하나의 이미지에 도깨비의 서버, 프론트, 데이터베이스가 모두 들어있다.
회고 회차가 지날수록 수식어가 길어지는 것은 기분탓이다.

사실 이 방법은 올바른 Docker container 사용법이 아니다. 
그럼 왜 이 방법을 선택하게 되었는지 과정을 기록해보려한다.

알파 테스트

삼성 청년 소프트웨어(이하 싸피)는 총 3번의 프로젝트를 진행한다. 도깨비 프로젝트는 마지막 프로젝트때 개발한 솔루션이다.
이때 우리팀의 목표는 실제 서비스 경험을 얻어가자 였다.
사무국에서는 AWS EC2 서버를 팀 마다 제공해주었는데 프로젝트 시작 3주째에 EC2 서버가 제공될 예정이었다.

우리 팀은 EC2서버가 제공되자마자 솔루션을 공개해야 동기 교육생들이 우리 솔루션을 사용할 것이라고 판단했다.
이미 앞선 2번의 프로젝트 경험으로 다들 배포를 수월하게 하지만 그렇지 않은 팀도 분명 있을 것이라 생각했다.

그런데 우리 솔루션을 다른 교육생들이 다운로드, 빌드할 수가 없는 문제가 발생했다.

싸피에서 진행한 프로젝트 소스코드를 외부에 반출하려면 허가가 필요했고 이는 통상적으로 프로젝트가 마감된 이후에 진행되었다.
싸피 내부에서 사용되는 형상 관리 도구는 허가된 인원만 접근이 가능했기 때문에 Clone 하는 방법도 불가능했다.

압축파일 형식으로 솔루션을 제공하는 것은 어떻냐는 의견이 나왔지만, 이내 교육생들이 그 귀찮음을 무릎쓰고 서비스를 사용해줄 것 이라고 생각되지는 않아 기각되었다.

최종적으로 Docker hub에 도깨비 이미지를 업로드하자. 라는 결론이 나왔다.

근데 굳이 하나의 이미지에 서버, NGINX, 데이터베이스를 모두 집어넣을 이유가 있었을까? 있었다.

  • 서버, 데이터베이스, NGINX(프론트) 3개의 컨테이너를 사용할 경우 사용자가 사용하려는 포트가 중복될 확률이 더 높아진다. 외부 포트포워딩 하지 않는 방법이 있기 때문에 다음으로 넘어가보자
  • 사용자가 Docker를 학습하고 도깨비를 통해 배포 흐름을 파악할 때 여러 컨테이너가 있다면 오히려 헷갈릴 가능성이 높다고 생각했다. 도깨비의 주 타겟 사용자는 배포를 모르는 주니어 개발자이다. 
  • NGINX를 활용한 리버스 프록시를 사용할 경우 내부의 DB, 서버는 외부에서 절대로 직접적으로 접근할 수 없는 장점을 가진다.
  • 이미지가 하나면 Docker run 명령어 한줄로 도깨비 솔루션을 설치 및 실행할 수 있다. 이 방법으로 사용자 접근성을 높일 수 있다.

이상의 이유로 도깨비는 하나의 이미지에 서버, 데이터베이스, 웹서버(NGINX)가 들어가게 되었다.

마지막으로 도깨비 이미지를 빌드하는 Dockerfile 코드를 업로드하면서 글을 마무리 짓도록 하겠다.

FROM openjdk:11-jdk as builder
COPY ./BE .
RUN chmod +x ./gradlew
RUN ./gradlew clean build

FROM node:16.14.0-alpine as react
COPY --from=builder /build/libs/*.jar /app.jar
COPY ./FE .

RUN npm install
RUN npm run build

FROM openjdk:11-jdk
COPY --from=react /build /usr/share/nginx
COPY --from=react /app.jar /home/conf/app.jar

RUN apt update &&  apt install -y mariadb-server-10.5 \
    && apt install -y uuid-runtime && apt update \
     && apt install -y git && apt update \
     && apt install -y nginx

RUN ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

COPY ./install.sh /home/conf/install.sh
COPY ./remove.sh /home/conf/remove.sh
COPY ./conf /home/conf
COPY ./DB /home/conf/db


# install NGINX
COPY ./default.conf /etc/nginx/sites-enabled/default

ENTRYPOINT [ "bin/bash", "home/conf/install.sh" ]

 

'회고' 카테고리의 다른 글

Dokkaebi #2 오픈소스 프로젝트 DB 비밀번호 노출 해결  (0) 2022.06.30