FastAPI와 Docker를 사용한 배포
FastAPI는 Python으로 작성된 웹 프레임워크로, 높은 성능과 간결한 코드를 제공합니다. Docker는 컨테이너 기술을 사용하여 애플리케이션을 쉽게 배포하고 관리할 수 있는 플랫폼입니다. 이 두 기술을 함께 사용하여 FastAPI 애플리케이션을 배포할 수 있습니다.
1. FastAPI 애플리케이션 만들기
FastAPI를 사용하여 간단한 애플리케이션을 만들어보겠습니다. 이 예제에서는 FastAPI의 기본 예제를 사용할 것입니다.
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
2. Dockerfile 작성하기
Docker 이미지를 빌드하기 위해 Dockerfile을 작성해야 합니다. 이 예제에서는 Python 3.8을 기반으로 하는 이미지를 사용합니다.
FROM python:3.8-slim-buster
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]
Dockerfile을 살펴보면 다음과 같은 작업을 수행합니다.
- Python 3.8을 기반으로 하는 이미지를 사용합니다.
- 작업 디렉토리를 /app으로 설정합니다.
- requirements.txt 파일을 복사하고, 해당 파일에 명시된 패키지들을 설치합니다.
- 현재 디렉토리의 모든 파일을 /app으로 복사합니다.
- 애플리케이션을 실행하기 위해 CMD 명령어를 사용합니다.
3. requirements.txt 파일 작성하기
Docker 이미지를 빌드할 때 필요한 패키지들을 requirements.txt 파일에 명시해야 합니다. 이 예제에서는 FastAPI와 uvicorn 패키지를 사용합니다.
fastapi
uvicorn
4. Docker 이미지 빌드하기
Dockerfile과 requirements.txt 파일이 모두 준비되었다면, Docker 이미지를 빌드할 수 있습니다. 다음 명령어를 사용합니다.
docker build -t my-fastapi-app .
이 명령어는 Dockerfile이 있는 디렉토리에서 실행해야 합니다. -t 옵션을 사용하여 이미지의 이름을 지정합니다. 여기에서는 my-fastapi-app으로 지정하였습니다. `.`은 현재 디렉토리를 의미합니다. 즉, Dockerfile이 있는 디렉토리에서 이미지를 빌드하겠다는 것을 의미합니다.
5. Docker 컨테이너 실행하기
Docker 이미지를 빌드한 후에는 컨테이너를 실행할 수 있습니다. 다음 명령어를 사용합니다.
docker run -p 80:80 my-fastapi-app
이 명령어는 -p 옵션을 사용하여 호스트의 80번 포트와 컨테이너의 80번 포트를 매핑합니다. my-fastapi-app은 앞서 빌드한 Docker 이미지의 이름입니다.
6. FastAPI 애플리케이션 확인하기
컨테이너를 실행한 후에는 웹 브라우저에서 http://localhost에 접속하여 FastAPI 애플리케이션을 확인할 수 있습니다. 화면에는 다음과 같은 메시지가 표시됩니다.
{"Hello":"World"}
이제 FastAPI와 Docker를 사용하여 애플리케이션을 배포하는 방법을 알아보았습니다. 이 방법을 사용하면 애플리케이션을 더 쉽게 배포하고 관리할 수 있습니다.
추가적으로, 위에서 작성한 Dockerfile은 개발 환경에서도 사용할 수 있습니다. 개발 환경에서는 -p 옵션을 사용하여 포트 매핑을 할 필요가 없습니다.
또한, 위에서 작성한 Dockerfile은 패키지들을 미리 설치하여 이미지의 크기를 줄이기 위한 것입니다. 하지만 패키지들이 자주 업데이트되는 경우에는 이미지를 다시 빌드해야 합니다. 이를 방지하기 위해서는 requirements.txt 파일에 패키지 버전을 지정하는 것이 좋습니다.
마지막으로, FastAPI는 비동기 처리를 지원하기 때문에 CPU 및 I/O 바운드 작업에서 높은 성능을 제공합니다. 그러나 애플리케이션이 복잡해지면서 메모리 사용량이 증가할 수 있습니다. 이러한 문제를 해결하기 위해서는 애플리케이션을 스케일 아웃하거나 메모리 관리를 최적화하는 등의 방법을 고려해야 합니다.