Docker-Compose로 가톨릭대 현재수강신청인원 확인 프로젝트 배포하기

0

🤬🤬 내 도커 돌려내!!!

네.. 현재 일단 시놀로지를 복구 중입니다.

먼저 첫 번째로 간단한 프로젝트들부터 복구를 해보려고합니다.

DB의 경우 스키마를 이용해서 테이블들을 구조화하고, 내용들을 채워놓는 작업이 필요한데 이건 여간 손이 많이 가는 작업이라서 추후에 천천히 할 것 같습니다.

일단 저는 가톨릭대학교에 재학 중입니다.

그래서 가톨릭대 수강 신청 인원을 확인해야할 때가 종종 있는데요

이미 좋으신 분이 만들어 놓은 분이 만들어놓은 모듈화된 코드가 있어서 그걸 이용해서 API를 제작 그리고 유저 인터페이스를 덧붙여서 사용이 용이하게 만들었던 경험이 있습니다.

본 게시글에서는 어떻게 구현했는지를 자세히 다루지는 않겠습니다. 예전 글이 있거든요.
수강 신청 인원 확인 프로젝트 자세히 보기!!!🥳

근데 기존 프로젝트의 문제점이 있습니다.

  • 프론트엔드와 백엔드가 각각 컨테이너를 수동으로 빌드했기 때문에 한번에 관리가 힘들다.
  • 프론트엔드 프로젝트에 지저분한 파일들이 있다. 이것은 예전에 스프링을 이용해서 시놀로지 공식 API를 통해 파일을 업로드 및 제거하는 간단한 게시판 형태의 웹 앱을 만들려다가 포기하여서 그렇습니다. 굳이 이 프로젝트를 진행하지 않은 이유는 API가 사용하기 지저분한 까닭도 있지만, DSM과 SSH, SMB, AFP 등 파일 관리가 자유롭기 때문에 굳이 수동으로 제작할 필요성이 많이 떨어집니다.

이번에 시놀로지가 도커 컴포즈로 업데이트 되면서 리빌드를 해야했고, 이 참에 정리를 할 계획이었습니다.

Spring 프로젝트 배포 방법

먼저 스프링 프로젝트의 경우 톰캣을 도커 컨테이너로 올리고 그 안에 빌드된 spring 웹 앱인 .war파일을 넣어주도록 합니다.

해당 프로젝트의 도커 파일은 간단합니다.

FROM tomcat:8.5-jdk17-temurin

제 프로젝트가 jdk14이상을 사용하기 때문에 jdk17버전을 사용하는 톰캣 8.5버전을 컨테이너로 올렸습니다.

FastAPI 배포 방법

FROM python:3.8.6

WORKDIR /app/

COPY ./main.py /app/
COPY ./requirements.txt /app/

RUN pip install --upgrade pip
ENV PIP_ROOT_USER_ACTION=ignore
RUN pip install -r requirements.txt

CMD uvicorn --host=0.0.0.0 --port 5555 main:app

음 이것도 간단합니다. main.py가 api 코드이기 때문에 Working 디렉토리 안에 넣어주고 uvicorn 명령어를 사용하여 실행합니다. 아 그전에 requirements에는 해당 api 수행 코드에 필요한 라이브러리들을 미리 설치해줍니다.

도커 컴포즈로 두 개의 도커 컨테이너를 통합해서 빌드하기

version: "3.0"

services:
  tomecat:
    image: tomcat:8.5-jdk17-temurin
    build:
      context: ./frontend/SHBoard
    container_name: trinity_frontend
    network_mode: "bridge"
    ports:
      - 5554:8080
    volumes:
      - ./frontend/SHBoard/out/artifacts/SHBoard_war/SHBoard_war.war:/usr/local/tomcat/webapps/ROOT.war
  
  backend:
    container_name: trinity_backend
    build:
      context: ./backend
    network_mode: "bridge"
    ports:
      - 5555:5555

일단 먼저 톰캣을 올려줍니다. 어려울게 없습니다. build 안의 context는 Dockerfile의 위치를 명시해주면 해당 도커파일을 이용해서 이미지를 빌드합니다.

여기서 진짜 중요한건 network_mode를 설정해주는 것입니다.
기존 도커의 경우 아무 명령어 없이 컨테이너를 작동시키면 자동으로 bridge네트워크를 사용하도록 되어 있었는데, 시놀로지 도커 컴포즈 버전이 낮아서 그런지
none으로 가버립니다. 그래서 많은 시행착오를 겪었습니다.

도커 컴포즈에서 network를 설정안하면??

1번 오류

Failed to read schema document 'https://www.springframework.org/schema/context/spring-context.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.

spring 프로젝트 안의 application-context.xml과 dispatcher-servlet.xml 설정파일에서 해당 .xsd파일을 읽어오지 못하는 문제가 생겼습니다. 이 경우 방법은 https를 http로 바꾸면 됩니다. 근데 이걸 읽어오지 못하는 이유는 통신이 안되서 그렇습니다. 저의 경우 브릿지 네트워크에 컨테이너가 할당되지 않다보니 내부에서 외부로 통신이 전혀 안되는 문제가 발생해서 이런 오류가 생겼습니다.

