본문 바로가기
Dev./Docker

[Docker] fastapi를 도커화하는 방법

by _YUJIN_ 2024. 3. 7.

python 기반의 FastAPI를 도커화 해서 파이프라인에 올리는 작업을 해야한다. 

FastAPI를 도커화할 때 필요했던 것들을 모두 정리하려고 한다. 

 

1. 도커 이미지 생성

2. 도커 컨테이너 실행

3. 포트포워딩

4. 워커수 설정 


1. 도커 이미지 생성

도커 이미지를 생성하기 전에 Dockerfile 을 만들어준다. 

  • Dockerfile : 애플리케이션을 Docker 컨테이너로 빌드하기 위한 파일 
# Dockerfile

# server image 초기설정 : python 3.9.10 버전을 사용
FROM python:3.9.10

# 작업할 경로 (해당 경로가 없다면 새로 생성됨)
WORKDIR /api 
# 작업할 경로에 현재 코드들을 모두 복사해둔다.
COPY . .

# image가 빌드되었을 때 수행되는 명령어들
RUN apt-get update && apt-get install -y libgl1-mesa-glx
RUN pip install --no-cache-dir --upgrade -r requirements.txt

# expose를 활용해서 7504포트로 접근이 가능하도록 한다.
# 컨테이너 생성시 -p 옵션의 컨테이너 포트 값으로 EXPOSE 값을 적어야한다. 
EXPOSE 80

# 컨테이너 생성할 때만 실행된다. - docker run ...
CMD ["sh", "-c", "uvicorn main:app --host 0.0.0.0 --port 80 --workers $WORKERS"]

 

Dockerfile을 만들었으면 도커 이미지 빌드 명령어를 실행해준다.

  • docker build -t [이미지이름:이미지버전] [dockerfile의 경로]
$ docker build -t test_image_name:0.2.0 .

 

(참고1) 도커 이미지를 확인하기 위한 명령어

$ docker images

 

(참고2) 도커 이미지 삭제 명령어

  • docker rmi [이미지이름]
$ docker rmi test_image_name

 

2. 도커 컨테이너 생성

컨테이너 생성 시 명령어

  • $ docker run -d -p 80:80 -e WORKERS=4 --name [컨테이너 이름 지정] [빌드된 이미지 이름]
$ docker run -d -p 80:80 -e WORKERS=4 --name test_container test_image_name
  • -d : 백그라운드모드에서 실행 
  • -p : [호스트포트][컨테이너포트] 연결
    • 컨테이너 포트는 Dockerfile에 있는 Expose 포트번호로 작성
  • --name : 컨테이너 이름 
  • -e : 컨테이너 환경 변수를 정의

(참고3) 컨테이너 목록 보기 명령어

$ docker ps     #현재 실행되는 컨테이너 확인
$ docker ps -a  #모든 컨테이너 확인

 

(참고4) 컨테이너 삭제 명령어

$ docker stop [컨테이너번호 또는 컨테이너이름]
$ docker rm [컨테이너번호 또는 컨테이너이름]

 

3. 포트포워딩

  • 도커 컨테이너를 실행할 때 명령어에서 포트포워딩을 해줄 수 있다. 
  • -p 옵션이 호스트 포트와 컨테이너 포트를 연결해주는 것이다. 
  • 만약, 도커 이미지의 80번 포트를 내 로컬에서는 7500번에서 사용하고 싶다면 -p 7500:80 으로 바꿔서 실행하면 된다. 
$ docker run -d -p 7500:80 -e WORKERS=4 --name test_container test_image_name

 

4. 워커수 설정

  • API가 병렬적으로 실행하게 하기 위해서는 워커수를 지정해서 API를 띄워야한다. 
  • 그래서 도커 컨테이너에 환경변수를 설정해서 바꿀 수 있도록 실행할 수 있다. 

환경변수를 받기 위해서는 Dockerfile도 수정을 해야한다. 

  • 아래의 Dockerfile에서 보면 --workers $WORKERS 로 변수를 받을 수 있도록 설정해두었다. 
# Dockerfile
# 해당 블로그 1번 내용 참고 
# 앞 내용 생략 

CMD ["sh", "-c", "uvicorn main:app --host 0.0.0.0 --port 80 --workers $WORKERS"]

 

Dockerfile에서 환경변수를 정의한 다음에 도커 컨테이너를 생성하는 아래 명령어에서 환경변수에 대한 값을 설정해서 실행하면된다.

$ docker run -d -p 7500:80 -e WORKERS=4 --name test_container test_image_name
  • -e WORKERS=4 의 의미는 워커수를 4로 설정한다는 것이고, 만약 늘리려면 숫자를 바꿔서 사용하면 된다. 

 

마지막으로 , 127.0.0.1:7500/docs 에 접속해보면 API 인터페이스를 확인해 볼 수 있다.

반응형