吐槽:Docker真的好吗?

本文讲的是吐槽:Docker真的好吗?,【编者的话】本文是一篇对Docker“吐槽”的文章,作者从Dockerfile、缓存、分层文件系统、Docker Hub、安全、容器和虚拟机几个方面入手,阐述了Docker和容器技术目前存在的一些问题,以至于说Docker的存在并没有必要。大家可以把这篇文章的观点作为对Docker认识的一个补充,对Docker有一个更加客观的认识,另外本文中包括作者在论证自己观点时引用了很多链接,建议大家都看一下,挺不错的。

概述

距离我上次发表对Docker的看法已经一年了,那个时候我狠狠的批评了Docker在架构上的缺陷以及其糟糕的用户体验。虽然现在项目已经发展到1.0,但是还是得到了一些来自亚马逊的不满,用户失望程度也在不断增加,面临大量的指责,甚至还存在一些可能会导致主机污染的漏洞。然而Docker Hub上个人私有仓库的引入,使得用户自己不需要再运行个人的Registry,再加上webhook与GitHub整合,所有这些看起来是一个良好的开始。

于是我决定再给Docker一个“机会”,并且把其投入到生产中运行六个月,看看效果怎样。结果真的令我很失望,在使用过程中,Docker表现很令人失望,不但性能糟糕,而且由于其本身功能的不足,我们还需要在解决方案上不断地进行变通,整个过程的用户体验也不尽如人意,这使得我几乎想要把自己的脸撞碎在桌子上!事实上,在我看来Docker的性能的确很糟糕,以至于缓存被禁用之后编译过程变得更快。(看看reddithackernews上面讨论)

Dockerfile

