美文网首页
docker网络之Linux网络命名空间(namespace)

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

作者: 谜00016 | 来源:发表于2018-10-22 14:02 被阅读131次

    我们先看一个我们平时司空见惯的现象:在一个容器中通过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)

          本文链接:https://www.haomeiwen.com/subject/zkgwzftx.html