# OVS+Docker网络构建

## 环境

* CentOS 7
* Docker
* OpenvSwitch

### CentOS 7下安装OVS

不像`deb`下，OVS在CentOS上需要手动编译、创建rpm安装包。

**1. 安装一些中间需要的包**

```bash
sudo yum install -y wget openssl-devel gcc make python-devel openssl-devel kernel-devel graphviz kernel-debug-devel autoconf automake rpm-build redhat-rpm-config libtool python-twisted-core python-zope-interface PyQt4 desktop-file-utils libcap-ng-devel groff checkpolicy selinux-policy-devel 
# 上面的是参考教程中给出的，但是编译时还是缺少下面的这些依赖，可能是因为选择的OVS版本不同
sudo yum install -y gcc-c++ python-sphinx unbound unbound-devel
```

**2. 下载OVS源码，准备进行编译。**

各个版本的下载链接可以在官网找到。

```bash
mkdir -p ~/rpmbuild/SOURCES
cd ~/rpmbuild/SOURCES
wget https://www.openvswitch.org/releases/openvswitch-2.11.1.tar.gz
tar xfz openvswitch-2.11.1.tar.gz
```

**3. 构建RPM包**

```bash
rpmbuild -bb --nocheck openvswitch-2.11.1/rhel/openvswitch-fedora.spec
```

**4. 使用yum安装本地包**

```bash
sudo yum localinstall -y ~/rpmbuild/RPMS/x86_64/openvswitch-2.11.1-1.el7.x86_64.rpm
```

**5. 启动OVS的服务**

```bash
sudo systemctl start openvswitch.service
sudo systemctl is-active openvswitch
ovs-vsctl -V
```

## 将Docker容器连接到OVS

OpenvSwitch的网桥还不能直接支持Docker容器的挂载，需要手动在网桥上创建虚拟网口，并挂载到容器。

### 1. 创建none网络的Docker容器

Docker自带三种网络类型：`bridge`、`host`和`none`。启动的时候会默认分配`bridge`，提供网络端口。

同时新版本的Docker不允许容器内更改网络配置，除非加上`privileged = true`参数。

```bash
sudo docker run --net=none --privileged=true -it ubuntu:14.04 bash
```

> 不要使用后续的ubuntu版本，其中不再自带`net-tools`。

### 2. 手动添加网络

OVS为Docker提供了支持，通过`ovs-docker`工具进行网络的配置。

获取`ovs-docker`

:[Docker 使用 OpenvSwitch 网桥 - CSDN](https://blog.csdn.net/yeasy/article/details/42555431) :[Installation Openvswitch LTS in CentOS 7 - GitHub Gist](https://gist.github.com/umardx/a31bf6a13600a55c0d07d4ca33133834) :[Docker容器受控于SDN网络 - 博客园](https://www.cnblogs.com/chenjin2018/p/10034798.html)
