Docker1.9原生网络功能快速体验

前言

虽然docker发展得很快,能实现容器互联的方式已经有很多,本文则介绍原生实现:Docker1.9版本的docker network功能。

各种非原生Docker网络方案的优劣

1.Weave

由Zett.io开发的一个基于overlay的工具,可以创建出虚拟网络,用于连接部署在多台主机上的容器。在保证外部设备能访问Weave网络上的应用程序所提供的服务的同时也能令已有的内部系统暴露在应用程序容器上。

优点:支持通讯加密;能穿透防火墙等

缺点:部署之后需要额外的维护

2.Pipework

由一位Docker工程师实现的一个很简单但功能强大的shell脚本,使用了cgroups和namespace。

优点:灵活,可以采用各种方式实现容器的互联(笔者之前就是利用OVS和Pipework实现了一个简单的跨主机互联方案,当时的Docker版本为1.4.1)

缺点:实现容器互联后还需要借助其他程序才能实现自动化管理,增加额外的维护成本。

3.Kubernetes

Google推出的针对容器管理和编排的开源项目,让用户能在跨主机集群的情况下轻松地管理、监测容器化应用部署,其某些概念与SDN非常相似。

优点:完整方案,集成得比较完善的功能

缺点:它并非一个简单的工具,而是一个系统,对于纯粹想要一个能实现互联的工具的人来说是:有太多不需要的东西

4.Flannel

CoreOS团队实现的针对Kubernentes的一个overlay网络工具,让每个使用kubernetes得CoreOS主机拥有一个完整的子网。

优点:可与CoreOS紧密结合,对于那些打算使用CoreOS的人来说是个不错的选择

缺点:这个方案基本上都要与Kubernetes搭配使用。另外在某些情况下,这个方案会导致IP地址的浪费

Docker1.9的安装事项

因为Docker正在快速迭代,一些旧版本的功能不被支持,虽然可以卸载旧的版本再重新安装1.9。这里笔者在新版本系统上重新安装Docker1.9。笔者使用的系统是ubuntu server 14.04.3,内核版本为3.19(内核版本低于3.16无法支持libnetwork)。
查看内核版本:

安装Docker1.9:
添加GPG key:

增加Docker的源:

更新一下:

安装Docker:

检查Docker的版本:

Docker1.9默认的三种网络

通过docker network可以看到docker创建了三个网络:

第一个是bridge,和过去的版本一样,默认情况下,通过docker创建的容器默认都会连接到该网桥,网桥会自动为容器分配ip地址:

创建一个新的容器:

可以看到bridge网桥上增加了我们的c1:

在c1中可以看到相关的网络信息:

我们再创建一个容器,指定其网络为none:

可以看到none中增加了该容器的信息:

进入容器:

可以看到容器只有本地lo

至于最后的host网络,我们同样创建一个容器:

检查数据:

进入容器,检查网络信息:

实际上和我的宿主机machine1的网络信息是一样的:

我们再创建一个连接到bridge的容器c4:

进入c4,尝试ping容器c1:

可以看到,由于没有服务发现,无法直接通过容器名ping通c2,但可以直接通过ip地址ping通。如果启动c2时指定了--link为c1,就可以直接通过容器名ping通。

在docker1.9中,用户可以自定义一个网络驱动,通过参数-d或--driver指定,比如:

我们创建了一个名为b1的bridge驱动的网络,-d还可以指定overlay或其他plugin比如weave。

使用Docker network命令

目前docker network的功能还比较简单,只有下面几个子命令:

当我们开始使用Docker network时,可以先为Docker创建网络,在不加-d指定网络驱动时,默认创建基于网桥的网络:

可以通过inspect查看一个具体网络的信息,Driver那一项指明了网络类型。

但是,对于以网桥为基础的网络,还能有更多特性,这些特性可以通过创建网络时传入参数启用,参考下面的例子:

创建以网桥为驱动的网络时,通过-o或--opt传入配置项和对应的参数,在上面的例子中,让mynetwork1启用了ipv6的支持,使用的配置项格式是"com.docker.network.bridge.xxx"。在Docker network中有以下的几种可用配置项:

下面就以enable_icc这个参数测试一下效果:

通过brctl可以看到刚才创建的网络的网桥:

启动容器:

有问题?接下来会使用docker network的connect功能把容器挂载到指定网络上:

