1.1 什么是Docker
Docker的构想
Docker 的构想是要实现"Build , Ship and Run Any App, Anywhere",即通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件级别的"一次封装,到处运行" 。这里的应用组件,既可以是一个Web 应用、一个编译环境,也可以是一套数据库平台服务,甚至是一个操作系统或集群。
Docker的作用
基于Linux平台上的多项开源技术,Docker 提供了高效、敏捷和轻量级的容器方案,并 支持部署到本地环境和多种主流云平台。 可以说,Docker首次为应用的开发、运行和部署提 供了“一站式"的实用解决方案。
Linux 容器(Linux Containers, LXC)技术
IBM Developer Works 网站关于容器技术的描述十分准确:容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资惊使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心CPU本地运行指令,而不需要任何专门的解释机制。此外,也避免了准虚拟化(para-virtualization)和系统调用替换中的复杂性。
从Linux 容器到Docker
在LXC的基础上, Docker 进一步优化了容器的使用体验,让它进入寻常百姓家。
首先,Docker 提供了各种容器管理工具(如分发、版本、移植等),让用户无须关注底层的操作,更加简单明了地管理和使用容器;其次,Docker通过引人分层文件系统构建和高效的镜像机制,降低了迁移难度,极大地改善了用户体验,用户操作Docer 容器就像操作应用自身一样简单。
早期的Docker 代码实现是直接基于LXC的。自0.9版本开始,Docker开发了libcontainer项目作为更广泛的容器驱动实现,从而替换掉了LXC的实现。目前,Docker还积极推动成立了runC标准项目,并贡献给开放容器联盟,试图让容器的支持不再局限于Linux 操作系统,而是更安全、更开放、更具扩展性。
简单地讲,读者可以将Docker容器理解为一种轻量级的沙盒(sandbox)。每个容器内运行着一个应用,不同的容器相互隔离,容器之间也可以通过网络互相通信。容器的创建和停止十分快速,几乎跟创建和终止原生应用-致;另外,容器自身对系统资源的额外需求也十分有限,远远低于传统虚拟机。很多时候,甚至直接把容器当作应用本身也没有任何问题。
1.2 为什么要使用Docker
Docker的优点
Docker 提供了一种更为聪明的方式,通过容器来打包应用、解藕应用和运行平台。这意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,无论新旧服务器是否是同一类型的平台。这无疑将帮助我们节约大量的宝贵时间,并降低部署过程出现问题的风险。
Docker 在开发和运维中的优势
- 更快速的交付和部署
- 更高效的资源利用
- 更轻松的迁移和扩展
- 更简单的更新管理
Docker 与虚拟机比较
作为一种轻量级的虚拟化方式, Docker 在运行应用上跟传统的虚拟机方式相比具有如下显著优势:
- Docker 容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式(数分钟)要快得多;
- Docker 容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器(在IBM服务器上已经实现了同时运行10K量级的容器实例);
- Docker 通过类似Git 设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新;
- Docker 通过Dockerfile 支持灵活的自动化创建和部署机制,以提高工作效率,并标准化流程。
Docker 容器除了运行其中的应用外,基本不消耗额外的系统资源,在保证应用性能的同时,尽量减小系统开销。传统虚拟机方式运行N个不同的应用就要启用N个虚拟机(每个虚拟机需要单独分配独占的内存、磁盘等资源),而Docker 只需要启动N个隔离得“很薄的"容器,并将应用放进容器内即可。应用获得的是接近原生的运行性能。当然,在隔离性方面,传统的虚拟机方式提供的是相对封闭的隔离。但这并不意味着Docker 不安全。Docker 利用Linux系统上的多种防护技术实现了严格的隔离可靠性,并且可以整合众多安全工具。从1.3.0 版本开始,Docker重点改善了容器的安全控制和镜像的安全机制,极大地提高了使用Docker 的安全性。在已知的大规模应用中,目前尚未出现值得担忧的安全隐患。
Docker容器技术与传统虚拟机技术的比较
特性 | 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
性能 | 接近原生 | 较弱 |
内存代价 | 很小 | 较多 |
硬盘使用 | 一般为MB | 一般为GB |
运行密度 | 单机支持上千个容器 | 一般几十个 |
隔离性 | 安全隔离 | 完全隔离 |
迁移性 | 优秀 | 一般 |
1.3 Docker 与虚拟化
虚拟化(virtualization)技术是一个通用的概念,在不同领域有不同的理解。在计算领域,一般指的是计算虚拟化(computing v irtualization),或通常说的服务器虚拟化。
维基百科上的定义如下:在计算机技术中,虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以用比原本的纽态更好的方式来应用这些资源。
可见,虚拟化的核心是对资源的抽象,目标往往是为了在同一个主机上同时运行多个系统或应用,从而提高系统资源的利用率,并且带来降低成本、方便管理和容错容灾等好处。
从大类上分,虚拟化技术可分为基于硬件的虚拟化和基于软件的虚拟化。
其中, 真正意义上的基于硬件的虚拟化技术不多见,少数如网卡中的单根多IO 虚拟化(Single Root 1/0 Virtualization and Sharing Specification , SR-IOV)等技术,也超出了本书的讨论范畴。基于软件的虚拟化从对象所在的层次,又可以分为应用虚拟化和平台虚拟化(通常说的虚拟机技术即属于这个范畴) 。
前者一般指的是一些模拟设备或诸如Wine 这样的软件,后者又可以细分为几个子类:
- 完全虚拟化。虚拟机模拟完整的底层硬件环境和特权指令的执行过程,客户操作系统无须进行修改。例如IBM p 和z 系列的虚拟化、VMware Workstation 、VirtualBox 、QEMU 等;
- 硬件辅助虚拟化。利用硬件(主要是CPU)辅助支持(目前x86体系结构上可用的硬件辅助虚拟化技术包括Intel-VT 和AMD-V)处理敏感指令来实现完全虚拟化的功能,客户操作系统无须修改,例如VMwar巳Workstation , Xen, KVM;
- 部分虚拟化。只针对部分硬件资源进行虚拟化,客户操作系统需要进行修改。现在有些虚拟化技术的早期版本仅支持部分虚拟化;
- 超虚拟化(paravirtualization)。部分硬件接口以软件的形式提供给客户机操作系统,客户操作系统需要进行修改,例如早期的Xen;
- 操作系统级虚拟化。内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。容器相关技术即在这个范畴。
可见, Docker 以及其他容器技术都属于操作系统虚拟化这个范畴,操作系统虚拟化最大的特点就是不需要额外的supervisor 支持。Docker 虚拟化方式之所以有众多优势,跟操作系统虚拟化技术自身的设计和实现是分不开的。
Docker和常见的虚拟机方式的不同之处。
- 传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。
- Docker 容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。
网友评论