docker 在工作上有用到,但只限于非常基本的使用,一直想更加深入学习,构建更为完整、牢靠的知识图景。多谢老黎的资源,能翻翻这本书,记点笔记注点水。
本篇笔记对应于《Docker技术入门与实战》的第一章
如果说主机时代比拼的是单个服务器物理性能(比如CPU的主频和内存)的强弱,那么在云时代,最为看重的则是凭借虚拟化技术所构建的集群处理能力。
毫无疑问,Docker正是众多容器技术中的佼佼者,是容器技术发展过程中耀眼的一抹亮色。
1.1 什么是Docker
1.1.1 Docker开源项目背景
Docker 是基于Go语言实现的开源容器项目。它诞生于2013年年初,最初发起者是dotCloud公司。Docker自开源后受到业界广泛的关注和参与,目前已有80多个相关开源组件项目,逐渐形成了围绕Docker容器的完整的生态体系。
dotCloud公司也随之快速发展壮大,在2013年年底直接改名为Docker Inc,并专注于Docker相关技术和产品的开发,目前已经成为全球最大的Docker容器服务提供商。
Docker 项目已经加入Linux基金会,并遵循Apache 2.0协议,全部开源代码均在 https://github.com/docker 项目仓库进行维护。
Docker 的构想是要实现“Build, Ship and Run Any App, Anywhere”,即通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件级别的“一次封装,到处运行”。这里的应用组件,既可以是一个web应用、一个编译环境,也可以是一套数据库平台服务,甚至是一个操作系统或集群。
基于Linux平台上的多项开源技术,Docker提供了高效、敏捷和轻量级的容器方案,并支持部署到本地环境和多种主流云平台。可以说,Docker首次为应用的开发、运行和部署提供了“一站式”的实用解决方案。
1.1.2 Linux容器技术--巨人的肩膀
Docker的诞生,受益于Linux容器技术(Linux Containers, LXC)。
IBM DeveloperWorks网站关于容器技术的描述十分准确:
容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源实用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心CPU本地运行指令,而不需要任何专门的解释机制。此外,也避免了准虚拟化和系统调用替换中的复杂性。
LXC 也经历了长期的演化。最早的容器技术可以追溯到1982年Unix系列操作系统上的chroot工具。
在LXC之前,这些相关技术经过多年的演化已经十分成熟和稳定,但是由于种种原因,它们并没有被很好地集成到主流的Linux内核中,使用起来并不方便。
后来LXC项目借鉴了前人成熟的容器设计理念,并基于一系列新引入的内核特性,实现了更具扩展性的虚拟化容器方案。更加关键的是,LXC终于被集成到主流Linux内核中,进而成为Linux系统轻量级容器技术的事实标准。从技术层面来看,LXC已经趟过了绝大部分的”坑”,完成了容器技术实用化的大半历程。
1.1.3 从Linux容器到Docker
在LXC的基础之上,Docker进一步优化了容器的使用体验,让它进入寻常百姓家。
早期的Docker代码实现是直接基于LXC的。自0.9版本开始,Docker开发了libcontainer项目作为更为广泛的容器驱动实现,从而替换掉了LXC的实现。目前,Docker还积极推动成立了runC标准项目,并贡献给开放容器联盟,试图让容器的支持不再局限与Linux操作系统,而是更安全、更开放、更具扩展性。
简单地讲,读者可以将Docker容器理解为一种轻量级的沙盒。每个容器内运行着一个应用,不同容器相互隔离,容器之间也可以通过网络相互通信。容器的创建和停止十分快速,几乎跟创建和终止原生应用一致;另外,容器自身对系统资源的额外需求也十分有限,远远低于传统虚拟机。很多时候,甚至直接把容器当做应用本身也没有任何问题。
1.2 为什么要使用Docker
1.2.1 Docker容器虚拟化的好处
Docker项目的发起人、Docker公司CTO Solomon Hykes 认为,Docker在正确的地点、正确的时间顺应了正确的趋势--如何正确的构建应用。
在云时代,开发者创建的应用必须要能很方便地在网络上传播,也就是说应用必须脱离底层物理硬件的限制;同时必须是“任何时间任何地点”可获取的。因此,开发者们需要一种新型的创建分布式应用程序的方式,快速分发和部署,而这正是Docker所能提供的最大优势。
1.2.2 Docker 在开发和运维中的优势
对开发和运维(DevOps)人员来说,最梦寐以求的效果可能就是一次创建或配置,之后可以在任意地方、任意时间让应用正常运行,而Docker有如下几个方面的优势:
- 更快速的交付和部署。使用Docker,开发人员可以使用镜像来快速构建一套标准的开发环境;开发完成之后,测试和运维人员可以直接使用完全相同的环境来部署代码。只要是开发测试过的代码,就可以确保在生产环境无缝运行。Docker可以快速创建和删除容器,实现快速迭代,节约开发、测试、部署的大量时间。并且,整个过程全程可见,是团队更容易理解应用的创建和工作过程。
- 更高效的资源利用 运行Docker容器不需要额外的虚拟化管理程序(Virtual Machine Manager,VMM,以及Hypervisor)的支持,Docker是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。与传统虚拟机方式相比,Docker的性能要提高1~2个数量级。
- 更轻松的迁移和扩展 Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等,同时支持主流的操作系统发行版本。这种兼容性让用户可以在不同平台之间轻松的迁移应用。
- 更简单的更新管理 使用Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。所有修改都以增量的方式被分发和更新,从而实现自动化并且高效的容器管理
1.2.3 Docker与虚拟机的比较
- Docker容器和快,启动和停止可以在秒级实现,这相比传统的虚拟机方式(数分钟)要快得多;
- Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器(在IBM服务器上已经实现了同时运行10K量级的容器实例);
- Docker通过类似Git设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新;
- Docker通过Dockerfile支持灵活的自动化创建和部署机制,以提高工作效率,并标准化流程。
可归来为下表:
1.3 Docker与虚拟化
虚拟化(virtualization)技术是一个通用的概念,在不同领域有不同的理解。在计算领域,一般只的是计算虚拟化,或者通常说的服务器虚拟化。维基百科上的定义如下:
在计算机技术中,虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使得用户可以用比原来的组态更好的方式来应用这些资源。
虚拟化的核心是对资源的抽象,目标往往是为了在同一个主机上同时运行多个系统或应用,从而提高系统资源的利用率,并且带来降低成本、方便管理和容错容灾等好处。
虚拟化技术可分为基于硬件的虚拟化和基于软件的虚拟化。真正意义上的基于硬件的虚拟化技术并不多见,少数如网卡中的单根多IO虚拟化等技术,超出本书讨论范畴。
基于软件的虚拟化从对象所在的层次,又可以分为应用虚拟化和平台虚拟化。前者一般指的是一些模拟设备或者诸如Wine这样的软件,后者又可以细分为几个子类:
- 完全虚拟化 虚拟机模拟完整的底层硬件环境和特权指令的执行过程,客户操作系统无需修改。例如VMware workstation、VirtualBox、QEMU等
- 硬件辅助虚拟化 利用硬件(主要是CPU)辅助支持处理敏感指令来实现完全虚拟化的功能,客户操作系统无需修改。
- 部分虚拟化 只针对部分硬件资源进行虚拟化,客户操作系统需要进行修改。现在有些虚拟化技术的早期版本仅支持部分虚拟化
- 超虚拟化 部分硬件接口以软件的形式提供给客户机操作系统,客户操作系统需要修改,例如早期的Xen
- 操作系统级虚拟化 内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。容器相关技术即在这个范畴。
Docker以及其他容器技术都属于操作系统级虚拟化这个范畴,操作系统虚拟化最大的特点就是不需要额外的supervisor支持。Docker虚拟化方式之所以有众多优势,跟操作系统虚拟化技术自身的设计和实现是分不开的。
传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。

1.4 本章小结
本章介绍了容器虚拟化的基本概念、Docker的诞生历史,以及容器在云时代应用分发场景下的巨大优势。
与传统的虚拟机方式相比,容器虚拟化方式在很多场景下都存在极为明显的优势。无论是系统管理员、应用开发人员、测试人员,还是运维管理人员,都应该尽快掌握Docker,尽早享受其带来的巨大便利。