pipework的安装

Pipework是一个Docker配置工具,是一个开源项目,由200多行shell实现。

Pipework是一个集成工具,需要配合使用的两个工具是OpenvSwitchBridge-utils

执行下面的命令安装pipeworkd

git clone https://github.com/jpetazzo/pipework.git
sudo cp pipework/pipework /usr/local/bin/

pipework结合Docker的三个简单场景

pipework+linux bridge:配置Docker单主机容器

实验环境:

  • 主机A:192.168.187.143
  • 主机A上通过ovs创建一个网桥br0
  • 主机A上创建两个容器con1、con2
  • 使用pipework建立网桥br0,为容器con1和con2添加新的网卡,并将它们连接到br0上
//通过ovs创建网桥
ovs-vsctl add-br br0
//创建容器con1 con2
docker run -itd --name con1 --net=none ubuntu:14.04 bash
docker run -itd --name con2 --net=none ubuntu:14.04 bash

//使用pipework为con1、con2添加新网卡,并桥接到br0上
pipework br0 con1 10.0.0.2/24
pipework br0 con2 10.0.0.3/24

测试结果:
在容器con1con2内部可以看到有一个网卡地址分别如上,con1、con2可以互相ping通

pipework+OVS:单主机Docker容器VLAN划分

pipework不仅可以使用Linux bridge连接Docker容器,还可以与OpenVswitch结合,实现Docker容器的VLAN划分。
实验环境:

  • 主机A的IP地址为:192.168.187.147
  • 主机A上通过ovs创建一个网桥ovs0
  • 在主机A上创建4个Docker容器,test1、test2、test3、test4
  • 将test1,test2划分到一个vlan中
  • 将test3,test4划分到另一个vlan中
//主机A上启动con1~4 4个容器
docker run -itd --name test1 --net=none busybox sh
docker run -itd --name test2 --net=none busybox sh
docker run -itd --name test3 --net=none busybox sh
docker run -itd --name test4 --net=none busybox sh
//主机A上启动网桥ovs0
ovs-vsctl add-br ovs0
#将test1,test2划分到一个vlan中,vlan在mac地址后加@指定,此处mac地址省略
pipework ovs0 test1 192.168.0.1/24 @100
pipework ovs0 test2 192.168.0.2/24 @100

#将test3,test4划分到另一个vlan中
pipework ovs0 test3 192.168.0.3/24 @200
pipework ovs0 test4 192.168.0.4/24 @200

测试结果:

#此时进入容器test1
ping 10.0.0.2    #可以通信
ping 10.0.0.3    #不可以通信

这个功能其实是由于OpenVSwitch本身支持VLAN功能,在将veth pair的一端加入ovs0网桥时,指定了tag。底层的操作是ovs-vsctl add-port ovs0 veth* tag=100

pipework+OVS:多主机Docker容器VLAN划分

实验环境:

  • 主机A:192.168.187.147
  • 主机B:192.168.187.148
  • 主机A上启动con1,con2两个容器
  • 主机A上启动网桥ovs
  • 主机A上划分vlan
  • 主机B上启动con3,con4两个容器
  • 主机B上启动网桥ovs
  • 主机B上划分vlan
//主机A上启动con1,con2
docker run -itd --net=none --name con1 busybox sh
docker run -itd --net=none --name con2 busybox sh

//主机A上启动网桥ovs
ovs-vsctl add-br ovs

#划分vlan
pipework ovs con1 10.0.0.1/24 @100
pipework ovs con2 10.0.0.2/24 @200

#同理在主机B上进行操作
docker run -itd --net=none --name con3 busybox sh
docker run -itd --net=none --name con4 busybox sh

ovs-vsctl add-br ovs
#划分vlan
pipework ovs con3 10.0.0.3/24 @100
pipework ovs con4 10.0.0.4/24 @200

#将eth0连接到ovs上
ovs-vsctl add-port ovs eth0

遇到问题:

  1. 进入容器con3,我们期望的结果是可以ping通con1,但是不能ping通con2.但是实验发现都不能ping通。感觉跨主机划分vlan还是存在问题。这边需要配合流表来完成相关操作。后续再补充
    注:看到将eth0连接到ovs上另一种实现方式如下,但是试过了还是不能ping通
    #主机A的IP地址为:192.168.187.147
    ip addr add 192.168.187.147/24 dev ovs0
    ip addr del 192.168.187.147/24 dev eth0
    ovs-vsctl add-port ovs0 eth0
    route del default
    route add default gw 192.168.187.254 dev ovs0
  2. 如果不划分vlan的话,是可以跨主机通信的。