再论为什么OpenVZ没有Docker那么火

2018/10 17 10:10

昨天发表了《为什么OpenVZ没有Docker那么火》之后,有这么几条讨论:

着眼点从虚拟机转到应用,极大拓展了容器的应用范围。 @yangdigital
说不定能反推一把呢? @柳烟堆雪
OpenVZ是容器技术,而docker是基于容器的应用框架。OpenVZ没有Docker火,根源是采用不同的镜像方案。@ptptptptptpt

我对OpenVZ工程师充满尊敬,他们贡献的范围不仅包括OpenVZ,还包括主流Linux内核:

  1. PID namespace和net namespace
  2. 一些cgroups controller

更不必提他们直接对LXC和Docker的贡献。我感兴趣的是,OpenVZ技术高超如斯,为何没有达到更高的发展高度?OpenVZ背后的公司是Parallels,主打的商业产品是Parallels Cloud Server(PCS)。根据官方网站,已经有10,000多家云服务提供商采用了Parallels的解决方案。在公有云平台这种多租户的环境中,安全是重中之重。因此,PCS采用的是修改过的RHEL6内核(2.6.32),对RHEL7内核的修改估计2015年会完成。OpenVZ和PCS共享相同的内核,但是用户态工具大不相同。举个例子,OpenVZ只提供命令行工具vzctl,而PCS则提供了完整的API。如果像我之前那样,需要在程序中集成OpenVZ,就只能封装命令行的vzctl。且不说研究vzctl的各种参数、解析标准输出这些琐碎工作,更要命的是有些vzctl操作是独占的,此时不允许多个vzctl进程并发执行。没有API,导致一个严重的后果:形不成一个以OpenVZ为中心的生态系统。也许这是Parallels有意为之。如果OpenVZ提供完善的API,总会有人去开发相应的实用工具和服务,最终与PCS形成事实上的竞争关系。

由于着眼点是轻量虚拟机,OpenVZ提供的模板(即镜像)都是操作系统,主要包括CentOS/Debian/Fedora/Ubuntu等几种,这就没必要专门设一个类似于Docker Hub那样的镜像中心。OpenVZ的镜像文件会映射到ploop设备上。有人问:把容器的文件直接写在常规文件系统,然后chroot不就完了呢?使用ploop的好处包括:不同的容器可以有不同的文件系统设置,且互不相影响性能;支持快速建立快照;有文件系统写入操作的跟踪器,有利于实现文件系统数据的实时迁移。OpenVZ还开启实时迁移工具项目CRIU,它充分地利用了ploop的特性和OpenVZ内核提供的kernel memory controller,后者意味着我们可以把一个虚拟机的内存状态也迁移到别处。

你看,OpenVZ开发者完全是从虚拟机的视角研发技术和产品。不知道是否受到Docker发展态势的影响,在2014年底的OpenVZ past and future一文中,Parallels决定把OpenVZ和PCS合并为一个统一的开源代码库,OpenVZ用户也能够像PCS用户那样使用更稳定、更多的功能特性。第一步是在2015年开放基于RHEL7修改的内核,重点是增加kernel memory controller支持,随后是ploop。是的,轻量虚拟机是OpenVZ永恒的视角,它一直狂奔在轻量虚拟机的道路上。

反观Docker,它本来是dotCloud公司(当然,现在改名叫Docker公司了)的一个内部项目。dotCloud提供的服务是云计算应用引擎(Platform as a Service,PaaS),云应用的运维才是dotCloud目标用户(即开发者和运维人员)的痛点。Docker镜像描述了应用程序的依赖,Docker用容器技术实现不同应用的隔离(这避免了不同应用的依赖之间相互影响)和转移。用户的应用千差万别,不可能像操作系统镜像那样只有有限几种,这就需要一个Docker Hub供大家分享各种应用程序镜像。Docker还应用Copy-on-Write技术和分层文件系统,有效地解决了Docker镜像和容器的大小问题。Docker完全开源,一开始就提供API,于是围绕Docker的工具和服务层出不穷,一个生态系统出现了。

OpenVZ和Docker的发展水平不同,是因为它们具有不同的vision,所以它们才会采取不同的镜像方案。也就是说,采用不同的镜像方案是“果”,而不是“因”。

从长远看,Docker有更好的发展前景。无论用户的基础设施是物理服务器、KVM/XEN虚拟机还是OpenVZ容器,最终目标还是要部署实现商业价值的应用。Docker提供的是每一个软件与互联网企业都需要的工具和服务,而OpenVZ容器只是诸多选择之一。

说句题外话,一个常见的问题是坚持每个Docker容器只运行一个应用进程,还是当作一个轻量虚拟机?如果我的分析成立,应该坚持前者。如果要把容器当作一个轻量虚拟机,LXC/LXD更适合。

还有几个值得思考的问题。如果我们是Docker的开发者,

  1. 怎么实现Docker的商业价值?
  2. 目前Docker存在什么问题,需要采取哪些改进措施?

--转载请注明: http://91o.cc/%e5%86%8d%e8%ae%ba%e4%b8%ba%e4%bb%80%e4%b9%88openvz%e6%b2%a1%e6%9c%89docker%e9%82%a3%e4%b9%88%e7%81%ab/

作者 - 分类 未分类

发表回复

(必填)