网站首页 文章专栏 docker容器网络详解
docker容器网络详解
编辑时间:2022-08-16 15:16:35 作者:linxi 浏览量:327

Linux系统的route命令用于显示和操作IP路由表, 要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现

image.png

前两条是自动生成的因为是直连的网段,在每块网卡上每配置一个IP就会生成一条记录(一个网卡上可以配置多个IP)。表示去往这两个网段的数据包,直接由网卡接口eth0及eth1发送出去

这两条记录中的gateway并没有意义,Flags那一列中有G时才会使用Gateway。这两条路由并没有这样的标志,由于它们是本地的,匹配这些条目的数据包会直接通过Iface列中的网卡发送出去。

后两条表达的意思:

192.168.0.0   10.77.238.254  255.255.0.0     UG    0     0    0  eth0
表示去往192.168.0.0网段的数据包由网关10.77.238.254通过网卡eth0来转发
    0.0.0.0       169.254.0.0    0.0.0.0         UG    0     0    0  eth1
    表示去往所有目标地址数据包由网关169.254.0.0 通过网卡eth1来转发其中,对于0.0.0.0的解释

If used in a routing table, it identifies the default gateway; a route to 0.0.0.0 is the default one, i.e. the one used when there is not any more specific route available to a destination address.
    意思是0.0.0.0代表的是匹配所有目标地址,但注意默认网关的描述the one used when there is not any more specific route available to a destination address,一般路由匹配要符合掩码最长匹配原则,而默认路由的掩码是最短的,它只有在没有其他匹配条目的时候才会被选择

 

这里我用k8a集群中master节点的路由表来举例解释

image.png 

#destination:目的地,终点,就是我们要去访问的目的IP

#0.0.0.0代表的是匹配所有目标地址

 

第一行的意思就是去往所有目标地址数据包由网关 10.12.236.1 通过网卡ens33来转发(进)

第二行的意思就是目的地址为10.12.236.0的数据包由ens33直接转发,不经过网关

也就是说,10.12.235.0网段的数据包要过网关,只有没有确切路由时,才会走网关

the one used when there is not any more specific route available to a destination address

 

实际上前两条是自动生成的,因为是直连的网段,在每块网卡上每配置一个IP就会生成一条记录(一个网卡上可以配置多个IP)。表示去往这两个网段的数据包,直接由网卡接口ens33发送出去。

 

Flags那一列中有G时才会使用Gateway

10.244.0.0是本机flannel.1的网卡设备master)

10.244.1.0是node1节点上flannel.1的网卡设备(有网关)

10.244.2.0是node2节点上flannel.1的网卡设备(有网关)

 

第三行:意思就是去往10.244.0.0地址的数据包通过cni0网桥设备来转发

第四行:去往node1节点的flannel.1的数据由网关10.244.1.0通过本机的flannel.1来转发

第五行:去往node2节点的flannel.1的数据由网关10.244.2.0通过本机的flannel.1来转发

第六行:就是说去往172.17.0.0地址中的数据要通过docker0网卡来转发

 

在它显示的信息中,如果标志是 U,则说明是可达路由(活动的);如果是 G,则说明这个网络接口连接的是网关,H则说明目标是一个主机。

 

再来看自己的docker容器:

首先,看一下宿主机

image.png 

从上到下:分别是docker0网桥、eth0网口、回环网口(127.0.0.1)、三个veth网口(这个是什么东东?容器的?)

image.png 

我们进入一个容器,看一看,还是对应不上呢?有点捉鸡?(可以肯定与容器相关) 看下图,是不是豁然开朗了?我们起了三个容器,宿主机上有3个veth,容器内各有一个。原来是,veth-pair技术哦!!!

image.png 

Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网 关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接 通信。

 

Docker容器网络就很好的利用了Linux虚拟网络技术,在本地主机和容器内分别创建一个虚拟接口,并 让他们彼此联通(这样一对接口叫veth pair);

Docker中的网络接口默认都是虚拟的接口。虚拟接口的优势就是转发效率极高(因为Linux是在内核中 进行数据的复制来实现虚拟接口之间的数据转发,无需通过外部的网络设备交换),对于本地系统和容 器系统来说,虚拟接口跟一个正常的以太网卡相比并没有区别,只是他的速度快很多。

image.png

看下,我们在容器内ping docker0网桥和其他的容器ip,都可以通。

image.png

image.png 

看看,docker0的网络172.18.0.0通过网桥转发(结合route -n 和ip route命令看)

第一条:172.17.190.94/20(宿主机ip)到达任意ip(0.0.0.0)要经过网关172.17.191.253通过eth0网口转发;

第二条:172.17.190.94/20(宿主机ip)到达ip(172.17.176.0/20)经过eth0网口直接转发;

190=>10111110、176=>10110000,20位子网255.255.11110000.0,所以,这条路由的意思是在同一个局域网(网段176-191)的可以通过eth0直接通信。

第三条:172.17.190.94/20(宿主机ip)到达172.17.191.253的网关,通过eth0转发,H标记目标为主机;

第四条:172.18.0.1/16(docker0网桥)与172.18.0.0/16(容器ip段)通信,要通过docker0网口。

来说两句吧
最新评论