Python/FastAPI

FastAPI + Docker Container, 웹사이트가 뜨지 않는 문제(+ IP 관련)

MORAN9 2024. 4. 16. 15:48
반응형

[ 작업 환경 ]
- Docker Container
- Docker Network: Bridge Driver
- Rockylinux:9.2
- FastAPI + uvicorn
 


 

문제점

사실 그냥 뻘짓했습니다.. 단순 IP 잘못 입력한 문제입니다.

[root@dcb4 app]# uvicorn main:app --reload --port=8000
INFO:     Will watch for changes in these directories: ['/path/app']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [312139] using StatReload
INFO:     Started server process [312141]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

 

127.0.0.1:8000으로 접속한 브라우저에서 페이지가 작동하지 않습니다. 메시지가 뜨는 화면.
아.. 어디갔니...

 

# curl IP:port로 해당 경로에서 리턴되는 내용 터미널에서 보기
[root@dcb4 /]# curl 127.0.0.1:8000
{"Hello":"World"}

아예 뭐가 잘못됐다기엔 도커 내부에서 명령창에서 확인해보면 또 잘 되고..
안되시는 분들 이거 한 번 확인해보시기 바랍니다.
 
 
파일명: docker-compose.yaml

version: "3.8"
services:   
  fastapi:
    container_name: fastapi
    ...
    ports:
      - '8000:8000/tcp'

도커 파일은 이전에 FastAPI 테스트해보던 파일을 재활용한거라, 맞을텐데요... 그냥 한동안 안썼더니 까먹었습니다..
 


 

 

생각해보니 0.0.0.0

생각해보니 지난 번 실행했을 때는 host를 따로 0.0.0.0으로 지정했었네요..(출처: 내 머릿속)

[root@dcb4 app]# uvicorn main:app --reload --host=0.0.0.0 --port=8000

INFO:     Will watch for changes in these directories: ['/path/app']
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [307719] using StatReload
INFO:     Started server process [307721]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     172.18.0.1:52858 - "GET /docs HTTP/1.1" 200 OK
INFO:     172.18.0.1:52858 - "GET /openapi.json HTTP/1.1" 200 OK

0.0.0.0:8000으로 접속한 브라우저에서 사이트에 연결할 수 없음. 메시지가 뜨는 화면.
하지만 여전히 안됩니다.

 


 
 

해결법

선언은 0.0.0.0, 접속은 127.0.0.1


 
 
방법 요약:
- 도커의 FastAPI 컨테이너에서 uvicorn을 실행할 때, host를 0.0.0.0으로 실행
- 도커 컨테이너의 경우, uvicorn에서 --port로 설정한 포트는 외부와 연결되어야함.
- 컨테이너 외부 데스크탑 브라우저에는 0.0.0.0 대신 127.0.0.1 혹은 localhost 주소 사용

[root@dcb4 app]# uvicorn main:app --reload --host=0.0.0.0 --port=8000

 
 
 

localhost:8000으로 접속한 브라우저에서 정상적으로 {"Hello":"World"}가 리턴되는 화면.
localhost:8000 으로도 되고..

 

127.0.0.1:8000/docs로 접속한 브라우저에서 정상적으로 Swagger UI가 리턴되는 화면.
127.0.0.1로도 됩니다. /docs 붙이면 Swagger

 


 
 

필요하신 분들만

왜 0.0.0.0로 서버를 열고, localhost로 받는지에 관한 자료

 

What is the Difference Between 127.0.0.1 and 0.0.0.0?

Most of us have heard of '127.

www.howtogeek.com

대충 이해한 바를 토대로 보자면, 0.0.0.0은 로컬이 보유한 모든 IP를 뜻한다고 합니다.
 
 
그럼 이렇게도 될까요?

[root@dcb4 app]# uvicorn main:app --reload --host=172.18.0.2 --port=8000
INFO:     Will watch for changes in these directories: ['/path/app']
INFO:     Uvicorn running on http://172.18.0.2:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [356441] using StatReload
INFO:     Started server process [356584]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     172.18.0.1:40138 - "GET / HTTP/1.1" 200 OK

172.18.0.2는 현재 FastAPI가 돌아가고 있는 컨테이너의 IP입니다.
 
 
도커 컨테이너 IP를 조회하는 방법은 제 다른 게시물을 참고해주세요.

 

Docker에서 컨테이너의 IP / 네트워크 대역대 조회 방법

Docker 네트워크 조회 명령어: C:\Users\user> docker network ls NETWORK ID NAME DRIVER SCOPE 81288... bridge bridge local c074c... host host local 4fb53... none null local ffef3... myProject bridge local C:\Users\user> docker network inspect myProje

moran-lab.tistory.com

 
 

localhost:8000/redoc로 접속한 브라우저에서 정상적으로 ReDoc UI가 리턴되는 화면.
/redoc 붙이면 ReDoc

 
아무튼 되네요.. 그냥 궁금해서 해봤지만, 제 경우에서는 저렇게까지 할 이유는 없을 것 같고, 0.0.0.0이면 될 것 같습니다.
 

반응형