src(자체 "도커화된" IP가 있는 도커 컨테이너)에서 해당 도커 프로세스를 실행하는 가상 머신의 IP 주소로 전송된 패킷의 경로가 무엇인지 알고 싶습니다. 패킷이 가상 머신을 떠나나요, 아니면 로컬로 라우팅되나요?
이는 서버측 프로세스가 모든 인터페이스와 포트 XXX를 수신 대기하고 클라이언트가 호스트_ip:XXX로 패킷을 보내는 것과 유사합니다.
답변1
패킷이 가상 머신을 떠나나요, 아니면 로컬로 라우팅되나요?
질문을 이해했는지 잘 모르겠습니다. "VM"은 네트워크 네임스페이스를 포함한 네임스페이스 묶음입니다. Docker 호스트는 기본 네트워크 네임스페이스를 사용합니다. 컨테이너가 패킷을 보내는 경우 해당 패킷은 컨테이너의 네트워크 네임스페이스에 존재하며 호스트의 기본 네트워크 네임스페이스에서 처리됩니다.가지다결국 컨테이너를 떠나십시오. 예, 이는 "로컬"로, 즉 모든 네임스페이스를 포함하는 물리적 시스템에서 발생합니다.
실제로 프로세스는 매우 복잡합니다. 기본 네트워크 네임스페이스와 컨테이너 네트워크 네임스페이스 모두에 많은 iptables 규칙이 있습니다(docker 설치에서 확인하세요).
답변2
이러한 패킷은 기본 Docker 브리지 네트워크를 통해 로컬로 라우팅됩니다.
docker0
예를 들어 Docker CE 의 기본 브리지 네트워크 설정이 있는 CentOS 8 호스트에서는 다음과 같습니다 .
on-the-host$ ip a sh
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
link/ether 0a:b4:8e:4b:9d:e3 brd ff:ff:ff:ff:ff:ff
inet 172.20.8.151/24 brd 172.20.8.255 scope global dynamic noprefixroute eth0
valid_lft 3175sec preferred_lft 3175sec
102: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:cd:4e:e9:51 brd ff:ff:ff:ff:ff:ff
inet 10.200.0.1/24 brd 10.200.0.255 scope global docker0
valid_lft forever preferred_lft forever
이제 Docker 컨테이너 내에서 호스트 인스턴스에 액세스하려고 합니다.
within-docker-container$ ip a eth0
212: eth0@if213: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:0a:c9:08:09 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.201.8.9/24 brd 10.201.8.255 scope global eth0
valid_lft forever preferred_lft forever
within-docker-container$ traceroute -Un 172.20.8.151
traceroute to 172.20.8.151 (172.20.8.151), 30 hops max, 60 byte packets
1 172.20.8.151 0.054 ms 0.010 ms 0.010 ms
패킷이 호스트의 eth0
네트워크 카드에 직접 도착하는 것을 볼 수 있습니다.
그러나 많은 하위 수준 작업이 호스트 인스턴스에서 발생한다는 점을 명심하세요. iptables
규칙, 네트워크 네임스페이스 등!