본문 바로가기
인프라

Docker, FastAPI

by 스티브 십잡스 2024. 3. 24.
FROM python:3.12.2

WORKDIR /src

COPY ./requirements.txt /src/requirements.txt

RUN pip install --no-cache-dir --upgrade -r /src/requirements.txt

COPY ./app /src/app
COPY ./logs /src/logs
COPY ./test /src/test
COPY ./application.json /src/application.json

EXPOSE 8000

CMD ["python", "app/main.py"]

 

도커는 컨테이너 환경에서 도커 이미지에 빌드된 코드를 실행합니다.

컨테이너 안을 하나의 서버 (클라우드 서비스에서 새로 구성한 서버라 가정) 라고 가정하고 예제 코드를 설명하겠습니다.

 

  1. FROM
    • 새롭게 구성한 서버에 파이썬을 설치합니다.
  2. WORKDIR
    • 새롭게 구성된 서버에서 /root 경로로 이동해보면, 기본으로 구성된 폴더들을 확인할 수 있습니다.
      • /home, /var, 등
    • 기본 폴더를 사용할 수 있지만, /src 라는 새로운 폴더를 만들어 사용합니다.
      • /workspace 등 자유롭게 설정 가능
  3. COPY
    • 나의 로컬 환경의 파일을 가상 서버의 어떠한 경로로 파일을 복사합니다.
      • scp 명령어와 유사한 것 같습니다.
    • 파이썬에서 사용할 라이브러리를 적어둔 파일을 복사합니다.
    • COPY ./ ./ 라 적어도 다 복사되겠지만, 필요없는 파일들이 존재할 수 있기 때문에 따로 복사하도록 했습니다. 
  4. RUN
    • 바로 전 단계에서 복사한 라이브러리 설치 파일을 실행시켜, 도커 컨테이너 안에 설치합니다.
  5. COPY ...
    • 파일 구조를 고려하여 다른 파일들을 복사합니다.
  6. EXPOSE
    • 도커 컨테이너는 독립적이고 PORT를 열지 않으면 폐쇠적으로 실행되는 프로세스이기 때문에 외부와 통신할 PORT를 열어야 합니다.
    • FASTAPI 기본 실행 PORT인 8000을 열었습니다.
  7. CMD
    • 실행될 명령어를 띄어쓰기 기준으로 적습니다.
    • 실행되는 위치는 마지막 WORKDIR 경로에서 해당 명령어가 실행됩니다.

 

작성된 도커 파일을 기준으로 도커 이미지를 빌드합니다.

docker build -t { 이미지 이름 } ./
  • . 또는 ./ 은 해당 경로에서 도커 파일을 찾을 수 있게 합니다.

빌드된 도커 이미지를 실행합니다.

docker run -d -p 8000:8000 { 이미지 이름 }​
  • d는 detach를 의미하는데 쉽게 말해 그냥 애플리케이션을 실행하면, 실행한 위치를 벗어나거나 종료하면 애플리케이션이 종료하지만 이를 가능하게 해줍니다.
  • p는 port를 의미하면 앞은 호스트 포트, 뒤는 컨테이너 포트를 의미합니다.
    • 도커가 실행되는 서버의 호스트 포트가 컨테이너의 어떤 포트와 통신하는지를 뜻합니다.
    • 아까 도커 파일에서 EXPOSE 한 포트가 뒤에 작성됩니다.
  • 추가적으로 nginx (웹 서버 소프트웨어)의 location, proxy_pass 속성에 localhost:8000을 등록하면 해당 서버의 특정 경로로 들어오는 http 요청을 지정한 url로 매핑시킬 수 있습니다.
  • lsof -i :{ 포트 } 명령어를 통해 도커가 잘 실행 중인지 확인할 수 있다.
docker ps # 컨테이너 ID 확인
docker exec -it { 컨테이너 Id } /bin/bash

exit # 탈출​
  • 실행 중인 컨테이너 접근할 수 있습니다.

 

docker cp { 컨테이너 Id }:{ 컨테이너 내부 파일 경로 } { 저장할 경로 }
  • 리눅스의 scp 명령과 유사
  • 저장할 경로는 도커가 실행 중인 로컬 혹은 서버
  • 외부 서버를 사용한다면, 
    • 도커에서 외부 서버로 파일을 저장한 후
    • PuTTY를 사용해서 로컬 PC로 가져오는 것이 편할 것이다.

 

mv { 기존 폴더명 } { 변경 폴더명 }
  • logs 라는 폴더를 도커 컨테이너에서 가져왔다면, logs-yymmddHHMM 형태로 폴더명을 바꿔서 관리할 수 있습니다.