美文网首页
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
结果如下图,成功!!

相关文章

  • K8S 网络详解 1 DOCKER 网络基础

    DOCKER 网络基础 网络命名空间(linux net namespace) linux 内核支持(net na...

  • docker网络之bridge详解

    上一篇文章docker网络之Linux网络命名空间(namespace)中我们了解了一些关于网络命名空间的知识,以...

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

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

  • 四十、Docker网络-网络命名空间

    网络命名空间 Linux的Namespace(命名空间)技术是一种隔离技术,常用的Namespace有 user ...

  • Docker网络实现

    众所周知,docker网络是它薄弱的地方! Docker的网络实现: 利用linux的网络命名空间和虚拟网络设备(...

  • netns指令

    引用:理解Docker容器网络之Linux Network Namespace9.5. ETHERNET BRID...

  • Docker学习笔记(五)

    Docker网络 一、网络类型 linux利用net namespace来隔离网络。Docker容器默认情况下会分...

  • 十三、docker网络的命名空间

    查看当前电脑的全名空间 查看docker容器中的网络命名空间 查看本机有的网络命名空间 删除网络命名空间 添加网络...

  • iptables和netfilter

    前段时间学习了docker容器网络中bridge模式,linux下端口转发(iptables)和网络命名空间ip ...

  • Docker的网络

    利用linux的网络命名空间能够让docker之间进行网络访问,具体可以参考一下这篇文章:https://blog...

网友评论

      本文标题:docker网络之Linux网络命名空间(namespace)

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