linux网络命名空间详解,『中级篇』 Linux网络命名空间(25)

原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!

原文链接地址:『中级篇』 Linux网络命名空间(25)

docker底层技术,非常重要的关于namespace,network的namespace看看到底是怎么回事。

×××

834d6ad1929d55e9c8aece8ef2e389e8.png

通过vagrant 启动2个node

#共享插件需要的vbox需要

vagrant plugin install vagrant-vbguest

vagrant up

f962bf1cbbab6ab11be52af6928431f8.png

bb56a8a9eafc2ce23e1fc1c34942a876.png

创建容器,演示network-namespace

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

vagrant ssh docker-node1

sudo service docker restart

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

15dfb0ea21f7a71227bdd222117a0027.png

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

cd2a04a7d7590d946dbbb55901cbc1a2.png

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

sudo docker exec -it test1 /bin/sh

ip a

#test1的网络ip是172.17.0.2

daa3eed068ee19077ebb81aa756cb972.png

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

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

c6bec9b72cffa6229ac732dde75813be.png

1: lo: 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: 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

422557923e7ea142c6162bc7d5ba40a1.png

发现空间之前是独立的,容器内的网络命名空间和容器外不同,容器和容器之前的网络命名空间也是相对独立的。

exit

ip a

366b4faa9e57784a574ad23b739aa966.png

了解命令

查看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

73ede1157a01cb53458e85d01969ca05.png

sudo ip netns exec test1 ip a

在test1里面执行ip a 这个操作,lo这个回管口没有ip地址,而且现在的状态是DOWN

3a7bb740c76666bcce2e7d57d5774cb4.png

#

sudo ip netns exec test1 ip link set dev lo up

sudo ip netns exec test1 ip a

想让test1的lo,状态变成UP,结果发现UNKNOWN,因为端口是需要成双才可以UP起来的,也就是说需要一对才可以up起来。

86b59d03e1684918de11b11304526f61.png

#####做个实验,按照下面这个图

让test1 和test2 链接起来,类似网络,现在本身test1 和test2 已经有自己的网口了,但是还需要一根网线,领一个口插进去,成对出现完成test1和test2的互通。

49242b065c30ebdb33218209a7883adc.png

Veth将2个口链接起来,创建一对接口,让如namespace里面,配置ip地址

a6623bcdbcccf86d08eae83b68daa439.png

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

创建 veth-test1 和 veth-test2

sudo ip link add veth-test1 type veth peer name veth-test2

sudo ip link

af5e436b9831687a4c54b63d93837e67.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

4008390ae6a6e7e8f75fc3f672bbd647.png

3e68b52ded30b00baa35a52cf26cc2f9.png

b47171b20ff5844902eaa8cb9352c4ff.png

添加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

5c1d67c7c24704d9cc1660d264647354.png

bfd05c657e00bddbdc6a802c8534ae84.png

620159ac7386f28cdfad73c200bb212e.png

是否互通

sudo ip netns exec test1 ping 192.168.1.2

sudo ip netns exec test2 ping 192.168.1.1

f880254943b9fae92b5dbdca485b1156.png

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

往期精彩

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值