在docker network中提供了connect功能,可以把容器挂载到指定的网络上。但请注意,如果启动容器时指明容器网络为none的话,即传入了--net=none的参数的话,容器就不可以再挂载到别的网络上,这一点还请读者注意。(无法挂载到别的网络时的错误提示如下):

通过查询,可以知道c1的两个地址分别为:

c2的地址分别为172.17.0.3和172.21.0.3

eth0是在docker初始时的bridge网桥上的接口,eth1是mynetwork2上的接口,我们在c1中尝试ping c2的不同网络接口试试:

eth0:

eth1:

可以看到icc被设为false后的确生效了。

如果我们想把容器与网络解除关系,直接使用disconnect

可以看到该网络中已经没有相关容器的信息了。

从上面的例子中可以看到docker network中也提供了inspect用于查看网络的相关信息。

在创建网络时,可以添加-d参数指定网络驱动(可以是weave、bridge等),在上面的icc那个例子中,我们必须进入容器或inspect容器才能知道容器在mynetwork2中的ip地址,我们可以在创建网络时就指定子网地址范围:

这样一来,凡是加入该网络的容器都会自动从这个范围得到ip地址。

以上就是对Docker network的命令的使用指引。

Docker1.9的跨主机容器网络体验

在使用overlay类型的网络时,要做好几个准备:
1.一个可以供集群中所有主机访问的键值储存系统,docker engine支持etcd,consul和zookeeper,libnetwork通过kv store同步信息,在一个节点上创建的overlay网络,你会发现在其他节点也能看到。
2.在每个节点上配置好docker daemon,需要指定--cluster-store,--cluster-store-opt, --cluster-advertise。 但如果你有使用Swarm就会方便得多。

在创建overlay类型的网络时还可以指定好几个参数(引用官方的例子):

笔者没有像官方文档一样使用docker swarm和docker engine,而是手动处理下面的实验。

开始体验

下载,安装consul:

笔者做实验时使用Vmware创建了两个虚拟机,分别是machine1(172.16.77.181)和machine2(172.16.77.182),这里我使用machine1作为consul的server,machine2作为agent。

启动consul:

在m1上:

在m2上:

设置docker daemon:

在m1上:

在m2上:

在任意一个节点创建一个Overlay网络:

可以看到这个网络已经被创建(实际上这个网络的数据通过consul同步到了另外一个vm上,即在任意节点创建一个overlay网络,在所有加入consul的agent节点都能看到):

启动容器并连接o1:

在m1上:

在m2上:

在连接到网络之后,docker创建了一个docker_gwbridge的网桥用于NAT:

接下来收集几个必要的数据:

c1,c2的IP地址(这里只给出我收集c1数据的例子):

MAC地址:

用于overlay网络的namespace ID:

c1的namespace ID:

c1有关的全部数据:
IP:10.0.0.2
MAC:02:42:0a:00:00:02
overlay namespace ID:2-7a7be616b3(全都有一个'-'字符)
c1 namespace ID:d96446acbf28

对于c2也同样收集这些数据(overlay namespace ID在两个节点间是一样的)

c2的数据:
IP:10.0.0.3
MAC:02:42:0a:00:00:03
namespace:6c277da83c39

用ln让namespace可以访问:

以m1为例:

检查下:

查看namespace的信息(overlay网络实际上是基于vxlan的实现):

在m1上输入:

m2上:

这样一来就可以实现c1和c2的互通了。

结语

Docker的迭代速度真的好快(笔者写此文时1.10已经出到rc3了),很多东西都变了,但如果能跟上官方的动态的话,大概是没啥问题。Docker通过libnetwork实现了原生的网络方案,在很大程度上弥补了之前网络功能缺失的问题,希望这个方案能尽快成熟吧。

参考资料:

https://docs.docker.com/engine/userguide/networking/work-with-networks/

https://docs.docker.com/engine/userguide/networking/get-started-overlay/

https://docs.docker.com/engine/userguide/networking/dockernetworks/

http://hustcat.github.io/docker-overlay-network-practice/

作者简介:何智刚,2015至今,现为广东的一名在校高三学生,在学习之余,主要研究Docker,OpenStack,SDN,对各种领域都有所涉猎,目标是迈向full stack。


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/15994.html
分享到:
相关文章
条评论

登录后才可以评论

Hochikong 发表于16-02-26
0