『中级篇』 Linux网络命名空间(25)

原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!
原文连接地址:『中级篇』 Linux网络命名空间(25)node

docker底层技术,很是重要的关于namespace,network的namespace看看究竟是怎么回事。linux

源码下载

  • 经过vagrant 启动2个node
#共享插件须要的vbox须要
vagrant plugin install vagrant-vbguest
vagrant up
复制代码


  • 建立容器,演示network-namespace

shell命令的方式,循环一小时执行一次ios

vagrant ssh docker-node1
sudo service docker restart
sudo docker run -d --name test1 busybox /bin/sh -c "while true; do sleep 3600;done"
复制代码

sudo docker run -d --name test2 busybox /bin/sh -c "while true; do sleep 3600;done"
复制代码

启动了2个容器,test1,test2,进入这2个容器查看各自的ip地址git

sudo docker exec -it test1 /bin/sh
ip a
#test1的网络ip是172.17.0.2 
复制代码

其实这块就是一个网络命名空间github

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
复制代码
sudo docker exec -it test2 /bin/sh
ip a
#test1的网络ip是172.17.0.3 
复制代码

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
7: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
复制代码
#在test2上ping下test1的namespace发现一个状况,能够ping通
ping 172.17.0.2
复制代码

  • 发现空间以前是独立的,容器内的网络命名空间和容器外不一样,容器和容器以前的网络命名空间也是相对独立的。
exit
ip a
复制代码

了解命令
  • 查看networknamespace列表
sudo ip netns list
复制代码
  • 删除networknamespace
sudo ip netns delete 名称
复制代码
  • 添加networknamespace
sudo ip netns add 名称
复制代码
建立linux的networknamespace。
sudo ip netns list
sudo ip netns add test3
sudo ip netns list
sudo ip netns delete test3
sudo ip netns list
sudo ip netns add test1
sudo ip netns add test2
sudo ip netns list
复制代码

sudo ip netns exec test1 ip a
复制代码

在test1里面执行ip a 这个操做,lo这个回管口没有ip地址,并且如今的状态是DOWNdocker


#
sudo ip netns exec test1 ip link set dev lo up
sudo ip netns exec test1 ip a
复制代码

想让test1的lo,状态变成UP,结果发现UNKNOWN,由于端口是须要成双才能够UP起来的,也就是说须要一对才能够up起来。shell


作个实验,按照下面这个图

让test1 和test2 连接起来,相似网络,如今自己test1 和test2 已经有本身的网口了,可是还须要一根网线,领一个口插进去,成对出现完成test1和test2的互通。bash


Veth将2个口连接起来,建立一对接口,让如namespace里面,配置ip地址网络


建立veth 说白了就是建立一根网线,有2个头可是在一根线上 veth-test1 和veth-test2

建立 veth-test1 和 veth-test2ssh

sudo ip link add veth-test1 type veth peer name veth-test2
sudo ip link 
复制代码
image.png
image.png

将 veth-test1 添加到test1中,veth-test2 添加到test2中

sudo ip link set veth-test1 netns test1
sudo ip netns exec test1 ip link
sudo ip link set veth-test2 netns test2
sudo ip netns exec test2 ip link
sudo ip link
复制代码



添加ip地址

sudo ip netns exec test1 ip addr add 192.168.1.1/24 dev veth-test1
sudo ip netns exec test2 ip addr add 192.168.1.2/24 dev veth-test2
sudo ip netns exec test1 ip link
sudo ip netns exec test2 ip link
#虽然添加了ip地址可是不显示,这是为何?由于须要把这2个端口都启动起来
sudo ip netns exec test1 ip link set dev veth-test1 up
sudo ip netns exec test2 ip link set dev veth-test2up
sudo ip netns exec test1 ip link
sudo ip netns exec test2 ip link
sudo ip netns exec test1 ip a
sudo ip netns exec test2 ip a
复制代码



image.png

是否互通

sudo ip netns exec test1 ping 192.168.1.2
sudo ip netns exec test2 ping 192.168.1.1
复制代码
image.png

PS:经过linux作的个实验跟经过docker建立的容器的是相似的,只是用linux的方式模拟了docker容器的方式。其实docker容器的原理就是围绕这linux底层的网络命名空间的原理实现的。

相关文章
相关标签/搜索