Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Docker를 이용한 개발/배포환경 구축 #109

Closed
hanjo8813 opened this issue May 26, 2021 · 5 comments
Closed

Docker를 이용한 개발/배포환경 구축 #109

hanjo8813 opened this issue May 26, 2021 · 5 comments
Labels
Backend 백엔드 관련 Environment 환경설정 관련 To do 해야할 것 메모하기

Comments

@hanjo8813
Copy link
Member

hanjo8813 commented May 26, 2021

현재 상황

  • 현재 사용하는 서버는 총 3개 (React / Express / Flask)
  • React (https) 는 도커 이미지화 완료
  • Flask 서버도 koNLpy 라이브러리를 사용하기 위해 도커 내부에 JDK를 깔고 이미지화 완료
  • 프론트만 https면 다른 백엔드 API 서버와 통신이 안될줄 알았지만 잘 됐음.

To Do

  • Express 서버를 이미지화 하기
  • 3개의 서버 모두 도커 컨테이너에 올려서 서로 통신 테스트
  • 테스트 후 docker-compose를 이용하여 개발 및 배포환경 구축
  • AWS에 올려 테스트

docker-compose 명령어

KoNLpy 도커에 설치

@hanjo8813 hanjo8813 added Backend 백엔드 관련 Environment 환경설정 관련 To do 해야할 것 메모하기 labels May 26, 2021
@hanjo8813
Copy link
Member Author

hanjo8813 commented May 26, 2021

로컬에서 docker-compose

version: '3'

services:
    frontend :
        build : ./frontend
        ports : 
            - "8080:8080"
        volumes:
            - ./frontend:/myfolder/
        environment :
            - CHOKIDAR_USEPOLLING=true
    
    backend_express :
        build : ./backend
        ports : 
            - "3000:3000"
        volumes:
            - ./backend:/myfolder/
        environment :
            - CHOKIDAR_USEPOLLING=true

    backend_flask :
        build : ./backend_flask
        ports : 
            - "5000:5000"
        volumes:
            - ./backend_flask:/myfolder/
        environment :
            - CHOKIDAR_USEPOLLING=true
  • 위와 같은 코드로 각 서버별 도커 이미지를 빌드함
  • CHOKIDAR_USEPOLLING 속성을 줘서 코드 수정시 바로 반영되도록 설정 (windows os에서만 한다고함)
  • docker-compose up 으로 빌드-> 컨테이너 생성. 로컬에서는 세 서버 모두 구동 완료

EC2 ubuntu 환경에서 compose

  • 로컬에서 같은 코드로 compose 했지만 실패함...
  • EC2 CPU가 compose시 세 서버의 빌드량을 버티지 못하는 것으로 보임
  • 이미지를 서버 따로따로 빌드한 후 한번에 컨테이너에 올려서 실행해도 똑같이 CPU 뻑남.
    image
  • 리액트를 정적파일로 빌드해서 올려야할 것 같음... (이러면 https 설정을 다시해야함.;)

@hanjo8813
Copy link
Member Author

hanjo8813 commented May 27, 2021

A . Flask 컨테이너

  • React와 Express 를 도커에 올려 사용하는것은 문제가 없음. 도커 구동후 ec2 서버 모니터링시 cpu 사용량이 적다.
  • 하지만 Flask 이미지에서 koNLpy를 사용하려고 JDK를 설치하느라 ubuntu 이미지를 사용해서 용량이 2기가가 넘는 것을 확인
  • Flask 컨테이너만 실행하면 서버 cpu가 다운되는 상황 발생
  • 따라서 Flask는 이미지로 실행 X, 도커파일 내용을 우분투 서버에 그대로 설치해서 사용하자
  • 로컬에서 Flask 개발시엔 그냥 docker로 실행

B . React <-> Express 통신

image

  • 통신 오류 발생
  • React에서 localhost로 요청하는데 여기서 나는 문제인지
  • http <-> https의 문제인지 모르겠음

@hanjo8813
Copy link
Member Author

hanjo8813 commented May 27, 2021

