5分钟弄懂Docker

尽管以前久闻Docker的大名了,可是天资愚钝,对其究竟是个啥东西一直摸不清,最近花了一段时间整理了一下,算是整理出一点头绪来。linux

官网的介绍是这样的:git

Docker is an open platform for developers and sysadmins to build, ship, and run distributed applications....

其实看完这句话仍是不明白到底是啥的,下面就慢慢解释。不过长话短说的话,把他想象成一个用了一种新颖方式实现的超轻量虚拟机,在大概效果上也是正确的。固然在实现的原理和应用上仍是和VM有巨大差异的,而且专业的叫法是应用容器(Application Container)。github

 

为啥要用容器?

 

那么应用容器长什么样子呢,一个作好的应用容器长得就好像一个装好了一组特定应用的虚拟机同样。好比我如今想用MySQL那我就找个装好MySQL的容器,运行起来,那么我就可使用 MySQL了。docker

那么我直接装个 MySQL不就行了,何须还须要这个容器这么诡异的概念?话是这么说,但是你要真装MySQL的话可能要再装一堆依赖库,根据你的操做系统平台和版本进行设置,有时候还要从源代码编译报出一堆莫名其妙的错误,可不是这么好装。并且万一你机器挂了,全部的东西都要从新来,可能还要把配置在从新弄一遍。可是有了容器,你就至关于有了一个能够运行起来的虚拟机,只要你能运行容器,MySQL的配置就全省了。并且一旦你想换台机器,直接把这个容器端起来,再放到另外一个机器就行了。硬件,操做系统,运行环境什么的都不须要考虑了。安全

在公司中的一个很大的用途就是能够保证线下的开发环境、测试环境和线上的生产环境一致。当年在 Baidu 常常碰到这样的事情,开发把东西作好了给测试去测,通常会给一坨代码和一个介绍上线步骤的上线单。结果代码在测试机跑不起来,开发就跑来跑去看问题,一下子啊这个配置文件忘了提交了,一下子啊这个上线命令写错了。找到了一个 bug 提上去,开发一看,啊我怎么又忘了把这个命令写在上线单上了。相似的事情在上线的时候还会发生,变成啊你这个软件的版本和我机器上的不同……在 Amazon 的时候,因为一个开发直接担任上述三个职位,并且有一套自动化部署的机制因此问题会少一点,可是上线的时候你们仍是胆战心惊。app

若果利用容器的话,那么开发直接在容器里开发,提测的时候把整个容器给测试,测好了把改动改在容器里再上线就行了。经过容器,整个开发、测试和生产环境能够保持高度的一致。性能

此外容器也和VM同样具备着必定的隔离性,各个容器之间的数据和内存空间相互隔离,能够保证必定的安全性。测试

 

 

那为啥不用VM?

那么既然容器和 VM 这么相似为啥不直接用 VM 还要整出个容器这么个概念来呢?Docker 容器相对于 VM 有如下几个优势:ui

  • 启动速度快,容器一般在一秒内能够启动,而 VM 一般要更久
  • 资源利用率高,一台普通 PC 能够跑上千个容器,你跑上千个 VM 试试
  • 性能开销小, VM 一般须要额外的 CPU 和内存来完成 OS 的功能,这一部分占据了额外的资源spa

为啥类似的功能在性能上会有如此巨大的差距呢,其实这和他们的设计的理念是相关的。 VM 的设计图以下:

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

 

 

Docker 几乎就没有什么虚拟化的东西,而且直接复用了 Host 主机的 OS,在 Docker Engine 层面实现了调度和隔离重量一会儿就下降了好几个档次。 Docker 的容器利用了  LXC,管理利用了 namespaces 来作权限的控制和隔离,  cgroups 来进行资源的配置,而且还经过  aufs 来进一步提升文件系统的资源利用率。

其中的 aufs 是个颇有意思的东西,是  UnionFS 的一种。他的思想和 git 有些相似,能够把对文件系统的改动当成一次 commit 一层层的叠加。这样的话多个容器之间就能够共享他们的文件系统层次,每一个容器下面都是共享的文件系统层次,上面再是各自对文件系统改动的层次,这样的话极大的节省了对存储的需求,而且也能加速容器的启动。

下一步

有了前面的这些介绍,应该对 Docker 究竟是啥有些了解了吧, Docker 是 用 Go 语言编写的,源代码托管在 github 并且竟然只有 1W 行就完成了这些功能。若是想尝试一下的话能够看 官方介绍了,应该上手会容易一些了。博主也是新手,若有错误欢迎拍砖指正。

 

http://www.csdn.net/article/2014-07-02/2820497-what's-docker