Docker与容器快速入门

Docker之风席卷全球,但不少人以为docker入门确实不太容易,其缘由在于不少知识点上没准备好,在docker解决了什么问题、怎么解决的、用什么技术解决的都还没想清楚的时候就去探索docker组件原理,天然会犯迷糊,与其迷茫地步履维艰,不如先看看知识准备,入门了继续进行研究。 
Docker是一种在Linux容器里运行应用的开源工具,一种轻量级的虚拟机。除了运行应用,Docker还提供了一些工具,借助Docker Index或本身托管的Docker注册表对进行了集装箱化处理的应用进行分发,从而简化复杂应用的部署过程。 
本文将介绍现在在部署复杂系统时公司所面临的挑战,Docker怎样有效地解决这个问题,在宏观上对docker项目进行介绍,并发表一些本身理解的见解。以后的文章会慢慢深刻,对docker模块逐个剖析。html

0x01 什么是容器

容器指用来包装或装载物品的贮存器(如箱、罐、坛)或者成形或柔软不成形的包覆材料。在web环境中,容器是应用服务器中位于组件和平台之间的接口集合。在docker级别,容器能够理解为一个边界,边界里面是所想运行的各类程序,边界外面是基础环境,边界里外尽可能少的耦合。 
这里写图片描述nginx

0x02 容器的做用

服务器应用的部署已经愈来愈复杂了。把几个Perl脚本拷贝到正确目录就完成服务器应用的安装,这种时代已经一去不复返了。现在的软件有不少类型的需求: 
对已安装软件和库的依赖(“Python版本高于2.6.3,使用Django 1.2”) 
依赖于正在运行的服务(“须要一个MySQL 5.5数据库和一个RabbitMQ队列”) 
依赖于特定的操做系统(“在64位的Ubuntu Linux 12.04上构建、测试”) 
资源需求: 
最小的可用内存(“须要1GB的可用内存”) 
能绑定特定的端口(“绑定80和443端口”) 
咱们来看一个相对简单的应用的部署:Wordpress。Wordpress的安装一般要求: 
这里写图片描述web

在服务器上部署、运行这样一个系统,咱们可能会遇到下面的问题和挑战: 
隔离性:若是咱们已经在这个服务器上部署了不一样的网站,已有的网站只能在nginx上 运行,而Wordpress依赖于Apache,这时咱们就会有麻烦:它们都监听80端口。同时运行两个网站是能够的,但须要调整配置(修改监听端口), 设置反向代理等。库级别也会出现相似的冲突,若是还要运行一个仍然依赖PHP4的老应用就会出问题,由于Wordpress再也不支持PHP4,同时运行 PHP4和PHP5则很是困难。运行在同一个服务器上的应用没有互相隔离(在文件系统级别和网络级别),因此它们可能会互相冲突。 
**安全性:**Wordpress的安全记录并非很是好。因此仍是给它建立个沙箱,至少黑客入侵时不会影响其余运行的应用。 
升级、降级:升级应用通常会覆盖现有文件。升级过程当中会发生什么?系统要关闭么?若是升级失败,或者不对该怎么办?咱们怎样快速回退到先前的版本? 
快照、备份:一旦全部的内容都设置好,就给系统建立一个“快照”,以便能备份快照,甚至能移到另外一个服务器上再次启动,或者拷贝到多个服务器上以备不时之需。 
重复性:系统出新版本以后,比较好的作法是先在测试基础设施上自动部署并测试,而后再发布到生产系统。一般会利用诸如Chef、Puppet等 工具在服务器上自动安装一堆包,等一切内容都就绪后,再在生产系统上运行相同的部署脚本。这在百分之九十九的状况下都没有问题。但有百分之一的例外,在部 署到测试环境和生产环境之间的时间跨度里,你依赖的包在包仓库里有了更新,而新版本并不兼容。结果生产环境的设置和测试环境不一样,还有可能破坏生产系统。 假如没有控制部署的每个方面(例如托管本身的APT或YUM仓库),持续在多个阶段(好比测试、预演、生产环境)重复搭建出彻底相同的系统就很困难。 
资源限制:若是咱们的Wordpress耗费CPU资源,并占用了全部的CPU周期,致使其余应用没法作任何事情怎么办?若是它用尽了所有可用的内存呢?或者疯狂写日志阻塞磁盘呢?要是能限制应用的可用资源,好比CPU、内存和磁盘空间,就会很是方便。 
易于安装:也许有Debian或CentOS包,抑或是能自动执行全部复杂步骤并安装 Wordpress的Chef菜谱。但这些菜谱很难稳定下来,由于它们须要考虑目标系统上可能的系统配置。不少状况下,这些菜谱只能在干净的系统上运行。 所以,你不太可能更换成本身的包或Chef菜谱。这样的话,安装就是个复杂的系统工程,而不是午休期间就能搞定的事情。 
易于移除:软件应该能轻松、干净地移除,不留痕迹。但部署应用一般要调整已有的配置文件、设置状态(MySQL数据库的数据,日志),彻底移除应用也变得不那么容易。 
那咱们应该如何解决这些问题呢?docker

