【编者的话】本文系SDN实战团微信群(团主张宇峰@brocade)组织的线上技术分享整理而成,由九州云(99Cloud)培训经理梁博将他对于Docker网络使用体验和一些技术方面的理解进行了分享。
梁博,浙江九州云信息科技有限公司首席架构师兼培训业务负责人,从2012年开始OpenStack研究工作,加入九州云后联合创建了 trystack.cn测试床项目,以及深入OpenStack SDN领域,多次参加各种云计算活动和培训工作,梁老师在九州云担任OpenStack奇侠之天命判官之前也曾在微软研发任职及多次跨界创业。
我今天和大家分享一下Docker的网络,主要是基于我的使用体验和对这里面的一些技术的理解,也顺便听取一下大家的建议。我是做培训的,大多数时候和理论的东西打交道, 顺便做一些实验,为了讲课的时候不那么虚。所以,要是问,在多大规模下会是什么样的,那我就只能说,我不知道了。
讲之前,问大家个问题,大家知道docker0是什么吗?实现docker的网络,有很多方式。
这张图, 是我们在用docker的时候,可以用的网络连接方式,可以看出,默认的 docker对网络的管理,使用的linux bridge ,这个bridge的名字就叫 docker0 。
容器里面有一个 veth连接在这个bridge 上,如果是single host,容器和容器之间的通信会通过docker0,在multi host上, 我们可以把物理的网卡bridge到docker0上,那么容器就可以 实现跨主机的访问 。我主要用docker来做我自己的工具(应用), 所以对网络的要求并不复杂,但是我也考虑过,如果在比较复杂的环境,例如你是做云的,或者你的应用灰常牛逼,需要几万个容器的,那么对网络的要求就会比较高,在这种场景下,我们就不能单单用docker0了。
我们从应用的角度来看待这个问题,如果我是做web application的,那么就涉及到web midlleware database or other backend的架构,他们并不在一个容器里面,甚至不在一台物理主机里面。那么我们在发布多种这样的应用的时候,就会需要编排,网络的管理。
例如backend通常是在private网络,而web server是在可以被外网访问到的网络里面,那么docker的生态里面,会有一些专有的工具来管理网络。这些都做过一些实验,真正敢说自己能在生产环境用的就只有docker + weave了。不过我个人认为,所谓的生产环境,就是被虐了很多遍的POC而已,都是慢慢演进来的。
特别是面对例如 OpenStack,Docker 这种新的东西的时候,可能群里大多比较关注 SDN 技术,所以今天就聊聊 Docker + OVS 吧。docker0比较简单,你装好docker就可以用了。但是ovs需要其他的配置。比如如果我们用k8s,可以使用ovs来封装数据包,也就是说用gre或者vxlan来打通所有的物理节点。好吧,概念是一样的,但是也不一样。
很多人都会比较, docker和openstack 哪个好,我觉得本身他们不是相互取代的,而是 共同配合来完成复杂的应用部署 。单个应用无所谓你用什么,对吧。我说的概念是一样的,在网络层面,他们都是通过port连接到bridge上面,只不过ovs的bridge高级一点。但是有一点不一样,我们通常在跑虚拟化环境的时候,会心里有个数字,就是一台物理机上跑多少虚机。跑20个,50个或者100个,这个是根据应用,在部署之前心里就会知道个大概。但是docker管理的是容器,它没有虚拟机里面OS的那层开销或者说很小,所以,一台物理机跑1000个容器也是有可能的,估计群里有的朋友试过。这就对网络本身提出了很大的挑战
本来我家里的无线路由器只要和我的电脑打交道,结果这哥们带了一堆设备回来,现在连个手表都要IP地址,那么端口一下多了,网络就瓶颈了。那么在一台物理机跑很多容器的情况下,我们实际上不一定需要为每个容器都分配一个ip地址。docker可以让我们容器之间共享网络。也就是一个veth被N个容器来使用。
如果docker之下还有其他的cloud环境,例如AWS,GCE或者OpenStack的话,我们可以把docker的节点限定为一个应用,这个应用的stack,可以共用一个网络环境。我们可以docker run --net=xxx或者docker run --net=host来指定容器的网络环境,这样用来减轻ovs管理多个网络的鸭梨。这个是从单个host的视角来看的。
那么如果还是觉得这样比较麻烦。那么就把这个事情交给它上面的管理系统去做。比如说k8s,它把你的应用做成pod,然后通过service去发布,这个我不细说了。丢个图:
可以在一个pod里面共享一些基础资源,例如网络和存储,service的话,就是让多个pod来做fail over或者LB了。
使用OVS的话,就是: