Docker|什么是 Docker()

写在前面:放在两年前,你不认识Docker情有可原。但如果现在你还这么说,不好意思,我只能说你OUT了。你最好马上get起来,因为有可能你们公司很快就会引入Docker。今天就和大家讨论讨论这个备受好评的应用,让我们来揭开他的真面目!
尽管之前久闻Docker的大名了,但是天资愚钝,对其到底是个啥东西一直摸不清,最近花了一段时间整理了一下,算是整理出一点头绪来。
官网的介绍是这样的:
Docker is an open platform for developers and sysadmins to build, ship, and run distributed applications....
其实看完这句话还是不明白究竟是啥的,下面就慢慢解释。不过长话短说的话,把他想象成一个用了一种新颖方式实现的超轻量虚拟机,在大概效果上也是正确的。当然在实现的原理和应用上还是和VM有巨大差别的,并且专业的叫法是应用容器(Application Container)。
为啥要用容器?
那么应用容器长什么样子呢,一个做好的应用容器长得就好像一个装好了一组特定应用的虚拟机一样。比如我现在想用Mysql那我就找个装好Mysql的容器,运行起来,那么我就可以使用 Mysql 了。
那么我直接装个 Mysql 不就好了,何必还需要这个容器这么诡异的概念?话是这么说,可是你要真装Mysql的话可能要再装一堆依赖库,根据你的操作系统平台和版本进行设置,有时候还要从源代码编译报出一堆莫名其妙的错误,可不是这么好装。而且万一你机器挂了,所有的东西都要重新来,可能还要把配置在重新弄一遍。但是有了容器,你就相当于有了一个可以运行起来的虚拟机,只要你能运行容器,Mysql 的配置就全省了。而且一旦你想换台机器,直接把这个容器端起来,再放到另一个机器就好了。硬件,操作系统,运行环境什么的都不需要考虑了。
在公司中的一个很大的用途就是可以保证线下的开发环境、测试环境和线上的生产环境一致。当年在 Baidu 经常碰到这样的事情,开发把东西做好了给测试去测,一般会给一坨代码和一个介绍上线步骤的上线单。结果代码在测试机跑不起来,开发就跑来跑去看问题,一会儿啊这个配置文件忘了提交了,一会儿啊这个上线命令写错了。找到了一个 bug 提上去,开发一看,啊我怎么又忘了把这个命令写在上线单上了。类似的事情在上线的时候还会发生,变成啊你这个软件的版本和我机器上的不一样……在 Amazon 的时候,由于一个开发直接担任上述三个职位,而且有一套自动化部署的机制所以问题会少一点,但是上线的时候大家还是胆战心惊。
若果利用容器的话,那么开发直接在容器里开发,提测的时候把整个容器给测试,测好了把改动改在容器里再上线就好了。通过容器,整个开发、测试和生产环境可以保持高度的一致。
此外容器也和VM一样具有着一定的隔离性,各个容器之间的数据和内存空间相互隔离,可以保证一定的安全性。
那为啥不用VM?
那么既然容器和 VM 这么类似为啥不直接用 VM 还要整出个容器这么个概念来呢?Docker 容器相对于 VM 有以下几个优点:
启动速度快,容器通常在一秒内可以启动,而 VM 通常要更久
资源利用率高,一台普通 PC 可以跑上千个容器,你跑上千个 VM 试试
性能开销小, VM 通常需要额外的 CPU 和内存来完成 OS 的功能,这一部分占据了额外的资源
为啥相似的功能在性能上会有如此巨大的差距呢,其实这和他们的设计的理念是相关的。 VM 的设计图如下:

VM 的 Hypervisor 需要实现对硬件的虚拟化,并且还要搭载自己的操作系统,自然在启动速度和资源利用率以及性能上有比较大的开销。而 Docker 的设计图是这样的:

