我们先看一个我们平时司空见惯的现象:在一个容器中通过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
很显然这两个容器是可以互相通信的,那么他的底层原理是什么呢?
为了加深理解,我们来做个简单实例。我们先看几个命令,
//查看,添加,删除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
结果如下图,成功!!
网友评论