如何让pod网络和主机互通
一,为容器配置网络
二,容器的网络“牵一根线”出来,到主机的namespace,并且插在这个docker0的Bridge上
实现步骤:
一,brctl show (查看主机有没有docker0)
二,mkdir -p /var/run/netns (创建netns目录出来,当我们需要一个进程关联到网络namespace的时候,需要这样一个地方去保存,说有哪些网络的namespace,这些网络namespace跟容器进程有什么关系)
三,docker run --network=none -d nginx (通过none的方式启动一个容器)
四,docker ps (查看这个docker id):
五,docker inspect 25e3ada9ac3d|grep -i pid (查看下容器pid)
六,export pid=8595 (把pid设置到环境变量里,后面引用方便)
七, nsenter -t 8595 -n ip a (查看容器当前网路配置)
八,ln -s /proc/$pid/ns/net /var/run/netns/$pid (让网络的namespace和这个进程绑定)
九,ip netns list ( list下网络namespace,可以看到进程已经在下面了)
十,ip link add A type veth peer name B (建立一个虚拟链路,可以看成虚拟网线,类型是veth,一边口子是A ,一边口子是B)
十一,brctl addif docker0 A (把A口插在主机docker0这边,相当于网线一段已经插到了bridge上了)
十二,ip link set A up (让A口启动生效)
十三, 配置B口 (设置IP, 设置子网掩码,设置网关)
- SETIP=172.17.0.10
- SETMASK=16
- GATEWAY=172.17.0.1
十四,ip link set B netns $pid (把网线另外一段放到了8595这个namespace下面)
十五,ip netns exec $pid ip link set dev B name eth0 (把B口的名字改为eth0,从这里开始,都是设置容器内的网络了)
十六:ip netns exec $pid ip link set eth0 up (在容器里面把B口启动起来)
十七:ip netns exec $pid ip addr add $SETIP/$SETMASK dev eth0 (为B口配置ip和子网掩码)
十八:ip netns exec $pid ip route add default via $GATEWAY (容器内部设置网关)
十九:curl 172.17.0.10 (主机上访问这个ip,nginx响应,说明容器内和主机网络已经通了):
二十:nsenter -t 8595 -n ip a (查看容器网关,已经配好了)
至此,docker内部网络和主机网络可以通信了,docker run --network=none 或者docker run , 以上就是这条命令实现的步骤