B. React <-> Express 통신

  • 구글링 해보니 CORS 문제라고해서(이미 CORS설정은 되어있는데..) 옵션을 살짝 추가해줌. => 실패
  • Express에도 https 적용
  • Docker라서 안되는지 ? 포트 알아보기.
  • Docker 문제면 그냥 로컬에 설치하자 ..

해결

  • docker 컨테이너 내부 포트 문제인가 싶어서 node.js를 우분투 서버에 직접 설치 후 서버를 pm2로 실행시켜봄

image

  • 두 서버가 잘 돌아가지만.... 똑같은 오류가 발생한다....

  • netstat -tnlp로 우분투에서 돌아가고 있는 포트 확인... express에서 도메인(ip) 설정이 안돼있는것을 확인

image

  • express 에서 도메인을 모두 허용(0.0.0.0)으로 바꾸고 다시 확인했지만 여전히 안됨...

image

  • 갑자기 깨달았다... 혹시 localhost로 요청을 보낸다면 우분투 서버 내부 localhost가 아닌 내 컴퓨터로 보내는 것인가?
  • 맞았다. localhost는 정적 도메인이 아니라 내 컴퓨터만의 도메인인 것임.... 그렇다면 마지막 남은 https 적용을 시도.
  • 계속 쓰고 있던 SSL 인증서를 express에 적용하고 프론트에서 요청을 보내니 통신이 잘된다. docker로도 잘 됨.

이미 우분투에 node.js 세팅을 했고 무중단 배포 pm2도 좋지만, docker 컨테이너 생성시 -v(볼륨)속성으로 로컬과 데이터 바인딩을 해주니, 컨테이너 재시작 필요없이 git pull 만으로도 코드 반영이 됨. 더 편해서 Docker를 계속 쓰기로 결정

# 이미지 빌드
> sudo docker build . -t backend_express
# 컨테이너 생성(볼륨 바인딩)
> sudo docker run -d --name con_backend_express -p 3000:3000 -v ${PWD}:/myfolder/ backend_express

@hanjo8813
Copy link
Member Author

Flask 서버 EC2에서 구동 이슈

  • React와 Express 서버는 도커로 배포 완료됨.
  • React & Express를 구동하고 모니터링시 CPU 최대 40% 소모
  • 하지만 Flask 하나만으로도 60%가 넘는 CPU를 소모 (학습된 모델 pkl 파일을 로드해서 돌리기 때문이라고 생각됨)
  • 3개의 서버가 동시에 돌아가게 되면 EC2의 할당 CPU가 100퍼센트가 초과됨....
  • 따라서 Flask 서버는 아예 다른 EC2 객체에 배포해야한다는 결론 => EC2 서버를 새로 팠다
  • Flask 레포를 분리할까 하다가... 개발 환경을 생각해서 그대로 두기로함

@hanjo8813 hanjo8813 changed the title Docker-compose를 사용해 개발/배포환경 구축 Docker를 이용한 개발/배포환경 구축 May 28, 2021
@hanjo8813
Copy link
Member Author

hanjo8813 commented May 28, 2021

최종

개발환경

  • 프론트엔드(React)는 터미널에서 npm start로 개발
  • 백엔드(Express, Flask)는 Docker를 사용해 개발진행
    • Docker 환경설정
    • Flask에서 koNLpy 모듈이 java를 요구하기 때문에 Docker로 의존성 제거
  • Docker-compose는 React 빌드에 시간이 너무 많이 소요되므로 사용하지 않음

배포환경

  • 개발/배포 서버 도메인+포트 정리
  • React는 Netlify를 사용해 배포를 시도했다가 링크 이동(href)에서 이유를 알 수 없는 오류가 발생하여 포기함.
  • 따라서 EC2 서버를 2개 사용해 프론트엔드 - 백엔드 서버를 각각 분리함 (프론트엔드는 추후에 빌드하여 S3 배포 생각중)
  • 모든 통신은 https를 사용해 이루어짐
  • 배포시 모두 Docker를 사용해 배포함

@hanjo8813 hanjo8813 pinned this issue Jun 16, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Backend 백엔드 관련 Environment 환경설정 관련 To do 해야할 것 메모하기
Projects
None yet
Development

No branches or pull requests

1 participant