原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!
原文连接地址:『中级篇』 Linux网络命名空间(25)node
docker底层技术,很是重要的关于namespace,network的namespace看看究竟是怎么回事。linux
#共享插件须要的vbox须要
vagrant plugin install vagrant-vbguest
vagrant up
复制代码
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
复制代码
sudo ip netns list
复制代码
sudo ip netns delete 名称
复制代码
sudo ip netns add 名称
复制代码
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-test1 和 veth-test2ssh
sudo ip link add veth-test1 type veth peer name veth-test2
sudo ip link
复制代码
将 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
复制代码
是否互通
sudo ip netns exec test1 ping 192.168.1.2
sudo ip netns exec test2 ping 192.168.1.1
复制代码
PS:经过linux作的个实验跟经过docker建立的容器的是相似的,只是用linux的方式模拟了docker容器的方式。其实docker容器的原理就是围绕这linux底层的网络命名空间的原理实现的。