관리 메뉴

진취적 삶

9 배포 본문

개발 도서/FastAPI

9 배포

hp0724 2023. 10. 10. 14:04
  • 배포 준비
  • 도커를 사용한 배포
  • 도커 이미지 배포

9.1 배포 준비

의존 라이브러리 관리

pip freeeze 

9.2 도커를 사용한 배포

도커는 컨테이너화에 사용되는 인기있는 기술 ,

컨테이너는 패키지, 코드 ,의존 라이브러리로 구성된 하나의 시스템으로 실행 환경에 의존하지 않는다.

도커는 로컬 개발 환경 뿐만 아니라 프로덕션 애플리케이션을 배포할때도 사용한다.

도커파일 작성

도커 파일은 도커 이미지를 빌드하기 위한 몇가지 명령 셋으로 구성된다.

빌드된 도커 이미지는 개인 또는 공개 레지스트리에 등록된후 aws나 구글 클라우드 같은 클라우드 서버에 배포된다.

DockerFile

FROM python:3.11 

WORKDIR /app 

COPY requirements.txt /app/requirements.txt

RUN pip install --upgrade pip && pip install -r /app/requirements.txt 

EXPOSE 8000 

COPY ./ / /app/ 

CMD ["python","main.py"]
  1. FROM 키워드를 사용해 기본 이미지 지정
  2. WORKDIR 작업 디렉터리 지정
    작업 디렉터리는 이미지로 빌드될 프로젝트 구조를 정리할때 도움이 된다.
  3. COPY 키워드를 통해서 로컬 디렉터리에서 도커 컨테이너로 복사
  4. RUN 명령을 사용해 PIP 업그레이드 Requirement.txt 파일을 기반으로 설치
  5. EXPOSE 사용해 네트워크에서 애플리케이션에 접속할수 있는 포트 번호를 설정
  6. 나머지 파일을 도커 컨테이너의 작업 디렉터리로 복사
  7. CMD 명령어 사용해 애플리케이션 실행

이미지를 빌드할때 캐시 시스템을 사용한다.

.dockerignore

gitignore와 비슷하게 도커파일에 정의된 명령을 실행할때 제외할 파일과 폴더 지정

도커 이미지 빌드

도커를 실행후

docker build -t event-planner-api . 

몽고 DB pull

몽고 db 이미지를 풀해서 API 컨테이너가 접근할수 있는 데이터베이스 컨테이너를 생성

docker pull mongo 

docker pull 명령은 레지스트리에서 이미지를 다운

로컬에 애플리케이션 배포

배포를 담당하는 파일 생성

docker-compose.yml 
version: "3"

services:
  api:
    build: .
    image: event-planner-api:latest
    ports:
      - "8000:8000"
    env_file:
      - .env.prod

  database:
    image: mongo
    ports:
      - "27017"
    volumes:
      - data:/data/db

volumes:
  data:

services 섹션의 경우 api 서비스와 데이터베이스 정의

  1. api 서비스
    1. build 필드는 현재 디렉토리 (.) 에 있는 도커 파일을 기주능로 event-planner-api:latest 이미지 빌드
    2. ports 에는 8000번 포트 노출
    3. .env.prod 파일을 환경 파일로 설정
  2. 데이터 베이스 설정
    1. 몽고 이미지 사용
    2. 27017 번 포트를 정의했으나 외부로 노출하진 않는다.
    3. 영구적 불륨을 서비스에 할당해서 데이터를 저장하는데 사용
    4. data라는 불륨을 할당하여 배포에 사용

.env.prod

DATABASE_URL="mongodb://localhost:27017/users" 
SECRET_KEY= suhaking333ilovethecodingbutilove

애플리케이션 실행

docker-compose up -d 

실행되고 있는 컨테이너 확인

docker ps 

'개발 도서 > FastAPI' 카테고리의 다른 글

8 테스트  (0) 2023.10.10
7 보안  (1) 2023.10.10
6 데이터베이스 연결  (0) 2023.10.10
5 구조화  (0) 2023.10.10
4 템플릿팅  (0) 2023.10.10