localhost로 통신이 되지 않는 이유(docker network로 해결)

4riend·2024년 5월 6일

CodeMind 프로젝트

목록 보기
17/20
post-thumbnail

프로젝트의 운영 환경은 EKS cluster 다.
해당 환경에 서비스를 띄우기 전 난 항상 로컬 테스트를 진행한다.
이번에 로컬에서 테스트를 하며 사용했던 docker network에 대해 적어본다 🔥


로컬 테스트 이유?

로컬 테스트를 왜 하냐고 생각할 수 있다 🤔
실제로 팀원이었던 분은 로컬 테스트를 하지 않았다. (적어도 내가 보기엔 그랬다)

그러나 난 로컬 테스트를 필수로 했는데 이유는 다음과 같다.

난 k8s 환경에 대한 컨트롤이 아직 미숙하다.
만약 별다른 테스트 없이 운영 환경에서 에러를 마주한다면 무엇이 원인인지 파악하기 어렵다.
결국 로컬 도커 환경에서 서비스가 정상적으로 동작함을 확인한 후 운영에 적용하고 있다.


상황

나의 경우 streamlit 서버와 hf api 서버가 통신을 해야하는 상황이었다.
streamlit에서는 아래와 같은 url 값을 통해 hf api 서버와 통신을 했었다.

HF_MODEL_API_SERVER_URL=http://localhost:8000/generate-text/

하지만 두 서버를 모두 docker 컨테이너로 띄운 후에는 통신이 되지 않았다 😢


원인

사실 아직까지도 확신에 찬 대답은 아니지만,,, 여러 글을 읽으며 결론낸 것을 풀어보자면

docker 컨테이너가 사용하는 localhost의 의미는 자기 자신의 컨테이너 IP를 가르킨다.
따라서 localhost를 통해서 다른 컨테이너와 통신은 불가능한 것이다 👀

여기서 docker0라는 bridge(브릿지)와 통신하는 개념이 등장하지만 완벽한 이해가 되었을 때 글로 더 정리해보겠다 🤣


해결 (docker network)

docker network를 생성하는 것이 해결법이었다.

내 컨테이너를 특정 네트워크에 연결하여 실행하고 이때 컨테이너의 name을 지정해주었다.

# Docker 네트워크 생성
docker network create my-network

# 컨테이너를 네트워크에 연결하여 실행
# api : huggingface model api 서버
# app : streamlit 서버
docker run --network my-network --name api -p 8000:8000 my-api-app
docker run --network my-network --name app -p 8501:8501 my-streamlit-app

모두 my-network라는 네트워크로 묶어주었고
streamlit 서버는 app, hf api 서버는 api라고 네이밍했다.

이때 맨 처음에 얘기했던 env값도 수정해야 한다 (localhost -> api)

HF_MODEL_API_SERVER_URL=http://api:8000/generate-text/

그럼 정상적으로 컨테이너 간 통신이 됨을 확인할 수 있을 것이다 👍


회고

사실 docker network를 통해 빠르게 해결하고 넘어갔던 구간이다.
그런데 막상 velog에 정리하려고 하니 다양한 개념에 대해 공부하는 시간을 갖게 되었다.
특히 docker network에 대한 주제로 글을 다시 작성해봐야겠다.

작년 프로젝트에서도 이런 문제를 만났던 적이 있는데 그때는 팀원이 담당해서 모른체 넘어 갔었다. (태경님 미안해... 🤣)
무튼 내가 클라우드 관련 직무로 취업에 성공할 수 있을지 모르지만 앞으로 더 정진해야 겠다.


참고 문헌

profile
날씨의 아이, 진격의 거인, 로스트 아크, Java Spring

0개의 댓글