Docker 几乎就没有什么虚拟化的东西,并且直接复用了 Host 主机的 OS,在 Docker Engine 层面实现了调度和隔离重量一下子就降低了好几个档次。 Docker 的容器利用了 LXC,管理利用了 namespaces 来做权限的控制和隔离, cgroups 来进行资源的配置,并且还通过 aufs 来进一步提高文件系统的资源利用率。
其中的 aufs 是个很有意思的东西,是 UnionFS 的一种。他的思想和 git 有些类似,可以把对文件系统的改动当成一次 commit 一层层的叠加。这样的话多个容器之间就可以共享他们的文件系统层次,每个容器下面都是共享的文件系统层次,上面再是各自对文件系统改动的层次,这样的话极大的节省了对存储的需求,并且也能加速容器的启动。
下一步
有了前面的这些介绍,应该对 Docker 到底是啥有些了解了吧, Docker 是 用 Go 语言编写的,源代码托管在 github 而且居然只有 1W 行就完成了这些功能。如果想尝试一下的话可以看官方介绍了,应该上手会容易一些了。博主也是新手,如有错误欢迎拍砖指正。
Docker的应用详解:
Google、Amazon、Microsoft、VMware都纷纷加入Docker和Container所掀起的新时代云端虚拟化行列,很多人还不知道Docker和Container到底是什么,下面的9个Q&A让你快速了解这一切。


【一】从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版。Docker1.0下载地址Docker|什么是 Docker()
文章图片

2014年6月9日,1.0版本发布官方声明
1.0版本标志着Docker公司认为Docker平台已经足够成熟,并可以被应用到产品中(还提供了一些需要付费的支持选项)。
在这15个月中,Docker共收到了超过460位贡献者的8741条改进建议,Docker的用心经营下社区十分活跃。可以说,Docker的成功起于开源,发于社区。
2如何定义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|什么是 Docker()
文章图片

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
Docker中文手册上解释说:Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。
从这里我们可以看出,Docker并非是容器,而是管理容器的引擎。Docker为应用打包、部署的平台,而非单纯的虚拟化技术。
3Docker与虚拟化争锋 【三】Docker与虚拟化争锋
Docker|什么是 Docker()
文章图片

容器技术与传统虚拟机性能对比
谈到虚拟化,很多人又发问了。Docker和虚拟化有什么区别?Docker(或者说是容器)的出现是否会取代传统的虚拟化技术。
说起虚拟化,大家首先想到的必然是VM一类的虚机。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。
但在惜时如金的现在,这类虚机也面临着一定的问题,比如:启动时间太长,你有没有过在启动虚拟机后,点开其他页面继续操作,过了一分钟才回来的经历?还有虚拟镜像体积太大(一般都是几十GB)等问题。相比之下,Docker的镜像一般只有二三百兆。并且启动速度超快, Docker的启动时间为毫秒级。
还有一个最大的问题是价格问题,据StackEngine调查分析,有43.8%的企业使用Docker的原因是VMware太贵。
Docker|什么是 Docker()
文章图片

Docker与虚拟机建构对比
但是,传统的虚拟技术还不会被取代。Docker或者说容器技术和虚拟机并非简单的取舍关系。
目前,很多企业仍在使用虚拟机技术,原因很简单,他们需要一个高效,安全且高可用的构架。然而,刚刚面世两年的Docker还没有经历沙场考验,CaaS(Container as a Service,容器即服务)概念也是近两年才刚刚出现。无论是应用管理还是运行维护方面,Docker都还处于发展与完善阶段。
【四】Docker:我为什么与众不同
Solomon Hykes:成功的要素之一是在正确的时间做了正确的事,我们一直坚信这个理念。Docker就好比传统的货运集装箱,我们一直都在努力。我们努力让这个技术更加灵活,更容易使用。
站在未来的角度,Docker解决了三大现存问题。
Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。
俗话说:天下武学唯快不破;在更新迭代如此之快的IT领域更是如此。所有成功的IT公司都必须走在时代的前列,他们的产品应该来自未来。他们有必要要站在未来的角度解决现存的问题。
Docker|什么是 Docker()
文章图片

