토이프로젝트 docker 배포 - 실패

honeybeeveloper·2022년 8월 11일
0

preview

토이프로젝트 진행 후 docker를 이용하여 서버에 배포하려고 한다.
해당 프로젝트는 database 없이 진행하였기에 frontend와 backend만 배포하면 된다.

frontend Dockerfile

frontend : react app

# frontend Dockerfile

FROM node:alpine

WORKDIR /build

ENV PATH /build/node_modules/.bin:$PATH

COPY ./toy-frontend/package.json ./
COPY ./toy-frontend/package-lock.json ./

RUN npm install --force

COPY ./toy-frontend .

RUN npm install -g serve

RUN npm run build

ENTRYPOINT ["serve", "-s", "build"]

backend dockerfile - 1

backend : flask app

FROM tensorflow/tensorflow:2.7.0

WORKDIR /usr/src/app

COPY ./toy-backend .

RUN apt-get update -y && \
    apt-get install libglib2.0-0 -y && \
    apt install python3.8 python3.8-dev -y && \
    apt-get install libgl1-mesa-glx -y && \
    apt clean && \
    rm -rf /var/lib/apt/lists/* && \
    rm /usr/local/bin/python && \
    ln -s /usr/bin/python3.8 /usr/local/bin/python && \
    python3.8 -m pip install --no-cache-dir -U pip && \
    pip install --upgrade setuptools six && \
    pip install wheel cmake && \
    pip install -r requirements.txt

ENV PYTHONPATH="${PYTHONPATH}:/"
ENV HOME=.
ENV ENV=test
ENV FLASK_ENV=deployment

EXPOSE 5000

CMD ["python", "toy_backend/app.py"]

분석을 시작하면 out of memory 발생
내가 생각한 메모리 부족 원인은
1. 기존 tensorflow image를 이용한 backend image 자체가 너무 크다.
2. 예전에 사용한 Dockerfile 가져다 쓰면서 추가된 불필요한 패키지

backend dockerfile - 2

FROM python:3.8

WORKDIR /usr/src/app

COPY ./toy-backend .

RUN apt-get update -y && \
    apt-get install libglib2.0-0 -y && \
    apt-get install libgl1-mesa-glx -y && \
    pip install tensorflow==2.7.0 --no-cache-dir && \
    pip install -r requirements.txt

ENV PYTHONPATH="${PYTHONPATH}:/"
ENV HOME=.
ENV ENV=test
ENV FLASK_ENV=deployment
EXPOSE 5000

CMD ["python3", "toy_backend/app.py"]
  1. 기존 tensorflow image -> python:3.8 image 사용하고 tensorflow를 설치
  2. 불필요한 패키지 삭제

docker image build

backend
docker build --tag backend-image -f Dockerfile_backend .

frontend
docker build --tag frontend-image -f Dockerfile_frontend .

docker-compose

version: "3"
services:
  toy-backend:
    image: backend-image
    container_name: toy-backend
    restart: always
    volumes:
      - /home/ubuntu/data/toy-project/toy-backend/log:/usr/src/app/toy_backend/log
    ports:
      - "5000:5000"
    environment:
      TZ: "Asia/Seoul"

  toy-frontend:
    image: frontend-image
    container_name: toy-frontend
    depends_on:
      - toy-backend
    restart: always
    volumes:
      - ./:/frontend
    ports:
      - "3000:3000"

frontend & backend 애플리케이션 실행까지 성공했다.

여전한 out of memory

backend에서 이미지(및 영상) 분석을 위해 선택한 모델이 메모리에 없으면 tensorflow hub에서 다운로드 받아 모델을 메모리에 옮기는 구조였다.
1. 모델을 다운로드 하는 것이 무리일거 같았다.
-> tensorflow hub에서 제공하는 모델을 다운로드 받아 컨테이너 속에 넣고 이미지 분석할 때 로드 하는 구조로 변경하였다.
2. 여전히 out of memory
-> 테스트로 사용하는 서버는 oracle cloud free로 CPU 1개, Memory 1GB 이다.

자원 부족이 아닐까 싶었다. 모델(60MB), flask app(tensorflow 실행 때문에 1363MB)
무료 서버를 이용해서 toy project는 배포할 수 없다는 판단이다.

마무리

꼬박 이틀간의 삽질은 마무리 하고 다음 토이 프로젝트는 무료 서버에 배포할 수 있는 아이디어로 진행해봐야겠다.
더불어 무조건 코딩만 하면 되는게 아니라 조금 더 경량화 할 수 있고 구조에 대해 한번 더 고민하겠다는 다짐을 한다.


profile
꿀벌같은 개발자가 되고 싶습니다.

0개의 댓글