网络工程师眼中的docker
好多年前,“云计算”这个名词刚出现的时候,好多概念还真是“云里雾里”、“虚无缥缈”,好多时候,大家把“云计算”等同于“网格计算”、“分布式计算”。似乎那个时候更注重是“计算”两字,或者可以说那个时候大家对云的理解还不够透彻,不知道“云”到底是啥玩意。又过了几年,“云计算”的概念清晰了许多,好多人认为“虚拟化”就是云计算,搞个workstation virtual box就开始玩“云计算”了。不过,那时候也挺好玩,当虚机能够被实时“漂移”走的时候,我们遐想到了很多。。。也这是这个时候,IaaS、PaaS、SaaS的概念被提出来,“云计算”的关注点也更专注于“云”上面了。而且“云”的概念也越来越具体化、形象化,如同水、电、煤,按需使用、按需付费。
好玩的事情来了,那时候的网络工程师(运维工程师),对自己管辖范围内的设备似乎更熟悉。网络工程师管好一摊交换机、路由器、安全、LB等等,存储工程师管好存储主机、磁盘柜等等,系统工程师管好服务器、OS等等。而云计算的概念逐渐将这些“网络”、“存储”、“计算”都变成了“资源池化”。顾名思义,以前管服务器的小伙伴看到的是机房里的好多闪着绿灯的运行着的服务器,里面看得见、摸得着的每颗CPU、内存条、硬盘、RAID卡、PCIE等等。云环境里,这个小伙伴看到的不再是一颗一颗CPU,他看到的是整体“计算资源池”能够提供多大的计算资源、多强的计算能力,业务似乎更具体化了,运维能够更契合业务了。
再多��嗦几句,VM是什么?下面的图可以看到,VM是寄宿在裸金属或者宿主机上的一个系统。由hypervisor(VMM)借助硬件辅助虚拟化的能力为上层OS提供运行环境、文件存储。而很明显,对于开发者而言,这已经是进了一大步了,为什么?以前资源利用率低,一台服务器只能有一个OS,眼睁睁看着内存、CPU资源浪费掉。如今hypervisor把海量内存统统池化后,统一给上层OS提供服务。那么问题又来了, 人就是这么懒惰,对应开发者而言,有了OS的确帮助他们方便了很多。镜像模板一倒,一个OS就能跑了,但编译环境呢?每次做开发都需要对应调运行环境,而JAVA/PHP等等编译环境、参数又各不相同,每次又需要重新调整。
Docker是什么?
这时候docker就来了,docker是什么?docker是基于GO实现的云开源项目,诞生在2013年初。最初的由dotCloud公司发起,而后来dotCloud公司也正是改名为Docker公司。Docker目前已加入Linux基金会,遵循Apache2.0协议,全部开源,可以说2014年docker火了一把,而如果说docker是PaaS平台的宠儿的话,那另一个IaaS的宠儿必然是OpenStack了。下面引用Wiki上对docker的解释:
Docker是一个开放源代码软件专案,在软件容器下自动布署应用程序,借此在Linux操作系统上,提供了一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。Docker利用Linux内核中的资源分离机制,例如cgroups,以及Linux内核名称空间,来建立独立的软件容器(containers)。这可以在单一Linux实体下运作,避免启动一个虚拟机器造成的额外负担。docker最初版本发布于2013.3.13日,提供操作系统层面的虚拟化。
下面来看一下逻辑图,对比着可以发现,docker已经不再是多OS的运行环境了,他提供了单个OS中的多“编译环境”,把这时髦的词叫做“容器”。虚拟化的层次更进了一步,由多OS变成了多容器。想必云服务提供商们已经在做如何将“卖虚机”的服务转变成“卖容器”的服务了吧。言归正传,这是真正意义上的PaaS。
纵观当今主流的Linux版本,RHEL、CentOS、Ubuntu都已经在最新版本里面提供了docker的软件支持包。
接下来要好好谈一下docker的容器技术,何为docker容器?其实就是Linux容器(LXC,Linux Containers),而docker容器在LXC的基础上,对容器管理进行了优化,包括:分发、版本控制、移植等等,让使用者无需关注底层。而不同docker容器就类似一个沙箱,默认情况下彼此隔离,也可以建立通信机制。而正是这种容器级的虚拟化,在高效的Linux下,一个OS可以运行上千个docker容器,相比于OS级的几十个VM,整体资源利用率又更上了一个台阶。
而我们如果对比docker的容器和VMM的hypervisor,可以看到:
(1)容器间类似每个沙箱,彼此互相隔离。VM则是每个OS彼此隔离。
(2)系统损耗,docker利用率高于hypervisor,因为容器在OS层面的损耗少于VM中每个guest OS
(3)文件系统:VMM是有自己的文件系统基于OS级,docker文件系统基于容器级
Docker三大核心概念介绍:
镜像――类似于虚拟机镜像,用于存放docker引擎的文件系统,一个镜像内部可以拥有一个完整的系统环境,当然,镜像也可以包含已经安装部署了的应用程式。
容器――docker容器是一个沙箱技术,沙箱彼此默认隔离应用。容器是镜像运行的基础,可以对容器进行的操作有:启动、开始、停止、删除。对应到VMM的话就是每一个虚机。
仓库――用于存放镜像文件的仓库,可以分为私有仓库和公有仓库(公网可取)。每个仓库可以放很多的镜像文件,通过开放下载的方式加载,当然,用户也可以将自己使用的镜像文件上传至仓库。
Docker核心解决的问题是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。同VM的方式不同, LXC 其并不是一套硬件虚拟化方法 - 无法归属到全虚拟化、部分虚拟化和半虚拟化中的任意一个,而是一个操作系统级虚拟化方法, 理解起来可能并不像VM那样直观。所以我们从虚拟化要docker要解决的问题出发,看看他是怎么满足用户虚拟化需求的。
用户需要考虑虚拟化方法,尤其是硬件虚拟化方法,需要借助其解决的主要是以下4个问题:
隔离性 - 每个用户实例之间相互隔离, 互不影响。 硬件虚拟化方法给出的方法是VM, LXC给出的方法是container,更细一点是kernel namespace
可配额/可度量 - 每个用户实例可以按需提供其计算资源,所使用的资源可以被计量。硬件虚拟化方法因为虚拟了CPU, memory可以方便实现, LXC则主要是利用cgroups来控制资源
移动性 - 用户的实例可以很方便地复制、移动和重建。硬件虚拟化方法提供snapshot和image来实现,docker(主要)利用AUFS实现
安全性 - 这个话题比较大,这里强调是host主机的角度尽量保护container。硬件虚拟化的方法因为虚拟化的水平比较高,用户进程都是在KVM等虚拟机容器中翻译运行的, 然而对于LXC, 用户的进程是lxc-start进程的子进程, 只是在Kernel的namespace中隔离的, 因此需要一些kernel的patch来保证用户的运行环境不会受到来自host主机的恶意入侵, dotcloud(主要是)利用kernel grsec patch解决的.
Docker应用场景
(1)当对资源利用率高,颗粒度更细的场景。可以有效利用沙箱的隔离技术,提供数以百计的虚拟运行环境。
(2)细化数据存储和数据库处理,当两者分属于两个容器时,对数据库的升级时,只需要使用新的容器替换掉目前的数据存储就可以完成。
(3)把Docker当测试环境,容器的方式便于管理、开启、替换、删除
(4)多租户隔离,利用docker的沙箱隔离机制,此时的租户可以是一个“服务用户”,也可以是一个需要隔离的“APP”
(5)服务快速部署,因为是容器级的虚拟化,所有配置的部署比系统级虚拟化更快速更优效率
附Docker推荐的应用场景:
Docker主站
https://www.docker.io/
国内Dockerpool
http://dockerpool.com/
在线《Docker ―― 从入门到实践》
http://dockerpool.com/static/books/docker_practice/index.html