查看原文
其他

Docker果真是未来?

2016-08-19 云头条

作者简介:Paul Biggar是CircleCI的创始人。


嗨,我的上司让我来采访你,听说你对Web应用程序颇为了解?

-是的,我现在主攻分布式系统。我刚参加完ContainerCamp和Gluecon回来,下周要去参加Dockercon大会。确实为行业前进的方向感到激动――让一切变得更简单、变得更可靠。这就是未来!


很棒。我眼下就在构建一个简单的Web应用程序――使用Rails的一个平常的CRUD应用程序,将部署到Heroku。那仍是出路吗?

-哦,不。那是老方法。Heroku过气了,没有人再使用它。现在你需要使用Docker。它是未来。


好的。Docker是啥东东?  

-Docker是实现容器化的一种方法。它就像LXC,但它又是一种包装格式、一种分发平台,以及让分布式系统非常容易的工具。


容器。那么,LXE又是什么?

-不是LXE,是LXC。它好比是增强版的chroot!


cher-oot又是啥东西?

-得了。Docker,容器化,它就是未来。它就像虚拟化,不过速度更快,成本更低。


哦,如此说来就像Vagrant。

-不。Vagrant过气了。现在一切都会容器化,容器是未来。


好吧,那么我就不需要对虚拟化有所了解了?

-不,你仍需要虚拟化,因为容器还根本无法提供一种全面的安全机制。所以,如果你想在多租户环境下运行任何东西,就需要确保你没有跑出沙盒。


好吧,我开始有点糊涂了。让我冷静一下。这么说,有一种技术类似虚拟化,名叫容器。我可以在Heroku上使用这种技术吗?

-嗯,Heroku对Docker提供一定的支持,但是我告诉你:Heroku过气了。你应该在CoreOS上运行容器。


好吧,CoreOS又是什么?

-CoreOS是一种很酷的主机操作系统,可与Docker结合使用。你甚至不需要Docker,就可以使用rkt。


Rocket?

――不是,是rkt。


没划,就叫Rocket。

-不,它现在叫rkt。完全不一样。它是一种替代的容器化格式,不像Docker那样完全捆绑起来,所以它更容易组合起来。


那很好吗?

-当然很好。可组合性是未来趋势。


好吧,你如何使用它?

-我不知道。恐怕没人能使用它。


唉。你可以继续说说CoreOS吗?

-好的,它是一种主机操作系统,可以与Docker结合使用。


主机操作系统又是啥?

-主机操作系统运行你的所有容器。


运行我的容器?

-是的,你要有东西来运行你的容器。所以,你构建了EC2实例之类的系统,把CoreOS放在上面,然后运行Docker守护程序,之后你就可以将Docker镜像部署到上面。


其中哪个部分是容器?

-全部。瞧,你拿来应用程序后,编写一个Dockerfile,在本地转换成镜像,然后可以把那个推送到任何Docker主机。


啊,就像Heroku那样?

-不,不是Heroku。我跟你说过了,Heroku过气了。现在你使用Docker来运行自己的云。


什么?

-没错,这确实很容易。查查#gifee。


Gify?

-“面向其他每个人的谷歌基础设施”。你可以拿来一些现成工具和堆栈,使用容器,就能拥有与谷歌一样的基础设施。


为什么我干脆不用谷歌的东西?

-你认为6个月后这会存在吗?


好吧,别人不托管这东西吗?我其实不想托管自己的东西。

-嗯,亚马逊有ECS,但是你得编写XML或一些内容。


放在OpenStack上如何?

-Ew。


Ew?

-Ew。


瞧,我其实不想托管自己的东西。

-不,它其实很容易。你只要搭建一个Kubernetes集群。


我需要一个集群?

-Kubernetes集群。它将管理你所有服务的部署。


我只有一个服务。

-你啥意思?你有一个应用程序,所以你至少要有8至12个服务?


什么?不,只有一个应用程序。为什么要那么多的服务?

-不,瞧瞧微服务。它是未来。它是我们现在开展一切的方式。你拿来整体式应用程序,把它分成比如12个服务。每个服务对应于你所做的每项任务。


这似乎太多了。

-这是确保它可靠的唯一方式。所以,如果你的验证服务出现了故障……


验证服务?我会使用之前用过几次的这个gem。

