2023. 5. 8. 00:00ㆍPython/FASTAPI
1. FASTAPI 로 기본 app 생성
poetry new fastapi-docker
cd .\fastapi-docker\
bash -c "nano main.py"
// 파일 내용
from fastapi import FastAPI
app = FastAPI(title="FastAPI, Docker")
@app.get("/")
def read_root():
return {"hello": "world"}
@app.post("/")
def read_root():
return {"hello": "world"}
이 상태에서 fastapi 와 gunicorn, uvicorn 을 다운 받는다.
poetry add fastapi uvicorn[standard] gunicorn
poetry shell
uvicorn main:app --reload
위 명령중 혹시 poetry shell 에서 에러가 나오면 아래명령을 실행 한다.
(pyenv 로 python 을 install 했다고 가정함.
그렇지 않다면 python.bat 는 실제 사용하려는 python version 의 path 가되어야함)
poetry env use python.bat
아래와 같은 메세지가 뜬다면 정상 실행된 것임
이제 browser 에서 실행해보자
다음 주소들을 차례로 실행하여 문서화 처리도 되는지 확인하자
ctrl + c 후에 exit 해서 가상환경에서 나오자
2. 만들어진 기본 app 를 이용하여 Docker Image image 만들기
bash -c "nano Dockerfile"
//파일내용
FROM python:slim as python-base
RUN mkdir python_tutorial
WORKDIR /python_tutorial
COPY /pyproject.toml /python_tutorial
COPY README.md /python_tutorial
RUN pip3 install poetry
RUN poetry config virtualenvs.create false
RUN poetry install --no-root
COPY . .
CMD ["gunicorn", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "main:app", "--bind", "0.0.0.0:8000"]
docker build 를 이용해서 image 를 만들자
docker build --tag fastapi-docker:latest .
아래와 같이 생성된다.
이제 이 docker 를 실행해보자
docker run -p 8000:8000 fastapi-docker:latest
그리고 browser 에서 8000 port 를 통해 실행해보면 이전과 같은 결과가 나올것이다.
docker 를 통해서 이전에 우리가 만든 fastapi 를 실행한 것이다.
이제 이 docker 를 멈추고 삭제해 보자
docker ps
docker stop 5a4492e112d5
container id 를 stop 시키면 된다. (여러분은 다를것이다.)
docker ps -a
실행을 멈춘 container 가 존재하는걸 알수 있다.
container 자체를 삭제하자
docker container rm 5a4492e112d5
이제 docker ps -a 에서도 완전히 삭제된걸 알수 있다.
이제 image 를 삭제하자
docker images | findstr /s fastapi-docker
docker rmi fastapi-docker:latest
3. Kubectl 을 이용하여 pod 를 생성하고 docker image 실행하기
docker image 를 다시 build 하자
docker build --tag fastapi-docker:latest .
kubectl 을 이용해서 pod 를 만들자
kubectl run fastapi-docker --image=fastapi-docker:latest --image-pull-policy=Never
pod 를 외부에 노출하기 (port forwarding 이용)
지금 상태로는 외부에서 pod 를 연결할수 없다. (pod 내부에서만 접근 가능)
그렇기 때문에 port forwarding 을 이용해서 외부로 port 를 노출해야 한다.
kubectl port-forward pods/fastapi-docker 8080:8000
이제 browser 8080 port 로 에서 접속해보자. (http://localhost:8080)
정상적으로 접속될 것이다.
이제 pod 를 삭제하고 docker image 도 삭제하자
kubectl delete pod fastapi-docker
docker rmi fastapi-docker:latest
관련영상