从 docker 容器到主机 ip 的数据包路由

从 docker 容器到主机 ip 的数据包路由

我想知道从 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规则、网络命名空间等!

相关内容