Contents

从0到1写docker之五容器网络

(五)容器网络

(容器网络理解不深,待我计网大成之日,再重新写这篇容器网络的博客)
linux网络虚拟网络设备
  • veth:成对出现的虚拟网络设备,发送到veth一端的请求会从另一端发出,实现点对点的连接
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
 +------------------+              +------------------+
|        ns1       |              |      ns2         |
|                  |  veth pair   |                  |
|                +-+              +-+                |
| 192.168.1.1/24 | +--------------+ | 192.168.1.2/24 |
|   (veth-ns1)   +-+              +-+   (veth-ns2)   |
|                  |              |                  |
|                  |              |                  |
|                  |              |                  |
+------------------+              +------------------+
  • bridge:用来桥接的网络设备,相当于现实世界的交换机,可以连接不同的网络设备,请求到达bridge设备时,可以通过报文中Mac地址进行广播或群发。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
+------------------+     +------------------+     +------------------+
|                  |     |                  |     |                  |
|                  |     |                  |     |                  |
|                  |     |                  |     |                  |
|       ns1        |     |       ns2        |     |       ns3        |
|                  |     |                  |     |                  |
|                  |     |                  |     |                  |
|                  |     |                  |     |                  |
|  192.168.1.1/24  |     |  192.168.1.2/24  |     |  192.168.1.3/24  |
+----(veth-ns1)----+     +----(veth-ns2)----+     +----(veth-ns3)----+
        +                          +                        +
        |                          |                        |
        |                          |                        |
        +                          +                        +
+--(veth-ns1-br)-------------(veth-ns2-br)------------(veth-ns3-br)--+
|                                                                    |
|                           linux-bridge                             |
|                                                                    |
+--------------------------------------------------------------------+
linux路由表

如果两个namespace处于不同的两个子网中,那么就不能通过bredge进行连接了,需用路由器三层转发,但是linux并未提供虚拟路由器设备,linux本身就具有路由器功能,

linux iptables

iptables用来管理包的流动和转送,用于容器和宿主机外部的网络通信

  • MASQUERADE:将namespace中的源地址转换为宿主机中的地址,就可以访问宿主机外的网络了
  • DNAT:将宿主机上端口的tcp请求转发到namespace中的地址,实现外部的应用调用

另外的两个组件:

  • 网络驱动:网络的管理
  • IPAM:分配ip

具体实现请看我的项目代码…

参考文档

《自己动手写docker》

https://www.zhaohuabing.com/post/2020-03-12-linux-network-virtualization/