冰桶挑战热度未消,IT届又掀新宠Docker狂潮,作为今年最炙手可热的开源项目之一,docker所到之处,无不引起IT大拿们争相追逐。8月30 日,由Docker中文社区主办的DockerMeetup来到深圳,并邀UCloud、华为云、七牛云存储等各领域专家共话Docker应用与畅想。
随着新一波移动互联网浪潮涌入,曾经码农们的创富神话已变成了如今的掩面慨叹,“开发者之艰辛”“为开发者减负”的言论不绝于耳。曾有硅谷的工程师认为“如果说有什么能让开发人员工作变得轻松一点的话,docker就是其中之一”。
云计算的明日之星Docker
Docker可以被形象地看做一个应用封装容器,以往开发者开发一款应用,需要考虑硬件、操作系统、运行环境的适配,有了容器就不用考虑这些了。开发者直接在容器里开发,提测时把整个容器测试,测试后在容器内进行改动,再上线。通过容器,整个开发、测试和生产环境可以保持高度的一致。此时开发者只需专注于开发软件,不需要考虑在哪运行自己的软件,这也是云计算的发展方向。Docker因其轻量级特性,可协助应用实现云端的即时迁移,这必吸引更多人来使用云服务,因此当之无愧称得上是云计算的明日之星。
UCloud作为国内顶尖的云计算基础服务商,受邀参加此次活动演讲。资深工程师邱模炯就Container内核原理做了详细介绍,以下是整理的演讲实录:
Docker的本质是Container,很多人疑惑Container与VM的区别,Container作为一种应用封装容器,在表象上类似于虚拟机VM,但在实现的原理和应用上与虚拟机VM其实有着巨大的区别:
VM一般指系统虚拟化,每个虚拟机的运行环境由VMM(虚拟化管理器)仿真而成,每个VM运行各自的内核;而Container仅仅是应用封装容器,它在应用态封装了一个rootfs,多个Container共享同一个内核。VM和Container的总体架构图对比如上所示。从使用者的角度,Container和VM一样也拥有独立虚拟机这个假象,这正是底下内核的namespace和cgroup所努力达到的。不过由于 Container的内核是共享的,这个假象虚拟机无法像VM虚拟机一样任意安装操作系统。在DockerContainer用到的技术,除了 namespace和cgroup,还用到了AUFS(联合文件系统)。这些是DockerContainer在内核原理上主要的技术点。 Namespace用做进程组的虚拟化,一组进程如果放入共同的namespace即产生没有资源限制的Container.一个进程的运行环境通常包括:pid,父pid;uid,gid;VFSmount(rootfs),net协议栈,hostinfo, IPC, /proc, /sys等。在有Container之前,所有应用程序的rootfs都是一样的,即整个操作系统的根目录;所有进程涉及到的网络环境都是一样的,即同样的IP地址,同样的路由,同样的网络接口。namespace的功能,允许多个进程组成一个container拥有独立的运行环境,不同 container有不同的rootfs,不同的网络协议栈,不同的IPC.这就是namespace,进程运行环境所涉及的方方面面都有相应的 namesapce.总的来说,Namespace可以制造一种虚拟机的假象,可以实现独立的mnt;独立的pid空间;独立的网络协议栈;独立的 IPC;独立的/proc /sys.
但Container如果只有Namespace,资源无法根据需求QoS配置,因此这里需要借助Cgroups.cgroup用于进程组的资源隔离,我们能想到的方方面面的资源都可以通过cgroup来控制,比如控制一组进程总计使用多少CPU、总计使用多少内存;一组进程只能访问哪些设备;一组进程的 IOPS大只能多少。Container天然包含一组进程,Container就是借助cgroup来限制资源使用,使得不同Container用到的资源正确隔离。
在提供了类似虚拟机的环境,且资源得到保证之后,这时我们又会考虑另外一个问题:如何使Container变得更精简。假设:一个Container的 rootfs大小是1G,100个Container要100G,这不但占用大量空间,而且传输起来相当费事。这里我们就会使用AUFS技术,以递进的方式创建"Container"——一个Container的rootfs叠在另一个上面,就像使用git增量开发一样。这样的话极大的节省了对存储的需求,也能加速容器的启动。目前AUFS还有不太完善之处,例如,进行一个写的操作会需要导致整个文件的拷贝,AUFS本身的参数、细节太多,不可推理也不可预测,但整体上来说AUFS还是可以起到精简、提高性能的的作用。
在实际工作中,会有哪些场景适合Container或者VM呢?先来比较一下他们各自的优劣:Container运行开销小;部署速度;启动速度快,不需要走整个系统流程;VM运行开销大,因为多了一层GuestKernel;启动速度较慢;但Container不能做在线迁移。我们以实际应用场景来说明,UCloud在一些内部的业务使用了docker,但没有像云主机一样像客户售卖Container.这是因为客户对虚拟机隔离性要求非常高,他们希望我们的虚拟机绝对安全,就目前为止,Container因为内核共享,无法做到彻底的隔离,也就没有令人放心的安全性。从资源切割的角度,个人认为,Container更适用于大公司的内部云平台,同一台物理机通过DockerContainer部署不同的业务并相互隔离,提升资源利用率,简化业务管理和部署。特别是,DockerContainer有着较完善的管理工具,可实现Container的一键打包、一键部署、一键运行,在业务迁移、部署方面很有优势。
我们相信DockerContainer应用封装容器对开发、测试和运维能起到积极作用,对于云平台意义重大。让我们拭目以待未来Docker的发展!