Docker 컨테이너를 사용한 머신 간 포트 매핑

Docker 컨테이너를 사용한 머신 간 포트 매핑

나는 2 대의 기계를 가지고 있습니다.

  • 192.168.0.10
  • 192.168.0.20

몇 가지 도커 서비스를 실행합니다.

두 번째 머신에서는 몇 개의 포트에서 첫 번째 머신의 서비스로부터 들어오는 트래픽이 보입니다.

하지만 첫 번째 호스트를 확인하면 해당 포트가 사용 중인 것으로 표시되지 않습니다.

예를 들어 다음과 같이 표시됩니다.

 192.168.0.10:48002 ->  192.168.0.20
 192.168.0.10:51364 ->  192.168.0.20
 192.168.0.10:52502 ->  192.168.0.20

그러나 해당 포트를 확인하기 위해 192.168.0.10으로 이동하면 해당 포트가 사용 중인 것으로 표시되지 않습니다.

따라서 이것은 비어 있습니다.

sudo netstat -tulpan | grep '52502'

이 문제의 원인은 무엇이며 어떻게 조사합니까? 도커 컨테이너 및 포트 매핑과 관련이 있다고 생각합니다. 아마도?

편집하다:

서비스 자체를 검색하면 다음과 같은 내용이 표시됩니다.

tcp6       0      0 127.0.0.1:48806         127.0.0.1:8088          ESTABLISHED 1065071/java

내부 포트가 도커 네트워크의 다른 포트로 이동하고... 그 다음에는 아무것도 없습니다. 이것이 다른 모든 트래픽이 통과하는 일종의 터널이라고 가정해야 합니까? 이것을 어떻게 매핑합니까?

답변1

TCP 서비스에 연결할 때 대상 포트는 미리 알려져 있지만(예: 80http 서비스의 경우) 소스 포트는 일반적으로 32767 이상의 포트 번호를 사용하여 소켓을 생성할 때 무작위로 선택됩니다.

에 보이는 세 개의 포트 192.160.0.10는 연결의 소스 포트입니다.192.168.0.20

답변2

컨테이너 트래픽이 Docker에서 시작되거나 종료되지 않습니다.주인Docker에서 또는 Docker로 라우팅되기 때문입니다.컨테이너. 호스트 자체는 라우터 역할을 하며 이 트래픽에 사용되는 소켓이 없습니다 docker-proxy.NAT 헤어핀로 비활성화되지 않은 경우 --userland-proxy=falseNAT 헤어핀 설정은 다음과 같이 수행됩니다.iptables그리고route_localnet).

Docker가 사용하는 것처럼iptablesNAT, 이 모든 것은 Netfilter에 의해 추적됩니다.콘트랙.

추적된 흐름을 보려면conntrack명령( conntrack필요한 경우 패키지 설치) 이 모든 트래픽은 NAT로 연결되므로 이 명령은 관련된 모든 흐름을 표시합니다.

conntrack -L --any-nat -d 192.168.0.20

이는 주소가 192.168.0.10인 시스템에서 실행되어야 하며, 주소가 192.168.0.20인 시스템에서 본 소스 NAT 흐름(클라이언트로서의 컨테이너)을 표시해야 합니다.

주소가 192.168.0.20인 시스템의 대상 애플리케이션이 Docker 컨테이너에도 있는 경우 해당 시스템에서 실행될 때 동일한 명령을 실행하면 대상 NAT 흐름(서버로서의 컨테이너)이 표시됩니다. 그렇지 않은 경우 표시할 NAT가 없으므로 아무 것도 표시되지 않습니다.

관련 정보