Flask 애플리케이션을 Docker로 패키징하기
클라우드에 서버를 실제로 올리기 위해 여러 가지 방법이 있지만, 저는 Google Cloud Run을 선택했습니다. 그 이유는 Google Cloud Run이 서버리스 환경이어서 별도의 요청이 없으면 비용이 들지 않는다는 점이 가장 매력적이었기 때문입니다.
Google Cloud Run에 배포하려면 먼저 Flask 코드를 Docker로 패키징해야 합니다. 여기서는 제가 사용한 Docker로 패키징하는 방법을 정리해보겠습니다.
사전 준비
- Docker 설치
- Windows를 사용하는 경우 WSL2 설치
Dockerfile 작성
Docker로 패키징하기 위해서는 Dockerfile만 있으면 됩니다. 아래는 제가 작성한 Dockerfile의 내용입니다:
dockerfile
코드 복사
# Python 3.10 slim 버전 사용 FROM python:3.10-slim # 작업 디렉토리 설정 WORKDIR /app # 시스템 패키지 업데이트 및 필수 시스템 라이브러리 설치 RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ libgl1-mesa-glx \ libglib2.0-0 \ libsm6 \ libxext6 \ libxrender-dev \ libopenblas-dev \ libjpeg-dev \ libpng-dev \ libtiff-dev \ libfreetype6-dev \ libssl-dev \ libffi-dev \ zlib1g-dev \ curl \ git \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* # 필요한 파일 복사 COPY . . COPY yolov5-master /app/yolov5-master COPY super_resolution.onnx /app/super_resolution.onnx # 미리 다운로드한 PaddleOCR 모델 파일 복사 COPY root/.paddleocr /root/.paddleocr # 모델 파일에 대한 접근 권한 설정 RUN chmod -R 755 /root/.paddleocr # pip 업그레이드 및 Python 패키지 설치 RUN pip install --upgrade pip RUN pip install --no-cache-dir -r requirements.txt # 환경 변수 설정 ENV PYTHONPATH="/app:/app/yolov5-master" ENV OMP_NUM_THREADS=1 ENV PADDLEOCR_HOME=/root/.paddleocr ENV PORT=8080 # Flask 서버 실행 (worker-class를 gevent로 변경) CMD ["bash", "-c", "python -c 'from flask_server import initialize_server; initialize_server()' && \ gunicorn --workers=1 --threads=2 --timeout=120 \ --worker-class=geventwebsocket.gunicorn.workers.GeventWebSocketWorker \ --bind=0.0.0.0:8080 flask_server:app"]
Dockerfile 설명
- 베이스 이미지 설정: Python 3.10 slim 버전을 사용하여 경량 이미지를 기반으로 합니다.
- 작업 디렉토리 설정: /app 디렉토리를 컨테이너 내 작업 디렉토리로 지정합니다.
- 필수 라이브러리 설치: 애플리케이션 실행에 필요한 시스템 라이브러리를 설치합니다.
- 애플리케이션 파일 복사: 현재 디렉토리의 모든 파일과 필요한 모델 및 디렉토리를 컨테이너로 복사합니다.
- 모델 권한 설정: 모델 파일에 대한 접근 권한을 설정하여 애플리케이션이 정상적으로 모델을 로드할 수 있도록 합니다.
- Python 패키지 설치: pip를 업그레이드하고 requirements.txt에 명시된 패키지를 설치합니다.
- 환경 변수 설정: 애플리케이션 실행에 필요한 환경 변수를 설정합니다.
- 애플리케이션 실행: CMD 명령을 통해 Flask 서버를 Gunicorn으로 실행합니다. 이때 geventwebsocket 워커 클래스를 사용하여 비동기 처리를 지원합니다.
파일 구조 구성
Dockerfile과 같은 디렉토리에 필요한 모델들과 파일들을 배치해야 합니다. 예시는 다음과 같습니다:

- Dockerfile: Docker 이미지를 빌드하기 위한 설정 파일입니다.
- flask_server.py: Flask 애플리케이션의 메인 코드입니다.
- requirements.txt: 애플리케이션에 필요한 Python 패키지 목록입니다.
- yolov5-master/, super_resolution.onnx, root/.paddleocr/: 애플리케이션에서 사용하는 모델과 관련 파일들입니다.
Docker 이미지 빌드하기
터미널에서 프로젝트 디렉토리로 이동한 후 다음 명령어를 실행하여 Docker 이미지를 빌드합니다:

- your-image-name을 원하는 이미지 이름으로 변경하세요.
- 마지막의 .는 현재 디렉토리를 의미하며, Dockerfile을 찾는 위치입니다.
로컬에서 Docker 이미지 실행
이미지를 빌드한 후, 로컬에서 컨테이너를 실행하여 애플리케이션이 정상적으로 동작하는지 확인할 수 있습니다:

- 브라우저에서 http://localhost:8080에 접속하여 애플리케이션이 올바르게 실행되는지 확인합니다.
이렇게 하면 Docker를 이용하여 Flask 애플리케이션을 성공적으로 패키징할 수 있습니다.
이제 이 이미지를 클라우드에 배포하여 외부에서도 애플리케이션에 접속할 수 있도록 할 수 있습니다.
다음시간에 Google cloud run에 배포 해보겠습니다 .
'플러팅 AI > Flask Server' 카테고리의 다른 글
| Socket.IO 클라이언트가 메시지를 일부만 수신하는 문제 (3) | 2024.11.27 |
|---|---|
| Flask 서버에서 SocketIO를 이용한 개별 응답 처리 방법 (0) | 2024.11.22 |
| Yolov5 docker 배포할때 windows path 문제 (3) | 2024.11.20 |
| 서버 Docker 시작전에 모델 로드하기 (0) | 2024.11.20 |
| Paddle OCR 메모리 누수(Memory leak) 해결 시도 (1) | 2024.11.20 |