-很好。使用gem。把它放入到它自己的项目。在上面放一个充分利用REST的API。然后,你的其他服务就可以使用该API,可从容地处理故障之类的问题。把它放在容器中,不断提供该服务。


OK,那么现在我有了几十个无法管理的服务,现在该怎么办?

-是的,我提到了Kubernetes。它让你可以编排你的所有服务。


编排服务?

-没错,所以你拥有这些服务,它们必须很可靠,所以你需要多个副本。所以,Kubernetes确保你拥有足够的服务,确保它们分布在你集群(fleet)中的多个主机上,那样始终确保可用性。


现在我需要集群?

-是的,为了确保可靠性。但是Kubernetes可以为你管理它。你要知道Kubernetes切实可行,因为谷歌开发了它,它在etcd上运行。


etcd是什么东西?

-它是RAFT的实现。


OK,那么Raft又是什么?

――它就像Paxos。


Christ,我们谈论的话题怎么越来越绕啊?我就想启动一个应用程序。唉。真见鬼。好吧,Paxos又是什么鬼东西?

-Paxos好比是上世纪70年代的老式分布式共识协议,没有人懂得或使用这种协议。


很好,谢谢你告诉我这一点。那么,Raft是什么呢?

-因为没人懂得Paxos,于是名为Diego的家伙…


哦,你认识他?

-不认识,他在CoreOS工作。不管怎样,Diego在撰写博士论文时编写了Raft,因为Paxos太难了。这是个聪明绝顶的家伙。然后,他编写了etcd作为一种实现,Aphyr说这不是狗屎。


Aphyr又是谁啊?

-Aphyr就是写《Call Me Maybe》的那个人。你知道,分布式系统和BDSM家伙吗?


什么?你说BDSM?

-是的,BDSM。在旧金山,大家都在搞分布式系统和BDSM。


OK,他写过Katy Perry唱的那首歌曲吗?

-不,他写过关于每个数据库未通过CAP的一系列博文。


CAP是什么?

-CAP定理(CAP theorem)。该定理表示,在一致性(Consistency)、可用性(Availability)和分区容忍(Partition tolerance)这三个当中只能做到两个,不可能三者兼顾。


OK,所有数据库都未通过CAP?这到底意味着什么?

-这意味着它们都是狗屎。就像Mongo。


我以为Mongo是大规模级别呢?

-别人可不这么认为。


OK,那么etcd呢?

-哦,etcd是一种分布式键值存储系统。


哦,就像Redis。

-不,根本不像Redis。etcd是分布式。如果网络分区,Redis就会丢失一半的写入。


OK,它就是一种分布式键值存储系统。为什么这个很有用?

-Kubernetes使用etcd作为消息总线,构建了一个标准的5节点集群。它结合几个Kubernetes的自有服务,提供一种弹性相当强的编排系统。


5个节点?我有一个应用程序。如果使用这种配置,我到底需要多少个机器啊?

-嗯,你会有大约12个服务,当然每个服务你需要几个冗余副本,几个负载均衡系统,etcd集群、你的数据库还有kubernetes集群。所以那就像是50个运行中的容器。


什么玩意儿!

-没什么大不了!容器其实很高效,所以你应该能够在8台机器上分布这些容器!这不是很出色吗?


别的不多说了,我能够简单地部署我的应用程序吗?

-当然,我的意思是,存储仍是Docker和Kubernetes方面一个悬而未决的问题,网络方面需要一番工作,但是你基本上已大功告成了!


我明白了。OK,我认为我心里有点数了。

-很好!


谢谢解释。

-别客气。


让我重复一下,看看我是否搞明白了没有。


-当然可以!


所以,我就只要把那个简单的CRUD应用程序分成12个微服务,每个微服务都有各自的API,它们调用对方的API,但是处理故障具有弹性,把它们放入到Docker容器,启动8台机器组成的集群,它们其实是运行CoreOS的Docker主机,使用运行etcd的小小的Kubernetes集群对它们进行“编排”,搞清楚网络和存储方面“悬而未决的”问题,然后我可以不断向我的集群交付每个微服务的多个冗余副本。是不是这样?


-没错,是不是很酷?


我还是使用原来的Heroku。


相关阅读:

希特勒怒喷Docker


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存