Docker之父Solomon Hykes:Docker就好比传统的货运集装箱
Solomon Hykes曾经说过,自己在开发dotCloud的PaaS云时,就发现一个让人头痛的问题:应用开发工程师和系统工程师两者之间无法轻松协作发布产品。Docker解决了难题。让开发者能专心写好程序;让系统工程师专注在应用的水平扩展、稳定发布的解决方案上。
4Docker解决了三大现存问题 1、简化程序:Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。
Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是Docker的最大优势,过去需要用数天乃至数周的任务,在Docker容器的处理下,只需要数秒就能完成。
【Docker|什么是 Docker()】2、避免选择恐惧症:如果你有选择恐惧症,还是资深患者。Docker帮你打包你的纠结!比如Docker镜像;Docker镜像中包含了运行环境和配置,所以Docker可以简化部署多种应用实例工作。比如Web应用、后台应用、数据库应用、大数据应用比如Hadoop集群、消息队列等等都可以打包成一个镜像部署。
3、节省开支:一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker改变了高性能必然高价格的思维定势。Docker与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
另一方面,Docker能够是自愿额达到充分利用。举个简单地例子:凌晨三点的时候只有很少的人会去访问你的网站,同时你需要比较多的资源执行夜间的批处理任务,通过Docker可以很简单的便实现资源的交换。
Docker的这些优势,让各大IT巨头纷纷对Docker看好。
【五】统一标准,建立更有活力的生态系统
Docker|什么是 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的安全性究竟如何?
Docker|什么是 Docker()
文章图片

Gartner:Docker还是一项年轻的技术,它的安全性仍不够成熟
2015年1月,Gartner分析师Joerg Fritsch发布一份报告,报告显示:虽然Docker这款容器化工具已经颇具名声,但Docker的安全性仍不够成熟。
Joerg Fritsch指出:"Docker与容器技术目前还无法通过虚拟机管理程序弥合自身最为严重的两大短板:安全性保障与管理功能,外加在常见控制机制的机密性、完整性与可用性方面提供支持。"
总体来讲,Docker的安全性能还不错,只是这还是一项年轻的技术、因此目前尚未积累起能够满足实际生产需求的完整工具生态系统。
5Docker安全鉴定三方面 其实如果要谈论Docker的安全性,我们就要谈论三点:命名空间(Namespace);Docker程序本身的抗攻击性和加固内核安全性来影响容器的安全性。
Docker|什么是 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()
文章图片

Docker"集装箱"
6评说Docker 【七】评说Docker
Solomon Hykes(Docker之父):"建立一个为所有生产软件共有的系统,使用一种被广泛接受的方式,让它可以很好的运行和扩展,让它可以被所有人依赖,然后将它视为理所当然的存在,并使用它创造自己的奇迹,这是个挑战。
Docker|什么是 Docker()
文章图片

评说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这个应用。
PS:贴上一些Docker基本命令
Docker ps用来查看正在运行中的容器。
Docker ps命令的常用参数(及组合)如下。
-a: 查看所有容器,包括已经停止运行的。
-l: 查看刚刚启动的容器。
-q: 只显示容器ID
-l -q: 则可以返回刚启动的容器ID。
Docker stop用来停止运行中的容器,同时你还可以用Docker start来重新启动一个已经停止的容器。
Docker restart可以重启一个运行中的容器。这就相当于对一个容器先进行stop再start。
Docker|什么是 Docker()
文章图片

Docker内部人员:在Docker 1.0正式发布之前,就已经有3家主要银行将其投入到生产应用中

7常用Docker命令 Docker服务对应的版本查看
# sudo Docker version
Docker命令帮助
#sudo Docker//查看Docker的所有命令
#sudo Docker command --help//查看单个Docker命令的帮助,如Docker run --help
Docker|什么是 Docker()
文章图片


Docker|什么是 Docker()
文章图片


Docker|什么是 Docker()
文章图片

常用Docker命令


8Docker最新版(1.8)下载地址 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/
Linux安装方式:http://docs.Docker.com/linux/started/
Windows安装方式:http://docs.Docker.com/windows/started/





    推荐阅读