Docker网络原理解析

在讲Docker网络之前,我们先了解一下Linux中的一些网络概念和设备,然后在看Docker是如何使用这些设备实现容器网络的。

网络命名空间

在 Linux 中,网络名字空间可以被认为是隔离的拥有单独网络栈(网卡、路由转发表、iptables)的环境。网络名字空间经常用来隔离网络设备和服务,只有拥有同样网络名字空间的设备,才能看到彼此。如下图所示
在这里插入图片描述

网络命名空间常用命令
添加命名空间

$ ip netns add net0

显示所有命名空间

ip netns list
或者
ls /var/run/netns/

进入虚拟网络环境

$ ip netns exec net0 `command`
例如:
$ ip netns exec net0 bash
$ ip ad
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

Veth设备对

引入Veth设备对是为了在不同的网络命名空间之间进行通信,利用它可以直接将两个网络命名空间连接起来。我们可以将Veth设备对看成是一对以太网卡,并且这两张网卡之间有一根网线相连。如图:
在这里插入图片描述

Veth设备对的操作命令
创建Veth设备对

ip link add veth0 type veth peer name veth1

创建好以后可以运行命令:ip link show查看
在这里插入图片描述

移动一个Veth到另一个命名空间:
ip link set veth1 netns myns
在这里插入图片描述
当前命名空间已经看不到veth1了
然后在myns命名空间中查看
在这里插入图片描述
veth1已经成功移动过来了
但是现在还不能通信,因为它们还没有地址

给Veth设备对分配IP地址
ip netns exec myns ip addr add 10.1.1.1/24 dev veth1
ip addr add 10.1.1.2/24 dev veth0
再启动它们
ip netns exec myns ip link set dev veth1 up
ip link set dev veth0 up
现在两个网络命名空间就可以ping通了
在这里插入图片描述

Veth设备对如何查看对端
首先在一个命名空间中查询Veth设备对端接口在设备列表中的序列号
ip netns exec myns ethtool -S veth1
在这里插入图片描述
我们得到veth1对端接口设备的序列号是7,在到另一命名空间中查看序号7代表什么设备
ip link | grep 7
在这里插入图片描述
这样我们就找到了veth1的对端是veth0了

Linux 网桥

网桥的概念就不多说了,一个二层的网络设备,根据MAC地址转发报文,我们说一下Linux中的网桥的不同之处。

  • Linux网桥不但能够转发数据包,还能自己消耗数据包(如果数据包是发往主机本身的),所以既可以看成二层设备,也可以看成一个三层设备
  • Linux网桥可以有一个自己的IP地址

网桥的常用操作命令
新增网桥
brctl addbr br_name
将物理网卡与网桥相连
brctl addif br_name ethx
注意:网桥的物理网卡作为一个端口,由于工作在链路层,所以不再需要IP地址,上面的IP地址自然也就失效了。

给网桥配置IP地址
ifconfig br_name 10.100.0.1 up

brctl --help
在这里插入图片描述
delbr bridge的名称 #删除bridge;
addif bridge的名称device的名称#添加接口到bridge;
delif bridge的名称device的名称#从bridge中删除接口
setageing bridge的名称时间 #设置老化时间,即生存周期
setbridgeprio bridge的名称 优先级#设置bridge的优先级
setfd bridge的名称时间 #设置bridge转发延迟时间
sethello bridge的名称时间 #设置hello时间
setmaxage bridge的名称时间 #设置消息的最大生命周期
setpathcost bridge的名称 端口 权重#设置路径的权值
setportprio bridge的名称 端口 优先级#设置端口的优先级
show #显示bridge列表
showmacs bridge的名称 #显示MAC地址
showstp bridge的名称 #显示bridge的stp信息
stp bridge的名称{on|off} #开/关stp

Docker容器网络解析

docker服务启动时会生成一个网桥docker0,连接生成的每一个容器,并为其分配IP地址
容器网络配置过程
第一步:,docker每启动一个容器,都会生成一个命名空间,但是这个命名空间通过ip netns list是看不到的,因为ip netns只能看到/var/run/netns下面的网络命名空间,但是docker创建网络命名空间后不会自动在该文件下创建网络命名空间文件。如果想通过ip netns list看到的话,需要执行下面的命令:

pid=`docker inspect -f '{{.State.Pid}}' $container_id`
ln -s /proc/$pid/ns/net /var/run/netns/$container_id

在这里插入图片描述

第二步:创建Veth设备对,docker会为每一个容器创建一对Veth,并将一端连接到docker0,然后将从docker0分配到的IP分配给剩下的一个Veth设备,并将其改名为eth0(以前一直以为是一个本地网卡,原来只是Veth设备对中的一个,简直以假乱真),再为本地容器生成一个MAC地址。
在这里插入图片描述
通过上面两步,docker容器就可以通过docker0网桥和其他容器通信了。

猜你喜欢

转载自blog.csdn.net/qq_25744595/article/details/84987672
今日推荐