docker网络之Linux网络命名空间(namespace)

我们先看一个我们平时司空见惯的现象:在一个容器中通过ping命令去ping另一个容器的ip,测试两个容器是否互通。
我们先运行两个容器,执行命令如下:

docker run -d  --name test1 busybox /bin/sh -c "while true; do sleep 3600; done"

docker run -d  --name test2 busybox /bin/sh -c "while true; do sleep 3600; done"

生成两个容器test1和test2,分别进入容器test1和test2,查看他们的ip地址

docker exec test1 ip a
docker exec test2 ip a

得到test1和test2的ip分别为172.17.0.2和172.17.0.3
我们在test1容器中执行

docker exec test1 ping 172.17.0.2

很显然这两个容器是可以互相通信的,那么他的底层原理是什么呢?

要说明这个问题,我们可以通过下面这个图简单的理解一下:
image.png
简单来说,容器1中的网络命名空间(namespace1)和容器2中的网络命名空间(namespace2)通过一对叫做veth的东西(可以理解成接口)进行通信。

为了加深理解,我们来做个简单实例。我们先看几个命令,

//查看,添加,删除namespace
sudo ip netns list
sudo ip netns add test1
sudo ip netns delete test1

需求

建立两个命名空间,并实现互相ping通

步骤

//先建立两个namespace,分别为test3和test4
sudo ip netns add test3
sudo ip netns add test4

//建立一对veth,分别命名为veth-test3 和veth-test4
 sudo ip link add veth-test3 type veth peer name veth-test4

此时我们使用ip link命令查看一下当前宿主机中的信息
image.png

可以看到,我们已经成功的创建了一对veth。下面一步是将创建的veth分别添加到命名空间test3和test4

//将创建的veth分别添加到命名空间test3和test4
sudo ip link set veth-test3 netns test3
sudo ip link set veth-test4 netns test4

//分别在test3和tes4中执行ip link,查看是否已经添加了veth
sudo ip netns exec test3 ip link //exec类似于docker容器中的命令,在命名空间test3中执行命令
sudo ip netns exec test4 ip link

结果如下图所示

此时我们我们可以看到我们创建的veth已经成功添加到了两个命名空间中。此时还需要最后两个步骤,一个就是给veth添加ip,另个就是让其状态置为UP

//添加ip
sudo ip netns exec test3 ip addr add 192.168.1.3/24 dev veth-test3
sudo ip netns exec test4 ip addr add 192.168.1.4/24 dev veth-test4

//状态置UP
 sudo ip netns exec test3 ip link set dev veth-test3 up
 sudo ip netns exec test3 ip link set dev veth-test4 up

//查看状态和 ip
 sudo ip netns exec test3 ip a
 sudo ip netns exec test4 ip a

查看结果如下图

此时我们执行下面命令,测试两个命名空间是否已经可以ping通了

 sudo ip netns exec test3 ping 192.168.1.4

结果如下图,成功!!

你可能感兴趣的:(docker网络之Linux网络命名空间(namespace))