The quickstart instructions describe how to start the plugin in nat mode. Flat mode is described in the flat
mode section.
1. Make sure you are using Docker 1.9 or later
2. You need to modprobe openvswitch
on the machine where the Docker Daemon is located
$ docker-machine ssh default "sudo modprobe openvswitch"
3. Create the following docker-compose.yml
file
plugin:
image: gophernet/ovs-plugin
volumes:
- /run/docker/plugins:/run/docker/plugins
- /var/run/docker.sock:/var/run/docker.sock
net: host
stdin_open: true
tty: true
privileged: true
command: -d
ovs:
image: socketplane/openvswitch:2.3.2
cap_add:
- NET_ADMIN
net: host
4. docker-compose up -d
5. Now you are ready to create a new network
$ docker network create -d ovs mynet
6. Test it out!
$ docker run -itd --net=mynet --name=web nginx
$ docker run -it --rm --net=mynet busybox wget -qO- http://web
There are two generic modes, flat
and nat
. The default mode is nat
since it does not require any orchestration with the network because the address space is hidden behind iptables masquerading.
192.168.1.0/24
. You would start the plugin like so:$ docker-ovs-plugin --gateway=192.168.1.1 --bridge-subnet=192.168.1.0/24 -mode=flat
You can also add these flags to the command
section of your docker-compose.yml
eth
interface to the bridge to allow access to the underlying network when traffic leaves the Docker host. To do so, you simply add the eth
interface to the ovs bridge. Neither the bridge nor the eth interface need to have an IP address since traffic from the container is strictly L2. Warning if you are remoted into the physical host make sure you are not using an ethernet interface to attach to the bridge that is also your management interface since the eth interface no longer uses the IP address it had. The IP would need to be migrated to ovsbr-docker0 in this case. Allowing underlying network access to an OVS bridge can be done like so:ovs-vsctl add-port ovsbr-docker0 eth2
Add an address to ovsbr-docker0 if you want an L3 interface on the L2 domain for the Docker host if you would like one for troubleshooting etc but it isn't required since flat mode cares only about MAC addresses and VLAN IDs like any other L2 domain would.
$ ovs-vsctl show
e0de2079-66f0-4279-a1c8-46ba0672426e
Manager "ptcp:6640"
is_connected: true
Bridge "ovsbr-docker0"
Port "ovsbr-docker0"
Interface "ovsbr-docker0"
type: internal
Port "ovs-veth0-d33a9"
Interface "ovs-veth0-d33a9"
Port "eth2"
Interface "eth2"
ovs_version: "2.3.1"
Flat Mode Note: Hosts will only be able to ping one another unless you add an ethernet interface to the docker-ovsbr0
bridge with something like ovs-vsctl add-port <bridge_name> <port_name>
. NAT mode will masquerade around that issue. It is an inherent hastle of bridges that is unavoidable. This is a reason bridgeless implementation gopher-net/ipvlan-docker-plugin and gopher-net/macvlan-docker-plugin can be attractive.
--default-network
the plugin is identified via ovs
. More specifically, the socket file that currently defaults to /run/docker/plugins/ovs.sock
.ovsbr-docker0
.--dns=8.8.8.8
for DNS etc.ovs-vsctl show
.ovsdb-client dump
. All of the mentioned OVS utils are part of the standard binary installations with very well documented man pages.Yes!! Please see issues for todos or add todos into issues! Only rule here is no jerks.
Since this plugin uses netlink for L3 IP assignments, a Linux host that can build vishvananda/netlink library is required.
Install Go. OVS as listed above and a kernel >= 3.19.
Install godeps by running go get github.com/tools/godep
.
Clone and start the OVS plugin:
git clone https://github.com/gopher-net/docker-ovs-plugin.git
cd docker-ovs-plugin/plugin
# using godep restore will pull down the appropriate go dependencies
godep restore
go run main.go
# or using explicit configuration flags:
go run main.go -d --gateway=172.18.40.1 --bridge-subnet=172.18.40.0/24 -mode=nat
The rest is the same as the Quickstart Section.
Note: If you are new to Go.
~/go/src/
directory.go/src/github.com/gopher-net/docker-ovs-plugin/
. Go knows where to look for the root of the go code, binaries and pkgs based on the $GOPATH
shell ENV./home/<username>/go/src/github.com/gopher-net/docker-ovs-plugin/
and put export GOPATH=/home/<username>/go
in wherever you store your persistent ENVs in places like ~/.bashrc
, ~/.profile
or ~/.bash_profile
depending on the OS and system configuration.If you want to try out some of your changes with your local docker install
docker-compose -f dev.yml up -d
This will start Open vSwitch and the plugin running inside a container!
Thanks to the guys at Weave for writing their awesome plugin. We borrowed a lot of code from here to make this happen!