一直没敢下手尝试docker的网络使用ovs,总觉得可能很复杂。所以,人往往都是自己把自己拒之门外的。
我整整折腾了一天,容器内以二层方式访问外部的IP始终不通。最后发现原来是网卡混杂模式惹的祸
环境准备
安装docker
在我的其他博文里有国内源安装docker的内容,原样照搬
1 | $ sudo apt-get update && sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common |
安装ovs
1 | $ sudo apt-get install openvswitch-switch |
安装ovs-docker
简单介绍一下,ovs-docker实际上是一个shell脚本,封装了ovs和docker的一些操作。
1 | $ cd /usr/bin |
实验
两个docker容器经过ovs网桥进行访问及访问外部网络
容器互访
- 创建ovs网桥
1 | $ ovs-vsctl add-br br0 |
- 创建两个容器
注:实验使用了busybox的镜像,需要提前pull到本地
1 docker pull busybox
1 | $ docker run -it --net=none --privileged=true --name=h1 busybox |
在另外一个shell中执行
1 | $ docker run -it --net=none --privileged=true --name=h2 busybox |
- 查看当前网络
1 | / # ifconfig |
可以看到当前仅有一个loopback接口
- 连接容器到网桥
1 | $ ovs-docker add-port br0 eth0 h1 |
- 配置IP地址
分别在两个docker容器中配置eth0的IP地址为同一个网段
h1
1 | $ ifconfig eth0 192.168.1.2 |
h2
1 | $ ifconfig eth0 192.168.1.3 |
- 测试连通性
1 | $ ping 192.168.1.3 |
没错,就是这么简单
访问外部网络
当我解决了混杂模式的问题之后,原来一切都是那么简单
在外部另外一个PC上配置了192.168.1.1
- 为br0增加物理接口
1 | $ ovs-vsctl add-port br0 ens192 |
- 测试
从容器中ping 192.168.1.1
1 | $ ping 192.168.1.1 |
大功告成