Docker容器网络原理

容器的网络被Namespace隔离,所以只能看见自己所在 namespace 的网络栈

交换机工作在OSI网络模型的 物理层、数据链路层。当交换机收到数据时,它会检查它的目的MAC地址,然后把数据从目的主机所在的接口转发出去。交换机之所以能实现这一功能,是因为交换机内部有一个MAC地址表,MAC地址表记录了网络中所有MAC地址与该交换机各端口的对应信息

Linux系统中,起到交换机作用的网络设备是 网桥,主要功能也是根据 Mac 地址学习将数据包 转发到网桥的不同端口上。

在Docker中,docker会默认在宿主机上创建一个名为 docker0 的网桥。各个容器通过 veth pair 连接到这个网桥

veth pair 被创建出来以后,总是以 两张虚拟网卡 veth peer 的形式成对出现,然后从一张网卡发出的数据包可以直接出现在对应的另一端网卡上,哪怕这两张网卡在不同的 namespace下,这也就是使得veth pair常用作连接两个不同的namespace的网络栈

# 创建一对veth
ip link add veth0 type veth peer name veth1
# 将veth移动到netns中
ip link set veth0 netns ns0
ip link set veth1 netns ns1
# 启动
ip netns exec ns0 ip link set veth0 up
ip netns exec ns1 ip link set veth1 up

我们在宿主机上启动一个容器之后,容器内的 eth0网卡,就是 vethpair 在容器中的一端,另一端在宿主机的 docker0

注意下图中
宿主机 5号docker0
容器内 连接的目标正是这个 5

当然连通vethpair之后,还需要对应的 route 才能把数据包导向正确的设备

Send a Message