我想知道从 src(具有自己的“dockerized”IP 的 docker 容器)发送到运行该 docker 进程的虚拟机的 IP 地址的数据包的路由是什么?数据包会离开虚拟机还是会在本地路由?
这类似于让服务器端进程侦听所有接口和端口 XXX,并且客户端将数据包发送到 host_ip:XXX
答案1
数据包会离开虚拟机还是会在本地路由?
我不确定我是否理解这个问题。 “VM”是一堆命名空间,包括网络命名空间。 docker 主机使用主网络命名空间。如果一个容器发送了一个数据包,那么这个数据包就存在于容器的网络命名空间中,并在主机的主网络命名空间中进行处理,它有最终离开这个容器。是的,这发生在“本地”,即包含所有这些命名空间的物理机器上。
实际上,这个过程相当复杂:主网络命名空间和容器网络命名空间中都有大量的 iptables 规则(只需在 docker 安装上检查它们即可)。
答案2
这些数据包通过默认的 Docker 桥接网络在本地路由。
例如,在具有 Docker CEdocker0
默认桥接网络设置的 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
规则、网络命名空间等!