2번 오류

이것은 fastAPI인 백엔드 프로젝트에서 문제가 발생하였습니다.

바로 API에서 요청은 받는데, API 내부 메소드에서 다시 외부로 어떤 요청을 보내는 로직이 있습니다. 근데 이 로직이 수행되지 않으니까 제가 원하는 정보를 받아오지 못했고, 계속 에러가 발생했습니다.

사실 도커 컴포즈의 네트워크를 의심하게 된 이유는 이 프로젝트의 에러 덕분이었습니다.

해당 api를 윈도우 PC에서 실행시키면 멀쩡하게 정보를 받아오는데, 이상하게 도커 컨테이너로 들어가면 정보를 못받아오는 진짜 미치고 팔짝뛰는 경우가 발생하는 거였습니다.

여튼 잘 해결되어서 다행이라고 생각합니다.... 도커 컴포즈에서 컨테이너를 빌드할 때 꼭, 네트워크를 신경쓰시길 바랍니다 ㅠㅠ 😂😂

Spring 프로젝트를 톰캣에 넣기

스프링 프로젝트를 빌드하면 .war파일이 생성됩니다.

그걸 tomcat의 webapps 폴더에 넣으면 되는데, 원래 같으면 톰캣 내부 webapps 폴더 내부에 ROOT라고 하는 기본 / url에 대한 응답용 페이지가 존재합니다.

그리고 {프로젝트 이름}.war 폴더를 넣으면 webapps 내부에 {프로젝트 이름} 폴더가 생기고, 기본 url이 /{프로젝트 이름}/ 으로 시작합니다.
이게 싫으니까 저희는 ROOT.war로 넣고 ROOT 폴더가 생기도록 해야합니다. 그러면 제 프로젝트가 / 로 매핑이되겠지요.

그런데 톰캣 컨테이너에서는 기본 ROOT폴더가 webapps.dist 폴더에 있었습니다.
그래서 아래와 같이 제 .war를 바로 ROOT.war로 마운트를 해버렸습니다.
톰캣이 실행되면 이 war이 압축이 풀리면서 / url에 제 프로젝트가 매핑됩니다!!

./frontend/SHBoard/out/artifacts/SHBoard_war/SHBoard_war.war:/usr/local/tomcat/webapps/ROOT.war

결과

결과적으로는 도커 컴포즈를 이용해서 각 컨테이너를 한꺼번에 관리하기가 쉬워진건 맞는것 같습니다.

현재 잘 작동중에 있습니다.

프로젝트를 생성하고 .yaml파일을 업로드 하면 도커 컨테이너 빌드가 시작됩니다.
조금 공부가 많이 필요했습니다. 한 2~3일정도를 헤맸던 것 같아요.

아무리 도커를 써봤다지만 컴포즈로 바로 적응하는건 힘들었습니다.. 휴.

리빌드와 프로젝트 정리가 싹 되어서 깃 허브 주소와 수강신청인원 확인 페이지의 주소를 올립니다.

프로젝트에 대해서

혹시나 진짜로 수강신청인원 확인 페이지를 사용하는 분들의 경우 안심하셔도 됩니다.

제가 따로 로깅을 남기지 않고 있습니다. 컨트롤러가 하나뿐인 간단한 프로젝트이기도 하구요!!

그리고 실제로 잘 작동합니다. 저도 사용을 안한지 꽤 되서 기억이 안나긴 하지만
학기 값이 조금 문제긴 한데

  • 1학기: 10
  • 2학기: 11 or 20

으로 기억하고 있습니다. 나머지는 트리니티에서 확인하는 값을 그대로 넣으시면 됩니다!!

소스코드를 보러 가볼까요?? 슈웅ㅇ~~

수강 신청 인원 확인 페이지로->->

끝까지 말썽ㅋㅋㅋㅋㅋㅋㅋ 😈

모르고 프로젝트를 빌드하다가 테스트용으로 사용하던 소스코드에 제 트리니티 아이디와 비밀번호를 넣은 상태로 푸쉬를 해버렸습니다.


하하하하하하하하ㅏ하하하하하ㅏ하하하핳

바로 메일로 이렇게 날라왔습니다.

사실 바로는 아니고 제가 정신나간 새벽에 올렸는데 당일에 온거니까 그래도 꽤 빠르긴 하네요.

가르쳐주신 현우 조님 감사합니다.

지금은 물론 들어가셔도 확인할 수 없습니다. 제가 커밋 내역도 싹 삭제했거든요...
어짜피 이리쿵 저리쿵 테스트한다고 지저분한 커밋이 너무 많아서 맘에 안들긴 했는데
이렇게 기회를 주시네용 호호호호

그럼 다음 프로젝트로 만나뵐게용 여러분!

profile
최악의 환경에서 최선을 다하기

0개의 댓글