Home FastAPI Docker 이미지 제작
Post
Cancel

FastAPI Docker 이미지 제작

소개

이번 포스트는 FastAPI 서비스를 Docker Image로 만들어 띄우는 방법에 대해 소개합니다.

main.py 생성

main.py 파일을 생성하여 기본 코드를 작성합니다.

1
2
3
4
5
6
7
8
9
10
11
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def root():
    return {"hello root"}

@app.get("/world")
def world():
    return {"hello world"}

해당 코드는 /로 접속하면 [hello root]가 출력 되고 /world로 접속하면 [hello world]가 출력 되는 간단한 프로그램입니다.

pip 모듈 정의

pip는 필요 모듈을 따로 정의하여 자동으로 패키지 추가가 가능합니다.

requirements.txt 파일을 생성하고 필요한 패키지를 정의 합니다.

1
2
uvicorn
fastapi

FastAPI는 uvicornfastapi 모듈이 기본적으로 필요합니다.

Docker Image 생성

Docker Image를 만들기 위해서는 Dockerfile을 정의하고 Docker build를 통해 자신만의 이미지를 생성하면 됩니다.

Dockerfile 정의

Dockerfile을 생성합니다.

1
2
3
4
5
6
7
8
9
10
FROM python:latest

WORKDIR /app/

COPY ./main.py /app/
COPY ./requirements.txt /app/

RUN pip install -r requirements.txt

CMD uvicorn --host=0.0.0.0 --port 8000 main:app
  • FROM python:latest : 베이스가 되는 Docker Image로 python 이미지를 사용합니다.
  • WORKDIR /app/ : 처음 실행 시 사용 되는 경로 정보 입니다.
  • COPY ./main.py /app/ : 현재 경로의 main.py를 /app 경로로 복사합니다.
  • COPY ./requirements.txt /app/ : 현재 경로의 requirements.txt를 /app 경로로 복사합니다.
  • RUN pip install -r requirements.txt: 복사 된 requirements.txt를 사용하여 pip로 패키지를 추가합니다.
  • CMD uvicorn --host=0.0.0.0 --port 8000 main:app : uvicorn을 사용하여 main.py의 app을 실행시킵니다.

Docker Build

Dockerfile이 있는 경로에서 docker build 명령어를 실행합니다.

1
> docker build --tag fastapi:0.1 .
  • --tag : 생성한 이미지의 이름을 설정합니다. 설정하지 않으면 None으로 생성됩니다.

Docker Container 생성

Dockerfile의 정의를 보면 기본 포트는 8000으로 되어 있습니다.

Container를 실행 할 때 Port 포워딩을 통해 원하는 포트를 지정하여 실행 할 수 있습니다.

1
2
3
4
5
6
> docker run --rm -p 8080:8000 fastapi:0.1

INFO:     Started server process [8]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
  • --rm : 이미지가 stop 되면 자동으로 Container가 삭제 됩니다.
  • -p 8080:8000 : FastAPI의 기본 포트인 8000과 자신의 로컬 포트 8080을 포워딩 합니다.

http://localhost:8080

1
["hello root"]

http://localhost:8080/world

1
["hello world"]

docker-compose 추가

docker-compose는 여러 컨테이너를 한번에 띄워야 할 때 하나의 파일로 정의하여 관리하기 위해 사용합니다.

docker image 생성 부터 실행까지 자동으로 할 수 있습니다.

docker-compose.yml 파일을 생성합니다.

1
2
3
4
5
6
7
services:
  fastapi:
    build:
      context: .
      dockerfile : .
    ports:
      - 8080:8000
  • services : service를 정의합니다.
  • fastapi: service의 이름입니다.
  • build : docker image를 생성 할 build에 대해 정의합니다.
  • context : build를 실행 할 경로 입니다.
  • dockerfile : dockerfile의 경로 입니다.
  • ports : 포트포워딩 정보 입니다.

docker-compose.yml 파일이 있는 곳에서 아래의 명령어를 실행합니다.

1
2
3
4
5
6
7
8
> docker-compose up

Creating src_fastapi_1 ... done
Attaching to src_fastapi_1
fastapi_1  | INFO:     Started server process [8]
fastapi_1  | INFO:     Waiting for application startup.
fastapi_1  | INFO:     Application startup complete.
fastapi_1  | INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

예제

fastapi_docker.zip

This post is licensed under CC BY 4.0 by the author.