一、写在前面
最近在看docker,觉得docker重点就是在做隔离,隔离网络,隔离文件系统,隔离进程,这就是docker集装箱的比喻的来源吧。
对docker网络比较感兴趣,所以想着自己用linux 的虚拟网络设备模拟一下docker的网络隔离,参考了网上许多优秀的文章,具体实现的时候碰到了不少问题,比如iptables防火墙的问题、DNS的问题,最后都解决了,现把整个过程记录如下(可以先看原理,文末有脚本可以直接复制)。
二、逐句讲解
首先环境的话,我是在win10上面装了个vmware虚拟机,然后里面装的是ubuntu的系统,在ubuntu里面做这个docker网络模拟实验
sudo ip netns add ns1
首先,先创建一个 network space ,它的名字叫做ns1, 这个相当于docker里面的容器 container
创建完之后,可以用命令 sudo ip netns list 来查看 (Note: 删除的命令是 sudo ip netns del ns1)
sudo ip netns list
之后我们再创建一个veth, veth就是一种虚拟网络设备,成对出现,在一端写会在另一端出
sudo ip link add veth0 type veth peer name veth1
这里的veth0 和veth1 是表示veth两端设备的名字,可以改, veth是一种类型
这句代码的意思是创建一对veth, 一端叫veth0 ,一端叫veth1
然后我们把veth1端放进ns1 空间
sudo ip link set veth1 netns ns1
接着我们创建网桥br0 ,这个就相当于docker里面的docker0网桥 (Note:没有安装brctl的可以先安装)
sudo brctl addbr br0
将刚才的veth0一端接入网桥
sudo brctl addif br0 veth0
这个时候,我们配置一下veth1 和 br0 的 ip 地址并启动,启动veth0
sudo ip netns exec ns1 ifconfig veth1 172.8.0.8 up
sudo ifconfig br0 172.8.0.1 up
sudo ifconfig vet