时光流水 2015-08-27
一、从dotCloud到Docker--低调奢华有内涵
1、追根溯源:dotCloud
时间倒回到两年前,有一个名不见经传的小公司,他的名字叫做:dotCloud。dotCloud公司主要提供的是基于 PaaS(Platform as a Service,平台及服务)平台为开发者或开发商提供技术服务,并提供的开发工具和技术框架。
初创企业总是艰难的,dotCloud也是一样。在IBM,亚马逊,谷歌等大公司的挤压下,dotCloud举步维艰。即使2011年拿到了1000万美元的融资,可和上述大公司比起来,也不过是杯水车薪。
随着开源的洪流袭来,在2013年dotCloud 的创始人,28岁的Solomon Hykes做了一个艰难的决定:将dotCloud的核心引擎开源!然而一旦这个基于 LXC(Linux Container)技术的核心管理引擎开源,dotCloud公司就相当于走上了一条"不归路"。
可正是这个孤注一掷的举动,却带来了全球技术人员的热潮,众程序员惊呼:太方便了,太方便了。也正是这个决定,让所有的IT巨头也为之一颤。一个新的公司也随之出世,它就是:Docker。
2、Docker出世:从Docker0.1到Docker1.0
一个春秋,跨越了Docker的成名路。
在互联网时代,一夜成名早已不是什么新闻。Docker 这个技术公司,向我们证明了,成为一个"国际巨星",只需要一个月。2013年2月决定开源,到2013年3月20日发布Docker0.1,只用了一个月的时间。
今后几乎每个一个月,Docker都会发布一个版本。而Docker0.1的发布像是一个宣言,昭示着一个Docker正在以一个新兴容器领导者的姿态迈进。
正如我们所知,从Docker0.1到Docker1.0,15个月的时间,Docker迅速成长。在2014年6月9日,Docker团队宣布发布Docker 1.0版。
2014年6月9日,1.0版本发布官方声明
1.0版本标志着Docker公司认为Docker平台已经足够成熟,并可以被应用到产品中(还提供了一些需要付费的支持选项)。
在这15个月中,Docker共收到了超过460位贡献者的8741条改进建议,Docker的用心经营下社区十分活跃。可以说,Docker的成功起于开源,发于社区。
一年的时间,使一个围绕着Docker的小型初创企业生态体系逐渐形成。Docker先后赢得了Google、微软、Amazon、VMware等巨头的青睐,巨头们纷纷示意将保证自己平台与Docker容器技术的兼容性。微软还宣布来要推出面向Windows的Docker客户端。
到了2014年9月,Docker完成4000万美元的C轮融资,彼时市值与约为4亿美元。可以说Docker一路风生水起,迅速赢得了IT圈的信赖。并且在8月12Docker发布了Docker1.8正式版(下载地址见末尾)。
但Docker是如何做到这些的呢?Docker的成功之路能否被复制呢?
二、如何定义Docker?
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。
Docker是一个重新定义了程序开发测试、交付和部署过程的开放平台,Docker则可以称为构建一次,到处运行,这就是Docker提出的"Build once,Run anywhere"
Docker:Build once,Run anywhere
为了更好的认识Docker,我们先来了解几个必备词汇:镜像,容器和仓库。
1、镜像(image):Docker 镜像就是一个只读的模板,镜像可以用来创建 Docker 容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
镜像是一种文件结构。Dockerfile中的每条命令都会在文件系统中创建一个新的层次结构,文件系统在这些层次上构建起来,镜像就构建于这些联合的文件系统之上。
Docker官方网站专门有一个页面来存储所有可用的镜像,网址是:index.docker.io。
2、容器( Container):容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境,Docker 利用容器来运行应用。
3、仓库:仓库是集中存放镜像文件的场所,仓库注册服务器(Registry)上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。目前,最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。
Docker仓库用来保存我们的images,当我们创建了自己的image之后我们就可以使用push命令将它上传到公有或者私有仓库,这样下次要在另外一台机器上使用这个image时候,只需要从仓库上pull下来就可以了。
Docker的运行离不开这几位的支持,Docker的成功也是拜几位所赐。也有人会误以为,Docker就是容器。但Docker只会傲娇地说:我不是容器,我是管理容器的引擎。
什么是Docker?
Docker中文手册上解释说:Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。
从这里我们可以看出,Docker并非是容器,而是管理容器的引擎。Docker为应用打包、部署的平台,而非单纯的虚拟化技术。
三、Docker与虚拟化争锋
容器技术与传统虚拟机性能对比
谈到虚拟化,很多人又发问了。Docker和虚拟化有什么区别?Docker(或者说是容器)的出现是否会取代传统的虚拟化技术。
说起虚拟化,大家首先想到的必然是VM一类的虚机。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。
但在惜时如金的现在,这类虚机也面临着一定的问题,比如:启动时间太长,你有没有过在启动虚拟机后,点开其他页面继续操作,过了一分钟才回来的经历?还有虚拟镜像体积太大(一般都是几十GB)等问题。相比之下,Docker的镜像一般只有二三百兆。并且启动速度超快, Docker的启动时间为毫秒级。
还有一个最大的问题是价格问题,据StackEngine调查分析,有43.8%的企业使用Docker的原因是VMware太贵。
Docker与虚拟机建构对比
但是,传统的虚拟技术还不会被取代。Docker或者说容器技术和虚拟机并非简单的取舍关系。
目前,很多企业仍在使用虚拟机技术,原因很简单,他们需要一个高效,安全且高可用的构架。然而,刚刚面世两年的Docker还没有经历沙场考验,CaaS(Container as a Service,容器即服务)概念也是近两年才刚刚出现。无论是应用管理还是运行维护方面,Docker都还处于发展与完善阶段。
四、Docker:我为什么与众不同
Solomon Hykes:成功的要素之一是在正确的时间做了正确的事,我们一直坚信这个理念。Docker就好比传统的货运集装箱,我们一直都在努力。我们努力让这个技术更加灵活,更容易使用。
站在未来的角度,Docker解决了三大现存问题。
Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。
俗话说:天下武学,唯快不破;在更新迭代如此之快的IT更是如此。所有成功的IT公司都必须走在时代的前列,他们的产品应该来自未来。他们有必要要站在未来的角度解决现存的问题。
Docker之父Solomon Hykes:Docker就好比传统的货运集装箱
Solomon Hykes曾经说过,自己在开发dotCloud的PaaS云时,就发现一个让人头痛的问题:应用开发工程师和系统工程师两者之间无法轻松协作发布产品。Docker解决了难题。让开发者能专心写好程序;让系统工程师专注在应用的水平扩展、稳定发布的解决方案上。
1、简化程序:Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。
Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是Docker的最大优势,过去需要用数天乃至数周的任务,在Docker容器的处理下,只需要数秒就能完成。
2、避免选择恐惧症:如果你有选择恐惧症,还是资深患者。Docker帮你打包你的纠结!比如Docker镜像;Docker镜像中包含了运行环境和配置,所以Docker可以简化部署多种应用实例工作。比如Web应用、后台应用、数据库应用、大数据应用比如 Hadoop集群、消息队列等等都可以打包成一个镜像部署。
3、节省开支:一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker改变了高性能必然高价格的思维定势。Docker与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
另一方面,Docker能够是自愿额达到充分利用。举个简单地例子:凌晨三点的时候只有很少的人会去访问你的网站,同时你需要比较多的资源执行夜间的批处理任务,通过Docker可以很简单的便实现资源的交换。
Docker的这些优势,让各大IT巨头纷纷对Docker看好。
五、统一标准,建立更有活力的生态系统
开放容器技术项目(Open Container Project)
在2015年的DockerCon上推出了开放容器技术项目(Open Container Project)。OCP是一个非营利性组织,其受特许建立通用的容器软件技术标准。
这个项目汇集了微软、谷歌、惠普、IBM、英特尔、红帽(Red Hat)、VMware以及高盛等众多实力企业,OCP的推出,也使宿敌Docker和CoreOS走向了联合。让微软与自己的竞争对手Linux合作,足以见得Docker的魅力。
谷歌云计算平台产品经理克雷格·麦克拉克伊(Craig Mcluckie)说:创建通用容器格式非常重要,单一标准可以促进更有活力的生态系统。
六、企业对Docker是否认可?安全是关键!
随着容器技术逐渐得到IT界的认可,CaaS(Container as a Service,容器即服务)也逐渐形成。而Docker作为CaaS技术的标杆是否已经得到企业的认可?是否投入生产呢?
2015年,VMblog.com和CloudCow.com共同组织了一次问卷调查。报告显示,Docker的早期用户中,63%的用于 QA/Test,53%的用于开发,并且31%的用户计划在生产环境中使用Docker,阻碍企业使用Docker的最大因素在于其安全性以及缺少生产环境下的运维工具(两个原因各占49%左右)。
对Docker应用最广泛的三个领域分别是:Test/QA应用;Web应用;大数据,企业应用。
调查显示,目前企业对Docker的接受程度在不断提高。但Docker的安全性似乎仍旧是企业顾虑的主要原因,那么Docker的安全性究竟如何?
Gartner:Docker还是一项年轻的技术,它的安全性仍不够成熟
2015年1月,Gartner分析师Joerg Fritsch发布一份报告,报告显示:虽然Docker这款容器化工具已经颇具名声,但Docker的安全性仍不够成熟。
Joerg Fritsch指出:"Docker与容器技术目前还无法通过虚拟机管理程序弥合自身最为严重的两大短板:安全性保障与管理功能,外加在常见控制机制的机密性、完整性与可用性方面提供支持。"
总体来讲,Docker的安全性能还不错,只是这还是一项年轻的技术、因此目前尚未积累起能够满足实际生产需求的完整工具生态系统。
其实如果要谈论Docker的安全性,我们就要谈论三点:命名空间(Namespace);Docker程序本身的抗攻击性和加固内核安全性来影响容器的安全性。
企业对Docker是否认可?安全是关键!
1、命名空间(Namespace):Docker有五个命名空间:进程、网络、挂载、宿主和共享内存,为了隔离有问题的应用,Docker运用Namespace将进程隔离,为进程或进程组创建已隔离的运行空间,为进程提供不同的命名空间视图。这样,每一个隔离出来的进程组,对外就表现为一个container(容器)。需要注意的是,Docker让用户误以为自己占据了全部资源,但这并不是"虚拟机"。
内核namesapce从内核2.6.15之后被引入,距今已经5年了,在很多大型生产系统中被验证。他们的设计和灵感提出的时间更早,openvz项目利用namespace重新封装他们的内核,并合并到主流内核中。openvz最早的版本是2005年的,所以他们的设计和实现都很成熟。
2、Docker程序本身的抗攻击性:Docker允许你在主机和容器之间共享文件夹,这就容易让容器突破资源限制,那么容器就可以对主机做任何更改了。但实际上,几乎所有虚拟机系统都有在物理主机和虚拟机之间共享资源的限制,所以这一层的安全性,需要你自己把控。
3、加固内核安全性:默认情况下,Docker启动的容器只使用一部分内核capabilities,就算攻击者在容器中取得了root权限,他能做的破坏也少了,也不能获得主机的更高权限。
由此我们可以说:Docker还是比较安全的,但是你要注意使用在容器中使用非root权限允许进程。
目前来说,Docker的主要应用场景为:
面向开发人员:快速开发、交付应用程序。开发环境的机器通常内存比较小,之前使用虚拟的时候,经常需要为开发环境的机器加内存,而现在Docker可以轻易的让几十个服务在Docker中跑起来。
面向运维人员:降低运维成本。正如通过虚拟机来整合多个应用,Docker隔离应用的能力使得Docker可以整合多个服务器以降低成本。Docker通过镜像机制,将你的代码和运行环境直接打包成镜像,扔到容器启动即可。
面向企业:Docker本身就发家于PaaS,在Docker面向企业,是可以提供Paas层的实现;比如,扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
Docker"集装箱"
七、评说Docker
Solomon Hykes(Docker之父):"建立一个为所有生产软件共有的系统,使用一种被广泛接受的方式,让它可以很好的运行和扩展,让它可以被所有人依赖,然后将它视为理所当然的存在,并使用它创造自己的奇迹,这是个挑战。
Chris Swan (银行业的技术专家,曾经有十几年的时间在从事金融服务业):Docker公司已经建立了清晰的道路,即发展核心能力(libcontainer)、跨业务管理(libswarm)和容器间消息(libchan)。
Docker公司表达了利用自身生态系统的意愿。随着时间的推移,虚拟机和容器(Docker中的"运行"部分)之间的区别很可能变得不再那么重要,这将使注意力转到"构建(build)"和"交付(ship)"方面。
马全一(Docker中文社区创始人之一):Docker一定会成为云计算和大数据领域的重要成员之一。
Docker的出现使得以Docker容器为单位的云平台和Docker容器为载体的交易平台成为可能。任何后端的服务程序,都可以封装在 Docker容器中进行销售、分发和部署,后端开发者能像Mobile App开发者那样去做自己的产品来获利。随着Golang的发展,一定会有以 Golang为开发语言、Docker为运行载体的新大数据平台,成为Hadoop平台的竞争者。
Docker,一个迅速走红,并在技术领域赢得一片好评的一款应用。尽管Docker目前还不够完善,但已经有很多厂商已经开始使用。同时一批围绕 Docker建立起来的初创企业已经形成,学习Docker风气正盛。可以预见在不远的未来,Docker和CaaS会获得更多的人肯定,越来越多的企业愿意使用Docker这个应用。
Docker内部人员:在Docker 1.0正式发布之前,就已经有3家主要银行将其投入到生产应用中
PS:贴上一些Docker基本命令
Docker ps用来查看正在运行中的容器。
Docker ps命令的常用参数(及组合)如下。
-a: 查看所有容器,包括已经停止运行的。
-l: 查看刚刚启动的容器。
-q: 只显示容器ID
-l -q: 则可以返回刚启动的容器ID。
Docker stop用来停止运行中的容器,同时你还可以用Docker start来重新启动一个已经停止的容器。
Docker restart可以重启一个运行中的容器。这就相当于对一个容器先进行stop再start。
Docker服务对应的版本查看
# sudo Docker version
Docker命令帮助
#sudo Docker //查看Docker的所有命令
#sudo Docker command --help //查看单个Docker命令的帮助,如Docker ru --help
常用Docker命令
Docker最新版(1.8)下载地址:
Ubuntu/Debian: curl -sSL https://get.Docker.com | sh
Linux 64bit binary:
https://get.Docker.com/builds/Linux/x86_64/Docker-1.8.0
Darwin/OSX 64bit client binary:
https://get.Docker.com/builds/Darwin/x86_64/Docker-1.8.0
Darwin/OSX 32bit client binary:
https://get.Docker.com/builds/Darwin/i386/Docker-1.8.0
Linux 64bit tgz:
https://get.Docker.com/builds/Linux/x86_64/Docker-1.8.0.tgz
Windows 64bit client binary:
https://get.Docker.com/builds/Windows/x86_64/Docker-1.8.0.exe
Windows 32bit client binary:
https://get.Docker.com/builds/Windows/i386/Docker-1.8.0.exe
相关网站链接:Docker官网:https://www.Docker.com/
Mac安装方式:http://docs.Docker.com/mac/started/