Docker在2013年三月实现了开源发布,它的出现让软件开发行业对于现代化应用的打包以及部署方式发生了巨大的变化。紧随着Docker的发布,各种具有竞争性、致敬性以及支持性的容器技术纷纷涌现,为这一领域带来了极大的关注度,同时也引起了人们的反思。这一系列文章将解答读者的各种困惑,对如何在企业中实际使用容器进行分析。
这一系列文章首先将对容器背后的核心技术进行观察,了解开发者目前如何使用容器,随后将分析在企业中部署容器的核心挑战,例如如何将容器技术与持续集成和持续交付管道进行集成,并对监控方式进行改进,以支持不断变化的负载,以及使用短期容器的潜在需求。本系列文章的总结部分将对容器技术的未来进行分析,并探讨无核化技术(unikernels)目前在处于技术前沿的组织中所扮演的角色。
本文是本系列文章“ 实际应用中的容器 —— 远离炒作 ”中的其中一篇。你可以通过RSS订阅该系列文章,以获取更新的通知。
InfoQ近期与 《Using Docker》 的作者 Adrian Mouat 进行了一次访谈,探讨了编写本书的动机;Docker为什么能够在这么短时间内获得整个IT行业关注的原因;以及在传统的软件开发生命周期中如何以最佳的方式使用容器等话题。
《Using Docker》一书共分为三个部分:背景与基础部分、在软件开发生命周期中使用Docker,以及工具和技术部分。第一部分涵盖了Docker出现的历史背景以及它的发展,提供了在各种平台上进行安装的详细说明,并分析了容器背后的基础原理。本书介绍了一个用Python编写的web应用,并通过Docker进行部署。在本书对应的GitHub仓库“ using-docker ”中可以下载该示例应用的代码,读者可以按照其中的步骤对应用程序进行“Docker化”。
第二部分专注于分析如何在传统的软件开发生命周期中使用Docker。深入地描述了如何创建一个简单的web应用并完成打包和执行,并探讨了一些特定于容器的概念,例如镜像的分布、卷组的挂载以及Docker的网络设置。Mouat将容器的概念与它在传统的持续集成流程中的使用进行了关联,在示例中使用了读者熟悉的工具,例如Jenkins。本书第二部分的总结部分对容器的监控以及通过ElasticSearch/Logstash/Kibana(ELK)技术栈进行日志记录进行了深入的讨论。
本书的最后一部分,即第三部分对工具与技术进行了详细讲述,从中级难度起逐步讲到高级难度的内容(读者需要掌握本书前两部分的知识),并涵盖了网络与服务发现方面的详细内容,以及编排与集群方面的主题,和 Docker Swarm 、 Mesos 以及 Kubernetes 等平台的应用。本书的最后一章对于容器的安全性进行了全面的探讨,内容包括在“最小权限”下运行容器、镜像源、以及如何限制对底层host操作系统资源的访问。
InfoQ与Mouat进行了一次访谈,所讨论的问题包括Docker本身、容器对于软件开发生命周期带来的影响、以及他对于Docker未来发展的展望。
Adrian Mouat:我名叫Adrian Mouat,目前正在参与建立Container Solutions Labs的工作,这是Container Solutions的一家姐妹公司,它将专注于开发容器与微服务这一领域的产品与服务。在这之前,我一直致力于软件开发方面的工作,曾参与各种不同类型的项目,包括大型的数据处理框架,乃至小型的web应用。在我之前所任职的一家公司里,我首次接触到Docker,当时我们使用它为一个小型的Python web应用建立了一个持续部署(CD)工作流。我对于Docker这一解决方案的优雅与灵活性所深深打动,促使我专门为此撰写了一篇博客文章。O'Reilly看到了我的博客后与我取得了联系,并问我是否有兴趣为推出一本Docker方面的书籍写一份提议。谢天谢地,他们认可了我的提议。于是,在这之后的一年半时间里,Docker就成为了我生活的全部!
Mouat:我相信容器会成为常规的软件工作流中的一个标准组成部分,它为计算带来了许多新的可能性,例如不可变基础设施和不同环境之间的可移植性。一些在VM中难以实现的任务,换做容器就可以简单许多,这一点要归功于容器的速度与大小,它满足了开发者对于快速的反馈循环的迫切需求。组织必须对这一技术加以关注,因为如果容器能够让某个工作流的效率提高几个百分比,那么这就让该组织比起竞争者能够更快地发展。尽管它的优点如此明显,但我仍对于容器技术能够这样快地获得行业的关注感到惊讶。
Mouat:这个问题问得好。Docker可帮助组织处理各个领域中的问题。引入Docker的一个较好的时机是通过它搭建持续集成(CI)或测试环境,如果设置得当,那么它能够极大地加快开发管道,同时也不会造成破坏生产环境的风险。不过,要想获得最大的价值,你需要在整个生命周期中使用容器技术,让开发者创建这些镜像、通过CI发布这些镜像、并交付给运维团队以部署。如果一切顺利,你就能够将开发环境与生产环境之间的差异性降至最低,根除了许多可能发生的问题,例如“在我的机器上是正常的”这种问题。当然,大多数组织都不希望一次性进行太多改变。与运维人员相比,开发者更愿意开始使用Docker,因为酷炫的新工具对于他们来说有着天然的吸引力,而运维人员更专注于如何保持产品的稳定运行。我相信,随着Docker证明自己是一个可信赖的技术,运维人员开始认同容器为部署工作带来的益处,这一现状将逐渐得到改变。
Mouat:Docker的发展确实很快。本书的第一版涵盖了Docker 1.8的内容,某些Linux分发版本上的包还落后于这个版本。而编排框架以及其他各种工具同样难以做到跟上这一发展速度,有时他们仅支持旧版本的Docker。不过,我相信这种变化速度已经逐渐开始放缓了。基础API以及格式已经开始巩固及标准化工作,这可以在很大程度上缓解这一问题,因为人们最担心的还是破坏性的变更,它会破坏现有的工具与代码示例。此外,随着Docker代码库的逐渐庞大以及使用者数量的提高,要进行一些大规模的变更时,就必须预先进行大量的思考与咨询。
Mouat:这是一个很常见的问题。首先要指出一点,选择容器还是VM这本身就是一个伪命题,你完全可以同时使用这两种技术(而且你很可能会这么做)。
虽然如此,但很多人还是会将两者进行对比,而这一话题也非常有趣。
许多人认为VM更加安全,原因如下:
但另一方面,容器也为人们提供了许多安全特性,比方说用户可以很方便地创建一个小型容器,其中只有相对很小的受攻击面;或是在运行的容器中使用只读的文件系统,以及有限的权限集。Docker已承诺在这一领域的持续改进,近期就包括对 用户命名空间 以及 seccomp 的支持。
Mouat:牢记 最小权限 的原则,对于容器来说,这就意味着容器应当仅能够访问为实现其功能所必需的数据与资源。有几种方式可以实现这一点,包括:
如果你希望了解最小权限概念的更多相关知识,请参考由Nathan McCauley 和Diogo Mónica所做的演讲“ 最小权限的微服务 ”。此外,在免费的迷你书 《Docker Secrity》 (需要注册)中完整地涵盖了以上各种方法乃至更多的方法,其中的内容来自于《Using Docker》一书。
Mouat:我认为这方面的技术还不稳定。正如你刚刚所提到的讨论,这也是为什么Kubernetes项目 声明他们不支持 Docker网络模型的原因。此外,值得注意的是,Weave仍建议用户使用独立的二进制文件,它会在Docker客户端与deamon之间插入一个代理,因为在他们看来,代理能够提供一个更清晰、更简单的接口,可以减少所面对的问题。不过,这一点可能会随着时间而产生变化,我还想强调一点,即使不使用代理,也是有可能将Weave直接作为插件而使用的。在存储方面的不同意见似乎没有这么多,这可能是因为用于支持各种实现的钩子之间的区别并不大,不过这只是我个人的意见而已。
Mouat:这一领域已经成为了一个真正的战场。Docker Cloud(曾命名为Tutum)是Docker Inc推出的SaaS产品,预计将会集成对Swarm的支持,以实现集群及编排功能。Mesos已经在几家大公司中得到了应用,它的发展历史也最久。Google则力推Kubernetes框架,这是他们基于过去十年间在内部使用容器的经验所开发的一套非常强大的框架。现在还很难预测最终的结果会是如何,而由Hashicorp推出的Nomad也想分一杯羹。
Mouat:使用容器技术时,监控方面的问题就会变得非常突出,尤其在你选择了微服务架构时更为明显。因为你很可能会创建上千个短期的容器,而传统的监控工具很难跟上这方面的需求。Lukasz Guminski是我在Container Solutions的一位同事,他为此专门撰写了一篇 深度文章 。而Adrian Cockcroft对于这一主题也撰写了大量的文章,进行了多次演讲,包括在InfoQ上发布的这篇文章。好消息是,这一领域出现了许多新公司与新产品,例如 Ruxit 、 Prometheus 和 Weave Scope 。虽然目前已经出现了一些可以选择的解决方案,但我期待在这一领域会出现更多的创新与发展。对于希望向容器技术迁移的公司,我建议他们要注意这方面的问题,选择能够帮助他们的工具。
Mouat:我对于编排方面的发展最感兴趣。如果Kubernetes最终能够占据编排与集群这一领域的主导地位,那么他们可能会转而选择不同的容器运行时(例如从Docker切换至rkt),这对于Docker将是一次沉重的打击。我期待这一领域会出现许多大动作以及相关讨论。
我们还将看到更多使用Docker API的不同实现。由Joyent推出的Triton就是一个优秀的工具,它通过使用一个基于SmartOS和LX-branded区域所构建的自定义Docker引擎,能够提供对Docker容器的裸机托管。此外,在轻量级VM即容器方面也会有很大的发展,包括由VMWare推出的Bonneville(现在叫做vSphere Integrated Containers),以及Intel所推出的Clear Container。最后,我们也一定会看到无核(unikernel)技术的发展,无核是指将kernel与OS进行最精简化,只提供运行某个应用所必需的功能。Docker Inc近期对Unikernel Systems的收购意味着我们很快就会看到标准API工具中对无核的支持。无核技术面临着很多压力与争议,但对于物联网(IOT)、以及其他一些看重低资源消耗以及最小受攻击面的领域来说,无核似乎是一种很好的选择。
在O’Reilly Media网站上可以订购Adrian Mouat的著作 《Using Docker》 。
Adrian Mouat 是Container Solutions的首席科学家,这是一家跨全欧洲的服务公司,专注于Docker与Mesos方面的服务。Mouat也是《Using Docker: Developing and Deploying Software with Containers》这本由O’Reilly出版的书籍的作者。他曾经参与了各种不同的软件项目的开发工作,包括小型的web应用乃至大规模的数据分析软件。
Docker在2013年三月实现了开源发布,它的出现让软件开发行业对于现代化应用的打包以及部署方式发生了巨大的变化。紧随着Docker的发布,各种具有竞争性、致敬性以及支持性的容器技术纷纷涌现,为这一领域带来了极大的关注度,同时也引起了人们的反思。这一系列文章将解答读者的各种困惑,对如何在企业中实际使用容器进行分析。
这一系列文章首先将对容器背后的核心技术进行观察,了解开发者目前如何使用容器,随后将分析在企业中部署容器的核心挑战,例如如何将容器技术与持续集成和持续交付管道进行集成,并对监控方式进行改进,以支持不断变化的负载,以及使用短期容器的潜在需求。本系列文章的总结部分将对容器技术的未来进行分析,并探讨无核化技术(unikernels)目前在处于技术前沿的组织中所扮演的角色。
本文是本系列文章“ 实际应用中的容器 —— 远离炒作 ”中的其中一篇。你可以通过RSS订阅该系列文章,以获取更新的通知。
查看英文原文: "Using Docker" Book Review and Q&A with Author Adrian Mouat