CS/Network

포트번호? 8080:8080 그게 뭐지??

F12:) 2023. 8. 30. 23:10

도커 컴포즈 파일이나 도커를 작성할 때, 또는 흔히들 포트번호를 입력하여 통신을 한다. 나는 이걸 그냥 감으로만 캐치하여 사용하고 있었고, 본질적으로 포트번호 충돌이 일어나도, 대충 숫자만 바꾸는 식으로 진행했다. 그런데, 이번에 docker compose를 작성하면서, 포트번호에 대한 의문점이 생겼고 어떻게 사용하는지에 대해서 멘토(?)에게 자문해봤다.

 

그리고 이 글은, 그렇게 간단하게나마 포트번호에 대한 개념을 최소한의 데이터 통신의 지식으로 이해할 수 있도록 쓰였다.


우선 우리는 많은 서비스에서 API로 요청을 하거나, DB를 설정할 때, 프론트와 백의 소통에서 포트번호를 일치해줘야한다는 것을 알고 있다. 막상 쓸 때는 '숫자만 대충 맞으면 되지'라는 식으로 진행했지만, 직접 작성하려고 하니, 무슨 의미인지 모르겠어서 자문을 통해 얻은 부분을 정리해본다.

 

 

우선 8080:8080을 이해하기 위해서는, 외부 포트 번호와 내부 포트 번호에 대해서 이해해보자.

 

설명을 위해 앞뒤가 다른 8081:8080으로 설명한다. 우리의 어떤 서비스 중 하나가 8081:8080으로 되어있다고 하자. 이 때, 앞에 있는 8081은 외부 노출 포트이다. 즉, 외부에서 접근할 때(url 등) 8081로 접근할 수 있게 된다. 따라서 클라이언트나 외부에서 이 서비스를 이용하기 위해서는 8081 포트번호로 호출을 한다. 가령 localhost:8081 처럼 말이다.

 

그렇다면 뒤에 있는 8080은 내부 포트 번호이다. 어떤 서비스를 구성하는 서버가 8081로 요청을 받으면 서버 내부의 8080과 매핑하여 8080에 해당하는 로직이나 명령을 수행한다는 뜻이다. 즉, 8081은 외부에서 나를 부르는 포트번호. 8080은 내부에서 나를 부르는 포트번호로 이해하면 된다.

 

아래의 그림을 통해 한번 더 설명을 상기해보자. 아래의 설명은 3030:8080에 대한 설명이다.

 

 

여기서 설명을 조금 덧붙여보겠다.

 

만약 내가 프로젝트를 2개 진행하는데, 그 2군데에서 모두 다 mysql 서버를 두개 사용하고 있다고 해보자. mysql은 보통 3306:3306을 사용하므로, 두 개의 프로젝트에서 사용하면 포트 충돌이 난다. 따라서 하나에서 포트번호를 바꾸어야하는데, 내부 포트번호는 바꿀 필요가 없는 것이다.

 

 

하나의 프로젝트에서는 3307을 mysql 호출 포트번호로 설정해놓는다면, mysql 내부 포트 번호와는 상관없이 3307과 3306으로 다른 mysql을 불러올 수 있는 것이다.

 


이상으로 간단하게 정리를 해보았다. 사실 나도 데이터통신 과목을 수강한 적도 없고 아직 깊게 공부하지 않아서 이정도밖에 모르지만.. 차차 이런식으로 배우지 않아도 간단하게 알아가면서 공부를 해야할 필요성을 느낀다.