docker-net namespace的bridge模式学习
1.理论
参考 https://zhuanlan.zhihu.com/p/47571649、https://zhuanlan.zhihu.com/p/47571649

Docker 使用的网络模型是 CNM(Container Network Model),根据官方的设计文档,它的结构大致如下:

CNM 模型一共需要三个组件:
- NetworkSandbox: 在 docker 中的实现对应 Linux Network Namespace
- Endpoint: 在 docker 中的实现对应 VETH (一种虚拟网卡设备)
- Network: 在 docker 中的实现对应 Linux Bridge
什么是 VETH ? 什么是 Linux Bridge ?什么是 Linux Network Namespace
Linux Bridge 是 Linux 提供的一种虚拟网络设备,它可以实现多个不同容器在一个以太网内进行通信。
Bridge 默认情况下工作在二层网络,可以在同一网络根据一定的规则过滤和转发以太网包。若给一个 Linux Bridge 设备分配一个 IP 地址,就会开启它的三层工作模式。
若你在一台安装了 docker 的 Linux 主机上执行 ip addr命令,就可以看到一个名为 docker0的Linux Bridge。默认情况下在这台宿主机上启动的容器都会链接到这个 Bridge 上。因为是在同一个网络下,且通过 Bridge 链接在一起,所以不同的容器之间可以进行网络通信。否则,不同的容器之间会因为链接的 Bridge 不同而产生网络隔离。
VETH 也是 Linux 提供的一种网络设备,它在行为上类似操作系统的 Pipe。因为 VETH 总是成对出现,一端为输入端,一端为输出端。每一个 VETH 设备都可以被赋予一个 IP 地址,然后参与三层网络通信的过程。
Linux Network Namespace 是 Linux 提供的在不同进程之间的一种网络环境隔离机制。这里可以简单的理解为,每一个进程在自己的 NS 下,都独享了一套完整的网络环境(与宿主机对比)。特定 NS 内的网络环境对外部来说是不可见的,并且在其中对一些网络设置做修改也不会影响到外部(如路由规则)。
若只考虑两个容器在宿主机上面的网络模型,它的结构如下图所示:

2.验证
运行的容器如下

host宿主机上面的网桥情况

host宿主机上的veth情况:

查询host上面的arp表、route、bridge情况:

最终转化成如下如图:

浙公网安备 33010602011771号