본문 바로가기
Come on IT/Docker

Python FastAPI, docker-compose로 구축하기

by JONGSKY 2022. 10. 24.
728x90
SMALL

1.  작성하게 된 이유

 

나는 기존에 django 혹은 flask를 이용해 api를 구축하곤 했었다.

그러나 FastAPI가 파이썬 웹 프레임워크의 새로운 트렌드로 자리 잡고 있고

Flask를 사용하던 조직들은 FastAPI로 옮겨가고, 요즘 대세는 fastapi라고 한다.

 

지난 5년간 구글 웹 검색 트랜드 지표

 

물론 Google Trends를 봐도 아직 Django와 Flask가 압도적인 추세이긴 하다.

그런데도 왜 대세이고 FastAPI를 쓰는 것일까?

FastAPI는 python 3.6+ 버전으로 API를 빌드하는데 도움이 되는 현대적인 프레임워크이다.

가장 빠른 파이썬 프레임워크 중 하나로 간주되며, 개발자가 유발하는 버그가 적고 빠르게 개발할 수 있다는 장점이 있다.

(장점 : 빠른 개발, 버그 감소, 높고 빠른 성능)

 

구축 사례 : Netflix, Uber 등

 

FastAPI의 장점

1. 웹 서버 WSGI (Web server Gateway Interface) 및 비동기 ASGI (Asynchronous Server Gateway Interface)를 완벽하게 지원한다.

2. OpenAPI, JSON 스키마 등의 제공

3. graphene-python이라는 Python 라이브러리로 GraphQL API를 쉽게 구축 가능하다.

4. Oauth 2.0 및 외부 공급자와 잘 통합된다.

5. 더 적은 노력과 디버깅 시간으로 애플리케이션을 생성하는 데 도움이 되는 자동완성 기능을 제공한다.

6. 중첩된 JSON 요청에도 개발자의 데이터 유형을 검증하는 도움이 된다.

 

FastAPI의 단점

1. FastAPI는 새로운 프레임워크로 커뮤니티 등의 교육 정보가 매우 적다.

2. 응용 프로그램을 개발할 때 FastAPI 응용 프로그램에서 모든 것을 패키징해야 하기 때문에 기본 파일이 매우 길거나 복잡해질 수 있다.

 

Django vs Flask vs FastAPI 비교

패키지 : django 라이브러리에는 전체 스택 웹 개발 프레임워크로 간주될 수 있는 2500개 이상의 패키지가 있다.

Flask < FastAPI < Django

커뮤니티 : django는 다양한 용도로 사용되기 때문에 많은 커뮤니티를 보유하고 있으며, Flask도 여러 교육 정보가 있으나, FastAPI가 최신 프레임워크로 외부 정보 수가 매우 적으나 계속해서 증가하고 있다.

FastAPI < Flask < Django

성능 : FastAPI는 고성능에 중점을 두고 있기 때문에 모든 프레임워크 중에서 가장 빠른 프레임워크이다.

Flask는 마이크로 프레임워크 기능으로 Django 보다는 더 높은 성능을 제공한다.

Django < Flask < FastAPI

유연성 : 업데이트 변경 사항이 필요한 경우 응용 프로그램 일부를 변경할 수 있는데 Flask가 거의 모든 부분에서 지원하고 있으므로 가장 유연하다.

Django < FastAPI < Flask

 

여러 장단점들 그리고 비교들이 있었지만 요즘 뜨고 있는 FastAPI를 사용해보고자 한다.

그래서 이번에 진행하고 있는 프로젝트는 FastAPI를 이용해 보기 위해서 작성하게 되었다.

 

2. docker-compose를 이용해 FastAPI 구축하기

기본 구조

.
├── app
│   └── main.py
├── Dockerfile
├── docker-compose.yml
└── requirements.txt

app/main.py

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: str | None = None):
    return {"item_id": item_id, "q": q}

Dockerfile

FROM python:3.10

WORKDIR /code

COPY ./requirements.txt /code/requirements.txt
 
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
 
#COPY ./app /code/app
 
#CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]

python 3.10 기준으로 만들기 위해 3.10 python 이미지를 사용하며

아래 2줄은 배포 시 주석 해제 후 사용하면 된다.

 

docker-compose.yml

version: "3.7"

services:
  fastapi:
    image: fastapi
    command: uvicorn app.main:app --host 0.0.0.0 --port 8080 --reload
    ports:
      - 8080:8080
    volumes:
      - ./app:/code/app

uvicorn에서 파일 변경이 일어나면 재시작을 위해 --reload를 추가해준다.

port는 기본적인 8080 포트를 이용한다.

volumns에서는 app폴더에서 수정이 이뤄지면 컨테이너 code/app에도 반영하기 위해 설정했다.

 

requirements.txt

fastapi>=0.68.0,<0.69.0
pydantic>=1.8.0,<2.0.0
uvicorn>=0.15.0,<0.16.0

필요한 파일들의 버전을 기록해둔 것이 requirements.txt이다.

해당 파일은 Dockerfile이 구동될 때 컨테이너에 동일하게 복사되며 설치된다.

 

사용하기

docker build -t fastapi .

사용하기 위해 fastapi를 docker에 build 해준다.

 

docker에서 fastapi를 build했을 때 나오는 화면

 

컨테이너 띄우기

docker-compose up

docker-compose를 이용해 fastapi 컨테이너 실행했을 때 화면

 

localhost에서 확인

 

localhost(127.0.0.1)의 8080포트 확인했을 때

 

localhost(127.0.0.1)의 8080포트의 docs확인했을 때

 

다음과 같이 나왔다면 fastapi를 위한 docker setting이 완료되었다.

 

3.  이후 작업

그다음부터는 내가 원하는 파라미터 값(매개변수)을 주었을 때 결과값을 나오게 해주는 코드를 작성하면 된다.

환경 설정이 끝난 것이지 이제부터 시작이다! 코딩하러 가보자!!

 

 

참고

 

FastAPI

FastAPI FastAPI 프레임워크, 고성능, 간편한 학습, 빠른 코드 작성, 준비된 프로덕션 문서: https://fastapi.tiangolo.com 소스 코드: https://github.com/tiangolo/fastapi FastAPI는 현대적이고, 빠르며(고성능), 파이썬

fastapi.tiangolo.com

 

728x90
LIST