使用Docker容器——轻量灵活的VM同类,来接管“依赖地狱”。学习Docker是如何基于LXC技术,通过把应用包装在容器里来使应用具有移植性和独立性。
想象一下可以轻松地把应用和它的依赖打包,然后在其他的开发、测试和生产环境上平滑的运行。这就是开源Docker项目的目标。尽管它现在还没正式到生产阶段,最新的发布(本篇文章编写时是0.7.x)使得Docker实现这一伟大目标又近了一步。
Docker容器试图解决“依赖地狱”问题。现代的应用通常从已存在的组件组合而来,并且依赖其他服务和应用。比如,你的Python应用可能使用Postgre所为一个数据存储,用Redis缓存以及使用Apache作web服务器。每个这些组件都附带自身的一些依赖,这些依赖可能与其他组件产生冲突。通过打包每个组件及其依赖,Docker容器解决以下问题:
冲突依赖:需要在PHP4.3上运行一个web站点而另一个运行在PHP5.5上?如果你在一个独立的Docker容器中运行每个版本的PHP,那就没问题。
缺少依赖:在一个新环境上安装应用对Docker容器来说只是瞬间的事情,因为所有的依赖都和这个应用一起打包到一个容器中。
平台依赖:从一个发行版移动到另一个不再是一个麻烦。如果两个系统都运行了Docker容器,那么相同的容器执行起来将没有任何问题。
Docker容器:一点背景2013年初,Docker在dotCloud—一个平台即服务的、以云计算为中心的公司,以一个开源项目的形式诞生。Docker是该公司已经开发的用来在数千台服务器上运行云业务的一个自然扩展技术。它是用Go语言编写的,Go语言是由谷歌开发的一种基于C语言且语法松散的静态类型编程语言。快速发展了6到9个月,这家公司聘请了一个新的CEO,加入了Linux基金会,将公司名改为Docker,并且宣布将工作重心转移到Docker容器及其生态系统的开发。作为Docker容器的受欢迎程度进一步说明,在写这篇文章的时候,它已经在GitHub上被 Star 8985次并 Fork1304次。图1表明了Docker容器在谷歌搜索持续上升的受欢迎度。随着Docker公司发布了第一个版本容器的产品部署以及广泛的社区知道了Docker容器的有用性,预计过去12个月的波形图将会在未来12个月内相形见绌。
图1. 过去12个月Docker软件在谷歌搜索上的趋势图
开源项目Docker,Red Hat新的虚拟化选择
在引擎罩下Docker运用了一些强大的内核级技术并让我们触手可及。容器虚拟化的概念早在几年前已经出现,但通过提供一个简单的工具集和统一的API接口管理一些内核级技术,如LXCs(Linux容器)、cgroups和一个写复制文件系统,Docker已经创建了一个比其各部件更好的工具。它就是一个潜在的用于开发运营商、系统管理员和开发者的规则转换器。
Docker提供工具使得利用容器创建和操作尽可能简单,容器沙箱相互处理。你可以暂时把一个容器当成一个轻量级的虚拟机。
Linux容器和LXC,一个用于Linux容器的用户空间控制程序包,是组成Docker的核心,LXC使用内核级命名空间将主机和容器相互隔离。用户命名空间将主机和容器的用户数据库分离,这样保证了容器的root用户没有主机的root权限。程序命名空间仅负责显示和管理程序在容器中,而非在主机运行。而且网络命名空间提供自己的网络设备和虚拟IP地址给容器。
LXC提供的另一个组件是控制组(cgroups)。命名空间负责主机与容器之间的隔离,而控制组实现资源核算和限制。当允许Docker限制被一个容器消耗的资源:如内存、磁盘空间和输入输出时,控制组也会输出大量与之相关的指标。这些指标使Docker能够监控容器内各个进程的资源消耗并确保每个进程只获取可用的公平共享资源。
除了以上组件,Docker一直在用AuFS(高级多层次统一文件系统)作为容器的文件系统。AuFS是一个能透明覆盖一或多个现有文件系统的层状文件系统。当一个进程需要修改一个文件时,AuFS创建该文件的一个副本。AuFS可以把多层合并成文件系统的单层表示。这个过程称为写复制。
真正酷毙的是,AuFS允许Docker把某些镜像作为容器的基础。例如,你可能有一个可以作为很多不同容器的基础的CentOS系统镜像。多亏AuFS,只要一个CentOS镜像的副本就够了,这样既节省了存储和内存,也保证更快速的容器部署。
使用AuFS的另一个好处是Docker的版本容器镜像能力。每个新版本都是一个与之前版本的简单差异改动,有效地保持镜像文件最小化。但,这也意味着你总是要有一个记录该容器从一个版本到另一个版本改动的审计跟踪。
传统上,Docker依赖AuFS提供了写复制存储机制。然而,最近添加的一个存储启动API可能降低这种依赖。最初,可用的存储驱动有三种:AuFS、VFS和设备映射器-与红帽合作的产物。
自版本0.7起,Docker就与所有Linux发行版协作。然而,它并没有兼顾大部分非Linux系统,如Windows和OS X。在那些操作系统上使用Docker的推荐方式是,用Vagrant在VirtualBox上提供一个虚拟机。