Software Workshop

uvicorn으로 파이썬 웹서비스 앱을 개발하고 이걸 컨테이너로 만들었는데 외부에서 접근이 안 되는 증상이 발생할 수 있다.

curl localhost:8010
curl: (56) Recv failure: Connection reset by peer

호스트 OS에서 공개된 포트 8010으로 접근해보면 연결이 안 된다. (오류)

docker port my_web_app
8010/tcp -> :8010

docker port 명령을 이용해서 포트 매핑을 확인해보면 8010이 8010으로 노출되어 있다. (정상)

docker exec -it my_web_app curl localhost:8010
{ "result": "ok" }

컨테이너 내부에서 8010 포트는 정상 동작한다. (정상)

이런 경우, uvicorn 서비스가 실행될 때 접근 가능한 IP 대역을 제한했기 때문이다.

uvicorn main:app --port 8010

여기에 --host 0.0.0.0 옵션을 추가해서 로컬호스트 외부에서도 접근 가능하도록 허용해야 한다.

uvicorn main:app --port 8010 --host 0.0.0.0

Dockerfile은 이렇게 작성해야 한다.

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8010"]

여기에 --reload 옵션과 --workers 옵션을 추가로 지정할 수도 있다.