45 个回答
在我们的平台上,一台 16 核 32G 内存的虚拟机上,需要跑 500+ 个用户的应用(每个应用的功能可以认为是一个网站 + 一系列的 RESTful API),有两个事情很重要:
- 资源隔离:比如限制应用最大内存使用量,或者资源加载隔离等。
- 低消耗:虚拟化本身带来的损耗需要尽量的低。
我们不可能在一台机器上开 500 个虚拟机,虽然可以在资源隔离方面做的很好,但这种虚拟化本身带来的资源消耗太严重。
另一个方面,我们可以考虑使用语言级别沙箱,虽然这种「虚拟化」本身的消耗可以低到忽略不计,但是资源隔离方面绝对是噩梦,比如你打算在一个 JVM 里隔离内存的使用。
而 Docker 很好的权衡了两者,即拥有不错的资源隔离能力,又有很低的虚拟化开销。
2.14下半年到15年初,docker的价值被更大化,应用的运行,服务的托管,外界的接受度也变高,国内也出现了一些startup公司,比如DaoCloud( http://www.daocloud.io),云雀( http://www.alauda.cn)等。但这些仅仅是这些公司的第一步,后续紧跟的更多的是基于代码与镜像之间的CI/CD,缩减开发测试发布的流程,这方面的实践逐渐成熟。
3.微服务架构的兴起。微服务会对现阶段的软件架构有一些冲击,同样也是软件系统设计方法论的内容。这些方面国外讨论的药多一些,相信这一点也会近年来多家公司发力的地方
1. 简化配置
这是Docker公司宣传的Docker的主要使用场景。虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件、系统),Docker在降低额外开销的情况下提供了同样的功能。它能让你将运行环境和配置放在代码中然后部署,同一个Docker的配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度。
2. 代码流水线(Code Pipeline)管理
前一个场景对于管理代码的流水线起到了很大的帮助。代码从开发者的机器到最终在生产环境上的部署,需要经过很多的中间环境。而每一个中间环境都有自己微小的差别,Docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少。
3. 提高开发效率
这就带来了一些额外的好处:Docker能提升开发者的开发效率。如果你想看一个详细一点的例子,可以参考Aater在 DevOpsDays Austin 2014 大会或者是DockerCon上的演讲。
不同的开发环境中,我们都想把两件事做好。一是我们想让开发环境尽量贴近生产环境,二是我们想快速搭建开发环境。
理想状态中,要达到第一个目标,我们需要将每一个服务都跑在独立的虚拟机中以便监控生产环境中服务的运行状态。然而,我们却不想每次都需要网络连接,每次重新编译的时候远程连接上去特别麻烦。这就是Docker做的特别好的地方,开发环境的机器通常内存比较小,之前使用虚拟的时候,我们经常需要为开发环境的机器加内存,而现在Docker可以轻易的让几十个服务在Docker中跑起来。
4. 隔离应用
有很多种原因会让你选择在一个机器上运行不同的应用,比如之前提到的提高开发效率的场景等。
我们经常需要考虑两点,一是因为要降低成本而进行服务器整合,二是将一个整体式的应用拆分成松耦合的单个服务(译者注:微服务架构)。如果你想了解为什么松耦合的应用这么重要,请参考Steve Yege的 这篇论文,文中将Google和亚马逊做了比较。
5. 整合服务器
正如通过虚拟机来整合多个应用,Docker隔离应用的能力使得Docker可以整合多个服务器以降低成本。由于没有多个操作系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker可以比虚拟机提供更好的服务器整合解决方案。
6. 调试能力Docker
提供了很多的工具,这些工具不一定只是针对容器,但是却适用于容器。它们提供了很多的功能,包括可以为容器设置检查点、设置版本和查看两个容器之间的差别,这些特性可以帮助调试Bug。你可以在 《Docker拯救世界》的文章中找到这一点的例证。
7. 多租户环境
另外一个Docker有意思的使用场景是在多租户的应用中,它可以避免关键应用的重写。我们一个特别的关于这个场景的例子是为IoT(译者注:物联网)的应用开发一个快速、易用的多租户环境。这种多租户的基本代码非常复杂,很难处理,重新规划这样一个应用不但消耗时间,也浪费金钱。
使用Docker,可以为每一个租户的应用层的多个实例创建隔离的环境,这不仅简单而且成本低廉,当然这一切得益于Docker环境的启动速度和其高效的diff命令。
你可以在 这里了解关于此场景的更多信息。
8. 快速部署
在虚拟机之前,引入新的硬件资源需要消耗几天的时间。Docker的虚拟化技术将这个时间降到了几分钟,Docker只是创建一个容器进程而无需启动操作系统,这个过程只需要秒级的时间。这正是Google和Facebook都看重的特性。
你可以在数据中心创建销毁资源而无需担心重新启动带来的开销。通常数据中心的资源利用率只有30%,通过使用Docker并进行有效的资源分配可以提高资源的利用率。
flynn和deis是基础Docker实现的开源PaaS,相比CloudFoundry更小、更轻。
Docker依赖Linux LXC技术,轻量容器概念,其上实际运行的程序是在宿主机上的,本身不是完整的程序系统,也正是其特别之处。
---------------------------------------------------------
根据Docker布道师Jerome Petazzoni的说法,Docker约等于LXC+AUFS(之前只支持ubuntu时)。其中LXC负责资源管理,AUFS负责镜像管理;而LXC又包括cgroup、namespace、chroot等组件,并通过cgroup进行资源管理。所以只从资源管理这条线来看的话,Docker、LXC、CGroup三者的关系是:cgroup在最底层落实资源管理,LXC在cgroup上封装了一层,Docker又在LXC封装了一层。
Docker是Linux下应用容器引擎,提供一种比LXC高级的API。Docker使用Go语言开发,利用了Linux提供的LXC,AUFS,namespace和cgroup技术。实现了文件系统,资源和网络的隔离,最终目标实现类似PaaS平台的应用隔离。
LXC——Linux容器工具,容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心 CPU 本地运行指令,而不需要任何专门的解释机制。此外,也避免了准虚拟化(paravirtualization)和系统调用替换中的复杂性。
容器在提供隔离的同时,还通过共享这些资源节省开销,这意味着容器比真正的虚拟化的开销要小得多。
我们都知道Linux有一个进程号为1,名字为init的进程,系统服务的父进程都是init进程。
Docker容器中进程号为1的进程是bash,而不是init,一个运行的Linux竟然没有init进程,简直太不思议了。这其实得益于强大的Linux提供的LXC功能。宿主机器中运行的docker服务就是该容器中ubuntu系统的init进程。其实每个运行的容器仅仅是宿主机器中运行的一个进程而已,在容器中运行的任何程序其实也是运行在宿主机器中的一个进程。Docker通过cgroup将属于每个容器的进程分为一组进行资源(内存,cpu,网络,硬盘)控制;通过namespace将属于同一个容器的进程划分为一组,使分属于同一个容器的进程拥有独立的进程名字和独立分配的进程号,比如宿主机器存在一个进程号为1的进程,容器中也存在一个进程号为1的进程。
如果对同一台服务上的少数应用需要控制资源的直接使用 cgroup 是较好的选择,可以按用户或用户组控制系统资源。如果服务需要指出多种环境,那么 Docker 就是最好的。
补充(20140625):
With the release of version 0.9 Docker.io have dropped LXC as the default execution environment, replacing it with their own libcontainer.
In other words, as of Docker 0.9, LXC is now optional.
by: Docker drops LXC as default execution environment
感谢 @Honglin Feng 提醒。
可以参考一下我写的blog: Containerize your database volume with Tutum MySQL Images
另外我们有在做公有云的docker hosting, 上面有很多已经做好的Image(叫jumpstart),直接使用即可。你可以注册一个帐号( http://tutum.co),对个人用户完全免费,让你体验一下docker的魅力,相信会使你对docker的应用场景有进一步的了解 :P
docker是基于容器层面的调度,可以理解为一种更加轻量的虚拟机,即能够更好的满足快速部署和资源调度的性能速度,又能够满足资源直接的隔离。
举个例子比如我要设置mips的编译环境,而我宿主机是debian.有些优秀的工具只存在于gentoo平台,而gentoo又不好安装,我们使用docker只要从docker hub上面pull下镜像,就可以完美使用,这使得开发人员效率最大化。
![](https://i-blog.csdnimg.cn/blog_migrate/23fbf6a7bc94eb4bbe186fcbc5958f22.jpeg)
特点是在一个物理机的OS里能同时 虚拟 巨多个本OS的运行环境(要求应用本身占的资源(主要是内存)不多)
所以,它最适合 有 大量 小型(资源要求低、负荷也低)但需要互相隔离的应用 的单位
比 每个应用都采用独立物理机省,比 每个应用都采用独立虚拟机也省
![](https://i-blog.csdnimg.cn/blog_migrate/c701dba5f3d5c348e1ee571f04ea76aa.jpeg)
我们现在基于 docker 做的 engine 比较类似于 google 的 borg,纯粹的 PaaS 对我来讲已经没有难度了……怎么样通过一个平台满足 SOA 大数据 算法等各类需求正是我们目前要解决的。
1、开发环境,内部共享一个运行时环境,随便分享
2、隔离,安全,并且充分利用资源
3、部署方式和服务交付方式的变革,直接给运维界带来颠覆性影响
![](https://i-blog.csdnimg.cn/blog_migrate/20e148c94901926220fb18f237f48056.png)
我们在Trulia Data Science Team 里面推行了Docker。一方面是搭建API做SOA,另一方面也在帮助每一个Data Scientist 都可以直接从最开始算法分析、开发一直做到部署,而不需要其他的Engineer帮助,加快迭代速度。
----
陈然_Ran的微博
可以参考我的一篇blog: Dev with Vagrant and Docker « 悟道集