Dockerfile有很多问题,在我看来,他很丑陋,有很多局限性,有的地方甚至相互矛盾,并且有很多根本性的缺陷。让我们来说说,假如你想创建单个仓库的多个镜像,例如第二个镜像包含了调试工具, 但是对两个镜像的基本要是是一样的。Docker不支持这样操作(per #9198), 当前并没有能力去对Dockerfile进行扩展(per#735),使用子目录的话会破坏创建的上下文以及阻止你使用ADD/COPY(per #2224), 就像管道一样(per#2112),在容器构建的时候(build time)你也不能够使用环境变量根据不同的运行条件来改变指令(per#2637)。

我们的变通方案是创建一个基础的镜像,两个指定环境的镜像,以及一些包含重命名和sed替换的Makefile自动化脚本。还有一些意想不到不到的“特性”导致$HOME环境变量消失了,还会产生一些没用的错误信息,使用起来的确很不方便。

Docker 缓存/分层

Docker可以使用COW(copy-on-write)文件系统来缓存Dockerfile指令, 类似于LVM的快照,到现在仍然仅仅支持满是问题的AuFS(AnotherUnionFS)。为了提高稳定性以及性能,之后在0.7版本中对COW做了不同的实现, 你可以在这里了解到详细的情况。但是这个缓存系统并不智能,导致了一些令人惊讶的情况,比如不能阻止某一个指令被缓存(per #1996)。并且很慢, 鉴于这一点,如果你禁用缓存或者是避免使用分层,创建的速度反而快一点, 在Docker Hub上传和下载的时候这个表现的更严重,详情会在下面部分进行描述:

这些问题都是由Docker的架构设计导致的,Docker作为一个整体,总是线性的执行指令,即便是在很不合适的情况下也这样 (per #2439)。作为一个改变慢速创建的变通方法,你可以使用一个第三方支持异步执行的工具,例如Salt Slack, Puppet,甚至Bash,这样的话就完全放弃分层的思想使其毫无用武之地。

Docker Hub

Docker鼓励通过Docker Hub来进行社交合作, 允许你发布自己的Dokerfiles,不管是公有的还是私有的,这样其他人可以基于此来通过FROM来进行扩展,而不是拷贝,粘贴。这个生态系统类似于AWS marketplace的AMIs,以及Vagrant的boxes,原则上说是非常有用的。

然而由于一些原因,Docker Hub在实现上是有缺陷的。Dockerfile不支持多FROM指令(per #3378#5714 and#5726),这就意味着你只能继承自单个的镜像。并且他也没有强制版本化, 例如dockerfile/ubuntu:14.04的作者可以替换掉这个标签的内容,这就相当于在使用了没有强制版本的包管理工具。另外在后面也会提到,Docker Hub在速度上的缺陷也很令人失望。

Docker Hub也有一个自动构建的系统,它可以监测仓库中新的提交,并且触发一个容器的创建。因为很多原因,这个功能基本上是没用处的。创建服务没有可定制化的功能,甚至连最基本的前/后脚本钩子也没有。它还强制使用一个指定的项目结构,希望在根目录中只有单一的Dockerfile,导致创建过程变得相当的慢,也破坏了我们之前提到的创建的变通方法。

我们采用的变通方法是使用CircleCI, 一个持续集成(CI)平台,可以触发基于Makefile的Docker创建, 并推送到Docker Hub。这个并不能解决速度慢的问题, 唯一的解法就是使用我们自己的Docker Registry,这样做确实有点复杂甚至可笑。

安全

Docker原来使用LXC作为默认的执行环境,从0.9之后采用libcontainer作为默认的执行环境。当使用合适的执行驱动(exec-driver)时,引入它来调整命名空间的能力,权限以及使用定制的LXC配置

Docker需要一个根守护进程一直在主机上运行,并且有很多安全漏洞,比如CVE-2014-6407CVE-2014-6408,非常坦率的说,这还不应该排在第一位。即便是Gartner, 根据他们可怜的评估记录,也表达了对Docker不成熟,以及安全问题的担忧。

Docker,从设计上来说,对namespace能力过分的信任,但实际上namespace比一般的hypervisor暴露的攻击面要大很多,Xen在Linux里面有129个CVEs(Common Vulnerabilities and Exposures),与之相比它却有1279个。当然,这在某些情况下也是可以接受的,比如在Travis CI里面以公有的方式来构建, 但是在私有情况下和多用户的环境下,就显得比较危险了。

容器不是虚拟机

namespaces和cgroups是非常强大的,允许一个进程及其子进程有一个共享内核资源的私有视图, 例如网络栈和进程表。这种粒度的控制和隔离,加上chroot jailing和grsec, 可以提供一个很优秀的保护层。 有些应用, 例如uWSGI, 直接对这些优点加以利用,而不是通过Docker。 还有些应用不直接支持namespaces的可以用firejail封装成沙箱。如果你觉得很冒险的话, 你也可以直接在你的代码里面支持namespace。

容器化项目,诸如LXC和Docker, 利用这些特性,可以高效的在一个相同的内核空间中运行多个linux的发行版。与hypervisor相比,它们有时候会有一些优点,比如占用更少的内存并且启动速度更快。 但是这是以损失完全性,稳定性和兼容性为代价的。这里有一个跟Linux内核接口有关的边缘情况, 在内核和用户空间运行非兼容的和没有经过测试的glibc版本组合会导致一些不可预料的行为。

回到2008年, 当LXC被设想出来的时候,硬件辅助的虚拟化才有几年的时间, 很多hypervisor有性能和稳定性的问题,这样的虚拟化并没有被广泛的使用,也只是为了降低花费和减少物理机而做了折衷。但是现在hypervisor的性能已经可以和物理机器一样快了,有趣的是,在一些情况下可能更快。运行自定义的虚拟机也变的更快更便宜,随着DigitalOcean在性能和花费方面不断的超越EC2, 使得以一对一的方式运行应用和虚拟机,在财政上变的成为可能。

Bryan Cantrill在这里指出, 虚拟化的性能主要取决于工作负载的类型,比如IO很重的应用会导致更低的性能。

对于有些特定的情况,使用容器化是正确的选择, 但是除非你能很明确的解释为什么你要使用容器,否则你便可以使用hypervisor来代替。即便是你使用了传统的虚拟化,你也可以直接应用namespaces的优势,诸如firejail就可以帮助你的应该在缺少本地支持的情况下来实现这样的特性。

Docker是没有必要的

Docker增加了一个复杂的入侵层,这使得开发,故障排查以及调试变得非常困难, 常常制造的问题比解决的问题还多。这对部署没有一点好处,因为你仍然需要使用的快照来达到自动扩展的目的。更糟糕的是,如果你不使用快照的话,你的生产环境的扩展需要取决于Docker Hub的稳定性。

这个已经被baseimage-docker这个项目滥用了,这个镜像试图通过运行init.d作为入口使得检查、调试,以及兼容变得更容易,它还尝试提供给你一个可以用ssh登录的服务器,从而把一个容器看成是一个虚拟机,尽管作者使用了很无力的论据去反驳这一点。

结论

如果你的开发工作流非常的健全,那么就应该已经明白Docker是没有必要的。所有它宣传的特性要么是没用的要么就是实现的非常差,并且它主要的特性直接可以使用namespaces来完成。Dokcer本来应该是8年前的一个很可爱的想法,但是今天已经没什么用了。

更正/修订

表面上看,Docker有很多值得关注的地方。它鼓励开发人员围绕一个一成不变的部署流程, 可以快速的,简单的开始一个新的项目,还有些其他的人认为有用的东西。但是需要提醒大家的是,本文是聚焦在一个每日的,长期使用的Docker上面,包括本地和生产环境。

尽管大多数提到的问题都是显而易见的,本文并没有为Docker如何变得更好提出什么建议。对Docker来说有很多解决方法,毕竟不管什么项目都是有优缺点的,我会在接下来的文章中作详细的解释。

a-ko对使用容器化有个长期的讨论,markbnj也有一个详细的技术反驳,这两个都是很有用的。

我想对所有给他们反馈的人说声谢谢,看到大家很喜欢我的写作风格感觉非常的高兴,我也读了几个高级工程师的回应, 包括那些欣赏我的人,这非常震撼人心。

原文链接:Lets review.. Docker (again)(翻译:左伟 校对:王哲)

原文发布时间为:2015-02-10 

本文作者:左伟

本文来自合作伙伴DockerOne,了解相关信息可以关注DockerOne。

原文标题:吐槽:Docker真的好吗?

时间: 2025-01-18 17:17:56

吐槽:Docker真的好吗?的相关文章

Docker缩短新开发者熟悉项目时间的五个方面

本文讲的是Docker缩短新开发者熟悉项目时间的五个方面[编者的话]本文介绍了如何使用Docker容器来减少新员工入职加入团队的准备启动时间的五个方法,包括Docker容器是唯一的依赖.容易知道如何构建环境.跨机器的便携性.一致性的开发环境以及轻量级的环境. 无论公司规模大小,加入新的开发者并且想要让其尽快达到能够干活的程度,仍然是一个显著的挑战.新开发者被雇佣和生产(作者所谓的生产可以看"注1")的时间越长,需要耗费的时间就越长,尤其是一些经验丰富的开发者. 鉴于此,有效的入职工作流

TensorFlow(1):使用docker镜像搭建TensorFlow环境

1,关于TensorFlow TensorFlow 随着AlphaGo的胜利也火了起来. google又一次成为大家膜拜的大神了.google大神在引导这机器学习的方向. 同时docker 也是一个非常好的工具,大大的方便了开发环境的构建,之前需要配置安装. 看各种文档,现在只要一个 pull 一个 run 就可以把环境弄好了. 同时如果有写地方需要个性化定制,直接在docker的镜像上面再加一层补丁就好了. 自己的需求就能满足了,同时还可以将这个通用的方法分享出去. 2,下载TensorFlo

Docker Workflow(三):编排工具

本文讲的是Docker Workflow(三):编排工具,[编者的话]要在生产环境中发挥Docker的威力,离不开编排工具的支持,否则将深陷容器监控与管理困难的泥沼.目前市面上有不少此类工具,如何选择最合适的一个,本文给出了一些参考. 这是关于我们如何在IIIEPE的生产环境中使用Docker的系列文章的第三部分.如果你还没看过第一(译文)和第二(译文)部分,请先前往阅读再继续.本文中,我将讨论我们测试过的编排工具,我们的选择及原因.我也会说明我们如何使用Jenkins来处理繁重的工作,以及它的

Docker应用的四个关键设计因素

如今,Docker已成为无处不在的容器技术.人们在设计时要考虑可移植性的应用程序,可以帮助企业充分利用所提供的容器所有的技术优势. 随着Docker应用和容器的日益普及,许多企业都在云操作系统和应用程序寻求采用容器技术.由于容器提供的可扩展性.可移植性和效率,企业选择在VMS系统运行.不同于虚拟机,多个容器可以在主机操作系统的同一内核上运行,从而减少开销,并提供更好的性能. Docker为了容器内的应用提供了一个平台之间移植的环境.Docker是一个受欢迎的选择,因为它简化了应用程序的部署和管理

Docker到底影响了什么?

[编者按]作为2014年最火热的技术,Docker获得了国内外各大厂商的支持.本文中,云栈科技VP石海旭从传统虚拟化,CaaS(容器即服务),IaaS,PaaS,CMP,传统ISV,DevOps这几个角度,分析了Docker所产生的影响,以下为原文: Docker,14年最火的词汇之一,引起了万千关注.在2014年边上,抛开种种技术性的内容和环节,我们觉得从更宏观的角度和大家分享我们对Docker的一些认识, 相对也许是个更轻松,更适宜的话题. 我们不敢妄言创造未来是预测未来的最好的方法,我们只

价格战之后,云计算市场将迎来云服务生态竞争

编者按:国内云计算市场正在经历美国云计算市场三年前所经历的价格战时期,价格战之后,云计算市场将会迎来巨头之间相对稳定的竞争局面,那时的竞争,将要靠各自的云服务生态来对决. 如果找一个词来形容2016年的中国云计算市场,"价格战"再适合不过. 在12月的云栖大会广东分会上,阿里云宣布了2016年以来第18次降价:新用户华南区云服务器优惠至7折,中国各大区云数据库全系调价,平均降幅20%,云服务器独享实例最高降幅30%,并推出"免费套餐"计划,获得邀请码的新用户可在半年

记一次完整的办公网渗透到idc过程

今天我就分享分享一下我渗透自己公司办公网与公司对外的idc服务器集群网.刚进公司大家都懂的事情就是入职培训,培训时听一位领导说我们公司安全做得非常好,如硬防策略写死,交换机Acl写死,绿盟xxx洞漏洞扫描器定时扫描,企业版的卡巴每台员工机器上必装,wsus系统帮内网服务器时时打补丁,各部门用vlan隔离,定时请xxx安全公司做渗透测试,登录服务器用vnp(硬件vpn,还必需有证书才能登录),idc服务器统一用内网ip做映射,一听不错啊,安全防范应该很强.498)this.width=498;'

Docker安全性(一)——Docker容器真的安全吗?

Docker安全性(一)--Docker容器真的安全吗? 本文翻译自Daniel J Walsh的一篇开源文章:http://opensource.com/business/14/7/docker-security-selinux 这篇文章是基于一个演讲中"今年在我DockerCon上的分享":http://v.youku.com/v_show/id_XODQwNjUwNTIw.html. 这将讨论Docker容器的安全性,我们目前正在做什么,和我们将朝哪里走. 这是一个系列Docke

你真的了解Docker吗?——Docker插件机制详解

云栖TechDay活动第十八期中,阿里云容器服务团队的核心成员陈萌辉带来了题为<Docker插件机制详解>的分享,分享中,他结合阿里云容器服务实践介绍了Docker插件的基本原理.实现方法以及插件机制未来的演进. 幻灯片下载地址:https://yq.aliyun.com/attachment/download/?filename=bdefe06ba7a14d7604af5a63a4bcc4f3.pdf 以下为现场分享观点整理. 为什么需要Docker插件?   Docker之所以这么火并且有