1 综述
前文已经对Docker的基本环境进行构建,该篇文章主要通过实验验证Docker的bridge网络模式在宿主机内的容器间通信和利用Open vSwitch和Docker的none网络模式实现跨宿主机间的容器通信,从而加深对Docker容器间网络通信的理解。
2 环境准备
2.1 操作系统
Shell123456 | 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用户权限下完成):
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.开始安装
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。
Shell12 | wget https://github.com/openvswitch/ovs/raw/master/utilities/ovs-dockerchmod a+x ovs-docker |
安装pipework
Shell12 | 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 实验拓扑
3.1.3 实验方法
假设你已经有Ubuntu14的镜像,如果没有可以通过docker pull ubuntu:latest下载一个。
1.启动容器c1:
1 | docker run -t -i --name c1 192.168.5.31:5000/sdnpool/ubuntu14.04:latest /bin/bash |
2.查看Docker默认的网桥分配的网卡信息
3. 启动容器c2,并关联容器c1,link的别名为c2-c1
Shell1 | sudo docker run -t -i --name c2 --link c1:c2-c1 192.168.5.31:5000/sdnpool/ubuntu14.04:latest /bin/bash |
4.验证在容器c2中 ping容器c1的ip,可以互通
在容器c2中,发现其/etc/hosts文件中写入了与c1的连接信息c2-c1:
5. Ping外网实验
在容器c2中可直接ping 外网,因为docker0作为各个容器的默认网关,通过地址转换所有的数据包都被转发到宿主机的etho网卡出去了。
3.2 跨宿主机容器通信
3.2.1 实验目的
验证利用openvswitch的桥接+gre隧道实现容器间的跨宿主机通信。
3.2.2 实验拓扑
3.2.3 实验方法
在主机host2上192.168.5.73,做如下配置:
Shell123456 | 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
Shell1 | docker run -t -i --name c3 --net=none --privileged=true ubuntu:latest /bin/bash |
默认没有分配ip信息:
分配容器c3的网络ip,建立sdn-br0和容器的映射:
Shell1 | pipework sdn-br0 fb700ea73293 192.168.0.3/24 |
3.启动容器c4
Shell1 | docker run -t -i --name c4 --net=none --privileged=true ubuntu:latest /bin/bash |
1 | pipework sdn-br0 509330e73275 192.168.0.4/24 |
4.在主机host1配置192.168.5.31,通主机host2方法一样
Shell12345678 | 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 |
12 | pipework sdn-br0 441ce7ecf5cf 192.168.0.2/24pipework sdn-br0 d341b3915d29 192.168.0.1/24 |
5.验证结果
容器2:192.168.0.2分别ping容器1,容器3,容器4均可通。
6.使用SDN控制器Floodlight管理上面的Docker容器集群
在主机host1上的sdn-br0设置连接控制器:
1 | ovs-vsctl set-controller sdn-br0 tcp:192.168.5.31:6633 |
在容器做互ping操作,可让floodlight拓扑发现这些容器,最终SDN控制器完全能够发现这些容器,如下图:
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都有其用武之地。
声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。