/ 中存储网

漫谈Docker容器技术(三):容器网络通信实验

2015-02-09 00:00:00 来源:中存储网

1 综述

前文已经对Docker的基本环境进行构建,该篇文章主要通过实验验证Docker的bridge网络模式在宿主机内的容器间通信和利用Open vSwitch和Docker的none网络模式实现跨宿主机间的容器通信,从而加深对Docker容器间网络通信的理解。

2 环境准备

2.1 操作系统

Shell
123456 root@ubuntu:~# lsb_release -aNo LSB modules are available.Distributor ID: UbuntuDescription: Ubuntu 14.04.1 LTSRelease: 14.04Codename: trusty

注:建议在Ubuntu14.04.1做下面的实验,在Ubuntu12.04.5下安装使用Docker时比较麻烦。

2.2 主要组件

用于完成下面实验的相关组件。

2.2.1 Docker1.4

使用最新版本Docker1.4
安装方法(以下安装使用均在root用户权限下完成):

Shell
12345678 apt-get update apt-get install docker.io source /etc/bash_completion.d/docker.io apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 sh -c "echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list" apt-get update apt-get install lxc-docker

2.2.2 Open vswitch2.3.0

使用最新版本的openvswitch2.3.0
安装方法:
1.自行获取官网的openvswitch2.3.10.tar.gz包
2.开始安装

Shell
12345678910111213141516 ./configure --with-linux=/lib/modules/`uname -r`/build 2>/dev/null  Make  Make install  make modules_install  /sbin/modprobe openvswitch  mkdir -p /usr/local/etc/openvswitch  ovsdb-tool create /usr/local/etc/openvswitch/conf.db  vswitchd/vswitch.ovsschema  ovsdb-server  --remote=punix:/usr/local/var/run/openvswitch/db.sock                  --remote=db:Open_vSwitch,Open_vSwitch,manager_options                  --private-key=db:Open_vSwitch,SSL,private_key                  --certificate=db:Open_vSwitch,SSL,certificate                  --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert                  --pidfile --detachovs-vsctl --no-wait initovs-vswitchd --pidfile --detach

2.3 ovs-docker

Docker公司开发的一款开源的工具脚本,用于简化操作ovs和Docker之间关联使用。类似工具还有pipwork。

Shell
12 wget https://github.com/openvswitch/ovs/raw/master/utilities/ovs-dockerchmod a+x ovs-docker

安装pipework

Shell
12 git clone https://github.com/jpetazzo/pipeworkcp ~/pipework/pipework /usr/local/bin/

3 实验

3.1 宿主机内容器通信

Docker在启动容器时,如果不指定网络模式选项时,会创建名docker0的虚拟网桥,通过该网桥实现与宿主机之间的通信。

3.1.1 实验目的

验证在一个宿主机内部,容器1与容器2之间如何通信。

3.1.2 实验拓扑

20150209环境搭建

3.1.3 实验方法

假设你已经有Ubuntu14的镜像,如果没有可以通过docker pull ubuntu:latest下载一个。
1.启动容器c1:

Shell
1 docker run -t -i --name c1 192.168.5.31:5000/sdnpool/ubuntu14.04:latest /bin/bash

2.查看Docker默认的网桥分配的网卡信息

20150209网卡信息查看

3. 启动容器c2,并关联容器c1,link的别名为c2-c1

Shell
1 sudo docker run -t -i --name c2 --link c1:c2-c1 192.168.5.31:5000/sdnpool/ubuntu14.04:latest /bin/bash
20150209未跨主机ifconfig

4.验证在容器c2中 ping容器c1的ip,可以互通

20150209 c2 ping c1通

在容器c2中,发现其/etc/hosts文件中写入了与c1的连接信息c2-c1:

20150209文件中写入了与c1的连接信息c2c1

5. Ping外网实验
在容器c2中可直接ping 外网,因为docker0作为各个容器的默认网关,通过地址转换所有的数据包都被转发到宿主机的etho网卡出去了。

20150209ping百度

3.2 跨宿主机容器通信

3.2.1 实验目的

验证利用openvswitch的桥接+gre隧道实现容器间的跨宿主机通信。

3.2.2 实验拓扑

20150209跨主机环境搭建

3.2.3 实验方法

在主机host2上192.168.5.73,做如下配置:

Shell
123456 ovs-vsctl add-br tech-brovs-vsctl add-port tech-br tep0 -- set interface tep0 type=internalifconfig tep0 192.168.1.1 netmask 255.255.255.0ovs-vsctl add-br sdn-br0ovs-vsctl set bridge sdn-br0 stp_enable=trueovs-vsctl add-port sdn-br0 gre0 -- set interface gre0 type=gre options:remote_ip=192.168.5.31

2.启动容器c3

Shell
1 docker run -t -i --name c3 --net=none --privileged=true ubuntu:latest /bin/bash

默认没有分配ip信息:

20150209跨主机默认没有分IP信息

分配容器c3的网络ip,建立sdn-br0和容器的映射:

Shell
1 pipework sdn-br0 fb700ea73293 192.168.0.3/24
20150209分配容器c3的网络ip建立sdn-br0和容器的映射

3.启动容器c4

Shell
1 docker run -t -i --name c4 --net=none --privileged=true ubuntu:latest /bin/bash
20150209跨主机ps a查看所有 Shell
1 pipework sdn-br0 509330e73275 192.168.0.4/24
20150209跨主机ovs-vsctl show

4.在主机host1配置192.168.5.31,通主机host2方法一样

Shell
12345678 ovs-vsctl add-br tech-brovs-vsctl add-port tech-br tep0 -- set interface tep0 type=internalifconfig tep0 192.168.1.2 netmask 255.255.255.0ovs-vsctl add-br sdn-br0ovs-vsctl set bridge sdn-br0 stp_enable=trueovs-vsctl add-port sdn-br0 gre0 -- set interface gre0 type=gre options:remote_ip=192.168.5.73docker run -t -i --name c1 --net=none --privileged=true 192.168.5.31:5000/sdnpool/ubuntu14.04:latest /bin/bashdocker run -t -i --name c2 --net=none --privileged=true 192.168.5.31:5000/sdnpool/ubuntu14.04:latest /bin/bash
20150209跨主机docker ps Shell
12 pipework sdn-br0 441ce7ecf5cf 192.168.0.2/24pipework sdn-br0 d341b3915d29 192.168.0.1/24
20150209sudoovs-vsctl show查看

5.验证结果
容器2:192.168.0.2分别ping容器1,容器3,容器4均可通。

20150209跨主机ping均可通

6.使用SDN控制器Floodlight管理上面的Docker容器集群
在主机host1上的sdn-br0设置连接控制器:

Shell
1 ovs-vsctl set-controller sdn-br0 tcp:192.168.5.31:6633

在容器做互ping操作,可让floodlight拓扑发现这些容器,最终SDN控制器完全能够发现这些容器,如下图:

20150209跨主机floodlight界面设备列表 20150209floodlight拓扑

4 总结

在实验1中,通过指定docker --link选项实现两个容器间的通信,其本质是利用linux的iptable为两个容器添加一条ACCEPT规则。在实验2中,需要特别说明的是主机host2即192.168.5.73是VMWare虚拟出来的的一个主机,由此可证明,Docker完全可以提供跨云、跨主机的通信。并且笔者也通过Open vSwitch的VXLAN打通跨主机的容器通信。

最后也验证了通过SDN控制器来管控Docker容器集群,这一点给大家的想象空间更大,在Docker的性能完胜KVM的情况下,通过容器将来可以做出更炫的APP,从另一个方面也证明了无论是IASS还是PASS,SDN都有其用武之地。