0%

Docker + ovs,原来如此简单

一直没敢下手尝试docker的网络使用ovs,总觉得可能很复杂。所以,人往往都是自己把自己拒之门外的。

我整整折腾了一天,容器内以二层方式访问外部的IP始终不通。最后发现原来是网卡混杂模式惹的祸

环境准备

安装docker

在我的其他博文里有国内源安装docker的内容,原样照搬

1
2
3
4
5
$ sudo apt-get update && sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
$ add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
$ apt update
$ apt-get -y install docker-ce

安装ovs

1
$ sudo apt-get install openvswitch-switch

安装ovs-docker

简单介绍一下,ovs-docker实际上是一个shell脚本,封装了ovs和docker的一些操作。

1
2
3
$ cd /usr/bin
$ wget https://raw.githubusercontent.com/openvswitch/ovs/master/utilities/ovs-docker
$ chmod a+rwx ovs-docker

实验

两个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
2
3
4
5
6
7
8
/ # ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

可以看到当前仅有一个loopback接口

  • 连接容器到网桥
1
2
$ ovs-docker add-port br0 eth0 h1
$ ovs-docker add-port br0 eth0 h2
  • 配置IP地址

分别在两个docker容器中配置eth0的IP地址为同一个网段

h1

1
$ ifconfig eth0 192.168.1.2

h2

1
$ ifconfig eth0 192.168.1.3
  • 测试连通性
1
2
3
4
$ ping 192.168.1.3
PING 192.168.1.2 (192.168.1.3): 56 data bytes
64 bytes from 192.168.1.3: seq=0 ttl=64 time=1.065 ms
64 bytes from 192.168.1.3: seq=1 ttl=64 time=0.139 ms

没错,就是这么简单

访问外部网络

当我解决了混杂模式的问题之后,原来一切都是那么简单

在外部另外一个PC上配置了192.168.1.1

  • 为br0增加物理接口
1
$ ovs-vsctl add-port br0 ens192
  • 测试

从容器中ping 192.168.1.1

1
2
3
4
$ ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1): 56 data bytes
64 bytes from 192.168.1.1: seq=30 ttl=64 time=1.319 ms
64 bytes from 192.168.1.1: seq=31 ttl=64 time=0.461 ms

大功告成