Docker第一章 : 初识Docker与容器

第一章 : 初识Docker与容器

本章知识点:

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

Linux 内核:3.10.0-1062.el7.x86_64  Docker version 25.0.0

背景

主机时代比拼的是单个服务器物理性能(如CPU主频和内存)的强弱,那么在云时代,最为看重的则是凭借虚拟化技术所构建的集群处理能力。

伴随着信息技术的飞速发展,虚拟化的概念早已经广泛应用到各种关键场景中。从20世纪60年代IBM推出的大型主机虚拟化,到后来以Xen、KVM为代表的虚拟机虚拟化,再到现在以Docker为代表的容器技术,虚拟化技术自身也在不断进行创新和突破。

传统来看,虚拟化既可以通过硬件模拟来实现,也可以通过操作系统软件来实现。而容器技术则更为优雅,它充分利用了操作系统本身已有的机制和特性,可以实现远超传统虚拟机的轻量级虚拟化。因此,有人甚至把它称为“新一代的虚拟化”技术,并将基于容器打造的云平台亲切地称为“容器云”。

Docker正是众多容器技术中的佼佼者,是容器技术发展过程中耀眼的一抹亮色。

什么是Docker?

它会带来哪些好处?

它跟现有虚拟化技术又有何关系?

什么是Docker

Docker的发展历程

Docker的发展历程可以追溯到2013年3月20日,当时dotCloud发布了Docker的第一个版本0.1.0,并将Docker源码进行开源。在接下来的几年中,Docker经历了快速的迭代和发展,以下是其发展历程中的关键节点:

  1. 2013年底,DotCloud Inc更名为Docker Inc,表明Docker从一个小型项目演变成了一个独立的公司。
  2. 2014年6月,在DockerCon大会上,Docker正式发布了1.0版本,这标志着Docker的稳定性和可靠性已经基本满足了生产环境的运行需求。
  3. 2015年4月,Docker发布了1.6版本,主要引入了Docker Compose这个工具,帮助用户管理和运行多个容器。
  4. 2016年7月,Docker发布了1.12版本,主要引入了Docker Swarm这个工具,帮助用户管理和编排多个Docker容器。
  5. 2018年11月,Docker发布了18.09版本。

从Linux容器到Docker

在LXC的基础上,Docker进一步优化了容器的使用体验,让它进入寻常百姓家。

首先,Docker提供了各种容器管理工具(如分发、版本、移植等),让用户无须关注底层的操作,更加简单明了地管理和使用容器;

其次,Docker通过引入分层文件系统构建和高效的镜像机制,降低了迁移难度,极大地改善了用户体验。用户操作Docker容器就像操作应用自身一样简单。早期的Docker代码实现是直接基于LXC的。自0.9版本开始,Docker开发了libcon-tainer项目作为更广泛的容器驱动实现,从而替换掉了LXC的实现。

目前,Docker还积极推动成立了runC标准项目,并贡献给开放容器联盟,试图让容器的支持不再局限于Linux操作系统,而是更安全、更开放、更具扩展性。

简单地讲,读者可以将Docker容器理解为一种轻量级的沙盒(sandbox)。每个容器内运行着一个应用,不同的容器相互隔离,容器之间也可以通过网络互相通信。容器的创建和停止十分快速,几乎跟创建和终止原生应用一致;另外,容器自身对系统资源的额外需求也十分有限,远远低于传统虚拟机。很多时候,甚至直接把容器当作应用本身也没有任何问题。

为什么要使用Docker

Docker容器虚拟化的好处

Docker项目的发起人、Docker公司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是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。与传统虚拟机方式相比,Docker的性能要提高1~2个数量级。

  • 更轻松的迁移和扩展。Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等,同时支持主流的操作系统发行版本。这种兼容性让用户可以在不同平台之间轻松地迁移应用。

  • 更简单的更新管理。使用Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。所有修改都以增量的方式被分发和更新,从而实现自动化并且高效的容器管理。

Docker与虚拟机比较

Docker在运行应用上跟传统的虚拟机方式相比具有如下显著优势:

  • Docker容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式(数分钟)要快得多;
  • Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器(在IBM服务器上已经实现了同时运行10K量级的容器实例);
  • Docker通过类似Git设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新;
  • Docker通过Dockerfile支持灵活的自动化创建和部署机制,以提高工作效率,并标准化流程。

Docker容器除了运行其中的应用外,基本不消耗额外的系统资源,在保证应用性能的同时,尽量减小系统开销。传统虚拟机方式运行N个不同的应用就要启用N个虚拟机(每个虚拟机需要单独分配独占的内存、磁盘等资源),而Docker只需要启动N个隔离得“很薄的”容器,并将应用放进容器内即可。应用获得的是接近原生的运行性能。

当然,在隔离性方面,传统的虚拟机方式提供的是相对封闭的隔离。但这并不意味着Docker不安全。Docker利用Linux系统上的多种防护技术实现了严格的隔离可靠性,并且可以整合众多安全工具。从1.3.0版本开始,Docker重点改善了容器的安全控制和镜像的安全机制,极大地提高了使用Docker的安全性。在已知的大规模应用中,目前尚未出现值得担忧的安全隐患。

表1-1 Docker容器技术与传统虚拟机技术的比较

Docker第一章 : 初识Docker与容器_第1张图片

Docker与虚拟化

虚拟化(virtualization)技术

虚拟化(virtualization)技术是一个通用的概念,在不同领域有不同的理解。在计算领域,一般指的是计算虚拟化(computing virtualization),或通常说的服务器虚拟化。维基百科上的定义如下:

在计算机技术中,虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以用比原本的组态更好的方式来应用这些资源。”

可见,虚拟化的核心是对资源的抽象,目标往往是为了在同一个主机上同时运行多个系统或应用,从而提高系统资源的利用率,并且带来降低成本、方便管理和容错容灾等好处。

虚拟化技术分类

从大类上分,虚拟化技术可分为基于硬件的虚拟化和基于软件的虚拟化。

基于软件的虚拟化从对象所在的层次,又可以分为应用虚拟化和平台虚拟化(通常说的虚拟机技术即属于这个范畴)。平台虚拟化又可以细分为几个子类:

  • 完全虚拟化。虚拟机模拟完整的底层硬件环境和特权指令的执行过程,客户操作系统无须进行修改。例如IBM p和z系列的虚拟化、VMware Workstation、VirtualBox、QEMU等;

  • 硬件辅助虚拟化。利用硬件(主要是CPU)辅助支持(目前x86体系结构上可用的硬件辅助虚拟化技术包括Intel-VT和AMD-V)处理敏感指令来实现完全虚拟化的功能,客户操作系统无须修改,例如VMware Workstation, Xen,KVM;

  • 部分虚拟化。只针对部分硬件资源进行虚拟化,客户操作系统需要进行修改。现在有些虚拟化技术的早期版本仅支持部分虚拟化;部分虚拟化。只针对部分硬件资源进行虚拟化,客户操作系统需要进行修改。现在有些虚拟化技术的早期版本仅支持部分虚拟化;

  • 超虚拟化(paravirtualization)。部分硬件接口以软件的形式提供给客户机操作系统,客户操作系统需要进行修改,例如早期的Xen;

  • 操作系统级虚拟化。内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。容器相关技术即在这个范畴。

小结

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

你可能感兴趣的:(DevOps云原生实践,docker,容器)