在之前一篇文章《利用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代替:
验证
从与这两个网络相关联对机器进行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