namespace:
docker0:网桥
自己创建namespace:
同一个命名空间里的网络可以互相访问
查看网络命名空间:
[root@localhost ~]# ip netns list
添加两个网络命名空间:
[root@localhost ~]# ip netns add b1
[root@localhost ~]# ip netns add b2
查看ip addr:
[root@localhost ~]# ip netns exec b2 ip a
可以看到回环网卡里面是down
接下来我们让他起来
[root@localhost ~]# ip netns exec b1 ip link set dev lo up
然后我们看看发现是unkonwn
我们要在两个容器之间创建veth去链接容器,打通网络
[root@localhost ~]# ip link add veth-b1 type veth peer name veth-b2
然后查看一下
[root@localhost ~]# ip link
可以找到两个新创建的veth设备
接下来我们要把veth设备加入到命名空间里
[root@localhost ~]# ip link set veth-b1 netns b1
然后iplink一下发现少了veth-b1,说明成功,
同理放入b2
[root@localhost ~]# ip link set veth-b2 netns b2
然后iplink发现成功
接下来需要设置ip了
查看一下
[root@localhost ~]# ip netns exec b1 ip a
发现状态是down,但是网卡设置好了,然后添加ip
[root@localhost ~]# ip netns exec b1 ip addr add 192.168.10.1/24 dev veth-b1
[root@localhost ~]# ip netns exec b2 ip addr add 192.168.10.2/24 dev veth-b2
然后查看一下
[root@localhost ~]# ip netns exec b1 ip a
发现ip设置好了
接下来需要启动网卡,dev是device
[root@localhost ~]# ip netns exec b1 ip link set dev veth-b1 up
[root@localhost ~]# ip netns exec b2 ip link set dev veth-b2 up
接下来我们ping一下两个命名空间
[root@localhost ~]# ip netns exec b2 ping 192.168.10.1
[root@localhost ~]# ip netns exec b1 ping 192.168.10.2
发现ping成功
总结一下,一台机器里创建两个命名空间,命名空间之间无法通信,需要用网卡通信,
实际上就是和多台物理机需要网线通信是一样的。
以上总结,为docker网络打基础
接下来看docker网络吧
[root@localhost ~]# brctl show
或者
[root@localhost ~]# docker network ls
然后创建demo-bridge,再查看
[root@localhost ~]# docker network create -d bridge demo-bridge
然后查看
两种查看方式
[root@localhost ~]# docker run -itd --name demo1 --network demo-bridge busybox
[root@localhost ~]# docker run -itd --name demo2 --network demo-bridge busybox
然后查看docker下网络,应该有已经创建好的容器
[root@localhost ~]# docker network inspect 29c22bb94f08
然后我们ping一下两个容器
[root@localhost ~]# docker exec -it demo1 bash
然后ping一下172.18.0.3发下能成功,同理反过来可以ping通
我们可以再起一个容器,不设置bridge,用默认的bridge看是否可以ping通(当然不可能,因为不通网络设备)
创建第三个容器,默认bridge
[root@localhost ~]# docker run -itd --name demo3 busybox
自己测试下ping不同的
然后我们需要把默认bridge里的demo3换到demo-bridge里
[root@localhost ~]# docker network connect demo-bridge demo3
然后查看demo-bridge
没有疑问,现在可以在一个bridge里当然可以ping通了,这里面有很多需要思考的点,现在先不抛出来,或许想到了之后就可以理解k8s的一些原理了吧,先搞明白docker里的通信原理为后面做铺垫。
还记得我们之前的命令创建veth是peer,也就是相同的出现可以理解为成对出现。如果需要深究建议学一下iptables