采用ovs-docker为容器创建双外部网络

在之前一篇文章《利用iptables给Docker绑定一个外网IP》大致介绍了docker的默认网络配置,尝试了手动为docker绑定一个外部网络IP。
而在实际开发中可能不仅仅只有简单的一个网络,可能分为外部网络以及管理网络等多重网络,本文将介绍如何为docker容器创建双外部网络。
背景
docker默认的网络是桥接在创建好后的网桥docker0上的。docker0默认的典型地址为172.17.42.1,子网掩码为255.255.0.0。之后启动容器会给容器分配一个同一网段(172.17.0.0/16)的地址。然后启动docker容器时会创建一对veth pair。其中一端为容器内部的eth0,另外一端为挂载到docker0网桥并以veth开头命名。
环境
一台ubuntu 14.04 64位的服务器,
有2个网络,分别为外部网络与管理网络,
其中eth0为外部网络,所属网段为10.50.10.0/26,该网口的IP为10.50.10.26,网关为10.50.10.1,由于还使用了ovs,因此是该IP是在br-ex上的;
另外还有eth2为内部网络,所属网段为61.0.0.0/24,该网口IP为61.0.0.26,绑定在网桥br-eth2上.
目的
采用ovs-docker为容器创建双外部网络,其中eth0为外部网络,地址为10.50.10.56/26;还有eth2为管理网络,其地址分配为61.0.0.56/26
过程
1.下载ovs-docker脚本

#wget https://raw.githubusercontent.com/openvswitch/ovs/master/utilities/ovs-docker

2.给予可执行权限,并放入系统目录中,这样可以直接使用该可执行程序

#chmod +x ovs-docker
#mv ovs-docker /usr/bin

3.创建docker容器

#docker run --net=none --privileged=true -it ubuntu:14.04

因为docker默认会将镜像创建在docker0网桥上,这一步参数–net=none作用为不给容器创建初始网络,–privileged=true是为了能够在操作容器时拥有对网络配置的权限,如果不加入该参数,则进入后即使是root也无权限修改网络配置。
然后可以查看创建好后的容器网络仅有lo本地回环:

# ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          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:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

4.用ovs-docker为容器创建网络

# ovs-docker 
ovs-docker: Performs integration of Open vSwitch with Docker.
usage: ovs-docker COMMAND

Commands:
  add-port BRIDGE INTERFACE CONTAINER [--ipaddress="ADDRESS"]
                    [--gateway=GATEWAY] [--macaddress="MACADDRESS"]
                    [--mtu=MTU]

  del-port BRIDGE INTERFACE CONTAINER
                    Deletes INTERFACE inside CONTAINER and removes its
                    connection to Open vSwitch BRIDGE. e.g.:
                    ovs-docker del-port br-int eth1 c474a0e2830e
  del-ports BRIDGE CONTAINER
                    Removes all Open vSwitch interfaces from CONTAINER. e.g.:
                    ovs-docker del-ports br-int c474a0e2830e
  set-vlan BRIDGE INTERFACE CONTAINER VLAN
                    Configures the INTERFACE of CONTAINER attached to BRIDGE
                    to become an access port of VLAN. e.g.:
                    ovs-docker set-vlan br-int eth1 c474a0e2830e 5

根据该命令,首先我通过#docker ps查看容器的ID号:

# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
7670c6c0bdd2        ubuntu:14.04        "/bin/bash"         11 minutes ago      Up 11 minutes                           backstabbing_galileo 

然后为容器创建外部网络eth0,绑定到br-ex这个网桥上:

# ovs-docker add-port br-ex eth0 7670c6c0bdd2

然后为容器创建外部网络eth2,绑定到br-eth2这个网桥上:

# ovs-docker add-port br-eth2 eth2 7670c6c0bdd2

然后可以通过#ovs-vsctl show查看是否创建成功:

5.进入配置容器网络

首先进入容器通过#ifconfig查看网络,发现出现了eth0与eth2这两个网络。

然后对其按照之前对要求进行配置即可:
配置eth0:

# ifconfig eth0 10.50.10.56/26

配置网关:

# route add default gw 10.50.10.1

配置eth2:

# ifconfig eth2 61.0.0.56/24

至此所有网络已经配置完成。
拓扑图
下图便为搭建好后对双网络容器的拓扑图,由于ovs-docker创建的port名称比较长,这里以vnet0和vnet2代替:
采用ovs-docker为容器创建双外部网络_第1张图片
验证

从与这两个网络相关联对机器进行ICMP测试

# ping -c 4 10.50.10.56
PING 10.50.10.56 (10.50.10.56) 56(84) bytes of data.
64 bytes from 10.50.10.56: icmp_seq=1 ttl=63 time=1.35 ms
64 bytes from 10.50.10.56: icmp_seq=2 ttl=63 time=1.20 ms
64 bytes from 10.50.10.56: icmp_seq=3 ttl=63 time=0.256 ms
64 bytes from 10.50.10.56: icmp_seq=4 ttl=63 time=0.245 ms

--- 10.50.10.56 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 0.245/0.763/1.351/0.516 ms
# ping -c 4 61.0.0.56
PING 61.0.0.56 (61.0.0.56) 56(84) bytes of data.
64 bytes from 61.0.0.56: icmp_seq=1 ttl=64 time=0.653 ms
64 bytes from 61.0.0.56: icmp_seq=2 ttl=64 time=0.197 ms
64 bytes from 61.0.0.56: icmp_seq=3 ttl=64 time=0.199 ms
64 bytes from 61.0.0.56: icmp_seq=4 ttl=64 time=0.227 ms

--- 61.0.0.56 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.197/0.319/0.653/0.193 ms

参考
1,《Docker——从入门到实践》:高级网络配置
http://dockerpool.com/static/books/docker_practice/advanced_network/README.html

2,《Docker 使用 OpenvSwitch 网桥》
http://blog.csdn.net/yeasy/article/details/42555431

你可能感兴趣的:(Docker)