附录D Docker资源链接
第1章 初识Docker 如果说个人主机时代大家比拼的关键是CPU主频的高低和内存的大小,那么在云计算时代,虚拟化技术无疑是整座信息技术大厦最核心的一块基石。 伴随着信息技术产业的发展,虚拟化技术已经应用到各种关键场景中。从最早上世纪60年代IBM推出的大型主机虚拟化到后来X86平台上的虚拟化,虚拟化技术自身也在不断丰富和创新。 虚拟化既可以通过硬件模拟来实现,也可以通过操作系统来实现。而近些年出现的容器虚拟化方案,更是充分利用了操作系统本身已有的机制和特性,可以实现轻量级的虚拟化,甚至有人把它称为新一代的虚拟化技术。Docker毫无疑问就是其中的佼佼者。 那么,什么是Docker?它会带来什么好处?它跟现有虚拟化技术又有何关系呢? 本章在介绍Docker项目的起源和发展之后,会剖析Docker和Linux容器技术的密切联系,以及在开发和运维中使用Docker的突出优势。最后,还将阐述Docker在整个虚拟化领域中的定位。 1.1 什么是Docker Docker开源项目 Docker是基于Go语言实现的云开源项目,诞生于2013年初,最初发起者是dotCloud公司。Docker自开源后受到广泛的关注和讨论,目 前已有多个相关项目,逐渐形成了围绕Docker的生态体系。dotCloud公司后来也改名为Docker Inc,专注于Docker相关技术和产品的开发。 Docker项目目前已加入了Linux基金会,遵循Apache 2.0协议,全部开源代码均在上进行维护。在最近一次Linux基金会的调查中,Docker是仅次于OpenStack的最受欢迎的云计算开源项目。 现在主流的Linux操作系统都已经支持Docker。例如,Redhat RHEL 6.5/ CentOS 6.5往上的操作系统、Ubuntu 14.04操作系统,都已经默认带有Docker软件包。Google公司宣称在其PaaS(Platform as a Service)平台及服务产品中广泛应用了Docker。微软公司宣布和 Docker公司合作,以加强其云平台Azure对Docker的支持。公有云提供商亚马逊近期也推出了AWS EC2 Container,提供对Docker的支持。 Docker的主要目标是“Build, Ship and Run Any App, Anywhere”,即通过对应用组件的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行 (Runtime)等生命周期的管理,达到应用组件级别的“一次封装,到处运行”。这里的应用组件,既可以是一个Web应用,也可以是一套数据库服务,甚 至是一个操作系统或编译器。 Docker基于Linux的多项开源技术提供了高效、敏捷和轻量级的容器方案,并且支持在多种主流云平台(PaaS)和本地系统上部署。可以说Docker为应用的开发和部署提供了“一站式”的解决方案。 Linux容器技术 Docker引擎的基础是Linux容器(Linux Containers,LXC)技术。IBM DeveloperWorks上给出了关于容器技术的准确描述: 容器有效地将由单个操作系统管理的资源划分到孤立的组中,以便更好地在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟, 也不需要即时编译。容器可以在核心CPU本地运行指令,而不需要任何专门的解释机制。此外,也避免了准虚拟化(paravirtualization)和 系统调用替换中的复杂性。 Linux容器其实不是一个全新的概念。最早的容器技术可以追溯到1982年Unix系列操作系统上的chroot 工具(直到今天,主流的Unix、Linux操作系统仍然支持和带有该工具)。早期的容器实现技术包括Sun Solaris操作系统上的Solaris Containers(2004年发布),FreeBSD操作系统上的FreeBSD jail(2000年左右出现),以及GNU/Linux上的Linux-VServer ( )(2001年10月)和OpenVZ ( )(2005年)。 虽然这些技术经过多年的演化已经十分成熟,但是由于种种原因,这些容器技术并没有被集成到主流的Linux内核中,使用起来并不方便。例如,如果用户要使用OpenVZ技术,就需要先给操作系统打上特定的内核补丁方可使用。 后来LXC项目借鉴了前人成熟的容器设计理念,并基于一系列新的内核特性实现了更具扩展性的虚拟化容器方案。更加关键的是,LXC被集成到了主流Linux内核中,进而成为Linux系统轻量级容器技术的事实标准。 从Linux容器到Docker 在LXC的基础上,Docker进一步优化了容器的使用体验。Docker提供了各种容器管理工具(如分发、版本、移植等)让用户无需关注底层的操作,可以简单明了地管理和使用容器。用户操作Docker容器就像操作一个轻量级的虚拟机那样简单。 读者可以简单地将Docker容器理解为一种沙盒(Sandbox)。每个容器内运行一个应用,不同的容器相互隔离,容器之间也可以建立通信机制。容器 的创建和停止都十分快速,容器自身对资源的需求也十分有限,远远低于虚拟机。很多时候,甚至直接把容器当作应用本身也没有任何问题。 有理由相信,随着Docker技术的进一步成熟,它将成为更受欢迎的容器虚拟化技术实现,得到更广泛的应用。 1.2 为什么要使用Docker Docker容器虚拟化的好处 Docker项目的发起人和Docker Inc.的CTO Solomon Hykes认为,Docker在正确的地点、正确的时间顺应了正确的趋势—即高效地构建应用。现在开发者需要能方便地创建运行在云平台上的应用,也就是说 应用必须能够脱离底层机器,而且同时必须是“任何时间任何地点”可获取的。因此,开发者们需要一种创建分布式应用程序的方式,这也是Docker所能够提 供的。 举个简单的应用场景的例子。假设用户试图基于最常见的LAMP(Linux + Apache + MySQL + PHP)组合来运维一个网站。按照传统的做法,首先,需要安装Apache、MySQL 和PHP以及它们各自运行所依赖的环境;之后分别对它们进行配置(包括创建合适的用户、配置参数等);经过大量的操作后,还需要进行功能测试,看是否工作 正常;如果不正常,则意味着更多的时间代价和不可控的风险。可以想象,如果再加上更多的应用,事情会变得更加难以处理。 更为可怕的是,一旦需要服务器迁移(例如从阿里云迁移到腾讯云),往往需要重新部署和调试。这些琐碎而无趣的“体力活”,极大地降低了工作效率。 而Docker提供了一种更为聪明的方式,通过容器来打包应用,意味着迁移只需要在新的服务器上启动需要的容器就可以了。这无疑将节约大量的宝贵时间,并降低部署过程出现问题的风险。 Docker在开发和运维中的优势 对开发和运维(DevOps)人员来说,可能最梦寐以求的就是一次性地创建或配置,可以在任意环境、任意时间让应用正常地运行。而Docker恰恰是可以实现这一终极目标的瑞士军刀。 具体说来,Docker在开发和运维过程中,具有如下几个方面的优势。 更快速的交付和部署。使用Docker,开发人员可以使用镜像来快速构建一套标准的开发环境;开发完成之后,测试和运维人员可以直接使用相同环境来部署 代码。Docker可以快速创建和删除容器,实现快速迭代,大量节约开发、测试、部署的时间。并且,各个步骤都有明确的配置和操作,整个过程全程可见,使 团队更容易理解应用的创建和工作过程。 更高效的资源利用。Docker容器的运行不需要额外的虚拟化管理程序(Virtual Machine Manager,VMM,以及Hypervisor)支持,它是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。 更轻松的迁移和扩展。Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性让用户可以在不同平台之间轻松地迁移应用。 更简单的更新管理。使用Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。并且所有修改都以增量的方式进行分发和更新,从而实现自动化并且高效的容器管理。 Docker与虚拟机比较 作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有显著优势: Docker容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式要快得多。 Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器。 Docker通过类似Git的操作来方便用户获取、分发和更新应用镜像,指令简明,学习成本较低。 Docker通过Dockerfile配置文件来支持灵活的自动化创建和部署机制,提高工作效率。 Docker容器除了运行其中的应用之外,基本不消耗额外的系统资源,保证应用性能的同时,尽量减小系统开销。传统虚拟机方式运行N个不同的应用就要启 动N个虚拟机(每个虚拟机需要单独分配独占的内存、磁盘等资源),而Docker只需要启动N个隔离的容器,并将应用放到容器内即可。 当然, 在隔离性方面,传统的虚拟机方式多了一层额外的隔离。但这并不意味着Docker就不安全。Docker利用Linux系统上的多种防护机制实现了严格可 靠的隔离。从1.3版本开始,Docker引入了安全选项和镜像签名机制,极大地提高了使用Docker的安全性。 下表总结了使用Docker容器技术与传统虚拟机技术的特性比较。 特性 容器 虚拟机 启动速度 秒级 分钟级 硬盘使用 一般为MB 一般为GB 性能 接近原生 弱于 系统支持量 单机支持上千个容器 一般几十个 隔离性 安全隔离 完全隔离