같은 포트, 다른 타입...

ms-shin·2022년 10월 3일
1

docker

목록 보기
2/5

근본적인 원인을 향해서 공부하면서 정리하려고 이 글을 작성한다.

문제 인식

  • 3306:3306 container 포트 바인딩시에 아래와 같이 두 프로세스가 같은 실행되고 있었다.

문제 정의

  • bind failed. Error: Address already in use 같은 에러를 뱉지 않았을까?
  • 로컬에서 mysql -u root -p 접속시에 mysqld인 프로세스로 접속이 될까?

이 두가지 의문점을 안고 어떤 원리가 있는지 알아보고자 한다.

문제 탐구

  • IPv6, IPv4는 구체적으로 무엇인가?

IPv4는 현재의 인터넷 프로토콜이며, 패킷 교환 네트워크 상에서 교한하기 위한 프로토콜이다. 데이터가 정확하게 전달되는 것을 보장하지 않고, 중복된 패킷을 전달하거나 패킷의 순서를 잘못 전달할 가능성 또한 가지고 있다. 현재 데이터의 순서 보장은 상위 프로토콜인 TCP에서(그리고 UDP에서도 일부) 보장한다.

여기서 IPv4의 주소 체계는 총 12자리이며 4부분으로 나눠진다. (255.xxx.xxx.xxx). 32비트로 구성되어 있다. 하지만, 주소 고갈로 인해 128비트 주소 체계를 가진 IPv6가 등장하였다.
2011년 2월 4일부터 모든 IPv4 주소가 소진되면서 IPv4의 할당이 중지되었다. 역사 속으로...
https://ko.wikipedia.org/wiki/IPv4

  • 일단 docker가 host의 IPv6 3306포트를 container 3306포트와 연결했다. 실제로 127.0.0.1이 아닌 ::1 로 접속하니 container의 mysql로 접속이 됐다... 그렇다면, 두 가지 의문 중에 두번째 의문은 해결이 되었다.
  • bind failed. Error: Address already in use 같은 에러를 뱉지 않았을까?
  • 로컬에서 mysql -u root -p 접속시에 mysqld인 프로세스로 접속이 될까?

  • IPv4, IPv6는 같은 포트를 사용할 수 있다는 얘기이다...포트란 뭘까.. 당연하게 받아들인 동일 포트는 사용할 수 없다고 받아들였지만 왜 동일 포트는 사용할 수 없는 것일까?

IPv4는 하나의 주소 체계이고, 그 주소에 접근하는 통로를 의미하는 것이 포트이다. 포트는 IP내에서 프로세스를 구분하기 위해서 사용하는 번호이기 때문에 주소마다 포트가 있을 것이기 떄문에 IPv4, IPv6는 같은 포트를 사용할 수 있다는 것은 합리적 추측이라고 생각한다.

추가적으로 포트는 OSI 7계층에서도 전송 계층에서 사용되는 개념이기 때문에, IP 주소와 독립적이라고 한다.

https://superuser.com/questions/842811/can-two-different-services-on-the-same-machine-use-the-same-port-on-ipv4-and-ipv

❗️PORT(포트)란?
Port(포트)란 IP 내에서 애플리케이션 상호 구분(프로세스 구분)을 위해 사용하는 번호이다.
포트 숫자는 IP 주소가 가리키는 PC에 접속할 수 있는 통로(채널)을 의미한다.
포트 번호는 0~ 65,535 까지 사용할 수 있다.
그 중에서 0 ~ 1024번 까지의 포트 번호는 주요 통신을 위한 규약에 따라 이미 정해져 있다.
https://hanamon.kr/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EB%B3%B8-ip-%EC%A3%BC%EC%86%8C%EC%99%80-%ED%8F%AC%ED%8A%B8-port/

  • 그럼 일단 두가지 의문점에 대한 해답을 찾은 것 같다.
  • bind failed. Error: Address already in use 같은 에러를 뱉지 않았을까?
  • 로컬에서 mysql -u root -p 접속시에 mysqld인 프로세스로 접속이 될까?
  • docker는 자동적으로 IPv6로 포트 바인딩을 디폴트로 하는 것인가?

실제로 docker-compose version 3으로 compose up했고, docker version은 1.13.0버전으로 오래된 버전을 사용한다. docker 20.10 버전 이전까지는 암묵적으로 IPv6, IPv4를 기본적으로 접근 가능하게 셋팅한다고 한다. 아래는 docker doc의 릴리즈 노트이다.


https://docs.docker.com/engine/release-notes/#20106

결론

  • IPv4, IPv6로 구분되어 port가 셋팅되어있엇고, 각 루프백 주소로 mysql을 접근해야한다.
  • IPv4 (127.0.0.1), IPv6 (::1)으로 접근

다음 이야기

하지만, 여기서 드는 의문이 있다. 포트는 애플리케이션을 구분하기 위해서 정의되었다. 하지만, 왜 mysqlddocker host port 이 두 애플리케이션이 같은 포트를 사용하고 있을까?
사실상, IPv4, IPv6 주소체계와는 별개로 port가 독립적이라고 함은 주소 체계가 어떻든 같은 포트를 사용하는 것인데, 다른 애플리케이션을 접근한다는 것이 이해되지 않는다.

profile
지식을 깊게 파고드는 개발자입니다.

0개의 댓글