0x03 虚拟机VS容器-虚拟机解决方案

咱们决定在单独的虚拟机上运行独立的应用,例如Amazon的EC2,大部分问题这时会迎刃而解: 
隔离性:在一个VM上安装一个应用,应用是彻底独立的,除非它们攻入了对方的防火墙。 
重复性:用你喜欢的方式准备系统,而后建立一个AMI。你能够随意实例化多个AMI实例。彻底是可重现的。 
安全性:因为咱们彻底隔离,若是Wordpress遭到攻击,其他的基础设施并不会受到影响——除非你没有保管好SSH密钥或者在哪里都使用同一个密码,但你应该不会这么作吧? 
**资源限制:**VM会分配特定的CPU周期、可用内存和磁盘空间,没有加价的话就不能超额。 
易于安装:愈来愈多的应用可以在EC2上运行,只要在AWS marketplace上点击一个按钮就能实例化应用。启动只须要几分钟,就是这样。 
易于移除:不须要某个应用了?销毁VM。干净又方便。 
**升级、降级:**Netflix如何部署代码里提到,只须要在新VM上部署新版本,而后让负载均衡器指向部署了新版本的VM。不过应用若是须要在本地保存状态,这种方法就不是很好用了。 
快照、备份:点击一个按钮(或者调用一下API)就能得到EBS磁盘的快照,快照会备份到S3中。 
完美! 
不过……咱们有个新问题:虚拟机在两个方面比较昂贵: 
金钱:你真的有那么多钱为每一个应用启动一个EC2实例?另外你能预测到须要多少个实例么?若是你之后须要更多的资源,你须要中止VM进行升级——不然就要为闲置资源白白付钱,直到真正用起来(除非你用能动态调整大小的Solaris Zones,好比Joyent上的)。 
时间:虚拟机相关的操做大多都很慢:启动要几分钟,捕捉快照要几分钟,建立镜像也须要几分钟。世界不停转动,咱们可没有这种时间! 
咱们能作得更好吗?数据库

0x04 虚拟机VS容器-容器解决方案

Docker是由公共PaaS提供商dotCloud的人发起的开源项目,于去年初发起。从技术角度来讲,Docker(主要用Go语言编写)试图简化两种已有技术的使用: 
**LXC:**Linux容器,容许独立进程在比普通Unix进程更高的隔离级别上运行。使用的技术术语是集装箱化:一个容器里运行一个进程。容器支持的隔离级别有: 
文件系统:容器只能访问本身的沙箱文件系统(相似于chroot),不然要专门挂载到容器的文件系统中才能访问。 
用户名字空间:容器有本身的用户数据库(也就是容器的root不等于主机的root帐户)。 
进程名字空间:只有容器里的进程才是可见的(ps aux的输出会很是简洁)。 
网络名字空间:每一个容器都有本身的虚拟网络设备和虚拟IP(所以它能够绑定任意端口,不用占用主机端口)。 
AUFS:高级多层的统一文件系统,可用来建立联合、写时拷贝的文件系统。 
Docker能够安装在任何支持AUFS和内核版本大于等于3.8的Linux系统上。但从概念上来讲它并不依赖于这些技术,之后也能够和相似的技术一块儿运行,例如Solaris的Zones或BSD jails,并将ZFS做为文件系统。不过目前只能选择Linux 3.8+和AUFS。安全

0x05 为何是Docker

Docker很是轻量。启动VM是个大动做,须要占用大量内存;而启动Docker容器只耗费不多的CPU和内存,而且很是快。几乎和启动一个常规进程没什么区别。不只运行容器快,构建镜像、捕获文件系统的快照也很快。 
它运行在已经虚拟化过的环境中。也就是说,你能够在EC2实例、Rackspace VM或VirtualBox里运行Docker。事实上,在Mac和Windows上使用Docker的首选方式是使用Vagrant。 
Docker容器能移植到任何运行Docker的操做系统上。不管是Ubuntu仍是CentOS,只要Docker运行着,你的容器就能运行。 
让咱们回到前面的部署、操做问题列表,看看Docker是怎么解决的: 
隔离性:Docker在文件系统和网络级别隔离了应用。从这个意义上来说很像在运行”真正的“虚拟机。 
重复性:用你喜欢的方式准备系统(登陆并在全部软件里执行apt-get命令,或者使用Dockerfile),而后把修改提交到镜像中。你能够随意实例化若干个实例,或者把镜像传输到另外一台机器,彻底重现一样的设置。 
**安全性:**Docker容器比普通的进程隔离更为安全。Docker团队已经肯定了一些安全问题,正在着手解决。 
**资源约束:**Docker如今能限制CPU的使用率和内存用量。目前还不能直接限制磁盘的使用状况。 
**易于安装:**Docker有一个Docker Index,这个仓库存储了现成的Docker镜像,你用一条命令就能够完成实例化。好比说,要使用Clojure REPL镜像,只要运行docker run -t -i zefhemel/clojure-repl命令就能自动获取并运行该镜像。 
易于移除:不须要应用了?销毁容器就行。 
升级、降级:和EC2 VM同样:先启动应用的新版本,而后把负载均衡器切换到新的端口。 
**快照、备份:**Docker能提交镜像并给镜像打标签,和EC2上的快照不一样,Docker是当即处理的。服务器

0x06 Docker入门知识准备

Namespace定义与概念 
每一个用户实例之间相互隔离, 互不影响。 通常的硬件虚拟化方法给出的方法是VM,而LXC给出的方法是container,更细一点讲就是kernel namespace。其中pid、net、ipc、mnt、uts、user等namespace将container的进程、网络、消息、文件系统、UTS(“UNIX Time-sharing System”)和用户空间隔离开。 
Cgroups定义与概念 
cgroups 实现了对资源的配额和度量。 cgroups 的使用很是简单,提供相似文件的接口,在 /cgroup目录下新建一个文件夹便可新建一个group,在此文件夹中新建task文件,并将pid写入该文件,便可实现对该进程的资源控制。 groups能够限制blkio、cpu、cpuacct、cpuset、devices、freezer、memory、net_cls、ns九大子系 统的资源 
AUFS定义与概念 
AUFS (AnotherUnionFS) 是一种 Union FS, 简单来讲就是支持将不一样目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)的文件系统, 更进一步的理解, AUFS支持为每个成员目录(相似Git Branch)设定readonly、readwrite 和 whiteout-able 权限, 同时 AUFS 里有一个相似分层的概念, 对 readonly 权限的 branch 能够逻辑上进行修改(增量地, 不影响 readonly 部分的)。一般 Union FS 有两个用途, 一方面能够实现不借助 LVM、RAID 将多个disk挂到同一个目录下, 另外一个更经常使用的就是将一个 readonly 的 branch 和一个 writeable 的 branch 联合在一块儿,Live CD正是基于此方法能够容许在 OS image 不变的基础上容许用户在其上进行一些写操做 网络

这里写图片描述

0x07 Docker有哪些缺点

尽管Docker有助于系统的可靠部署,但它自己并非个彻底成熟的部署系统。它操做的是容器里运行的应用。哪一个容器安装在哪一个服务器上,以及如何启动它们,则超出了Docker的范围。 
一样的,Docker也不处理跨多个容器(可能在多个物理服务器上,也可能在多个VM上)运行的应用。要让容器互相通讯,须要某些发现机制,来找出哪些IP和端口上的其余应用可用。这和跨常规虚拟机的服务发现很是类似。etcd等工具,或者其余的服务发现机制都能用来解决这个问题。架构

0x08 Docker将来发展

虽然Docker目前默认使用LXC和AUFS,可是Docker的核心思想自己,并不强制绑定这二者,0.8版本已经可使用BTRFS,而整个Docker框架也改为了插件式的架构,便于添加替换各个功能模块 
这里写图片描述并发

例如更多的Storage方案的支持,规避AUFS当前的问题,除了LXC之外更多的虚拟化方案等

0x09 总结

容器实质上是一个职责划分的工具。Docker与容器不是等价的,docker是容器,但容器不只仅指的是docker,docker为容器的一个表明,我的理解的docker主要解决的问题为以下两方面 
一、不一样层之间的依赖关系解耦;例如:安装、移除、重复利用。以下图中,container与Host OS和Server之间的解耦。 
二、同层之间资源隔离与资源限制;例如:端口、cpu抢占,同服站点互不影响。下图中App A与APP B之间的隔离,和APP各自的资源利用限制。 
这里写图片描述 
容器解决的问题虚拟机已所有解决,为何还须要容器docker呢?缘由是虚拟机在架构上过重,在资源上有不少没必要要的花费,在时间上启动、建立镜像、快照等消耗较长,在层次结构上虚拟机只具备一层封装,将操做系统、服务、应用所有封装,并不能灵活的拆卸与组装,职责划分并不明确。 
Docker略带积木化色彩,将杂糅的运行环境积木化,用于更快更好的搭建和复用。

参考文档

Docker容器http://www.infoq.com/cn/articles/docker-containers 
http://blog.csdn.net/colorant/article/details/20608157 
LXC 入门文章http://www.cnblogs.com/lisperl/archive/2012/04/15/2450183.html 
Docker核心技术预览:http://www.infoq.com/cn/articles/docker-core-technology-preview

相关文章
相关标签/搜索