《Docker技术入门与实战(第3版)》——1初识Docker与容器
第1章初识Docker与容器
如果说主机时代比拼的是单个服务器物理性能(如 CPU 主频和内存)的强弱,那么在云时代,最为看重的则是凭借虚拟化技术所构建的集群处理能力。
伴随着信息技术的飞速发展,虚拟化的概念早已经广泛应用到各种关键场景中。从20世纪 60 年代 IBM 推出的大型主机虚拟化,到后来以Xen、KVM 为代表的虚拟机虚拟化,再到现在以 Docker 为代表的容器技术,虚拟化技术自身也在不断进行创新和突破。
传统来看,虚拟化既可以通过硬件模拟来实现,也可以通过操作系统软件来实现。而容器技术则更为优雅,它充分利用了操作系统本身已有的机制和特性,可以实现远超传统虚拟机的轻量级虚拟化。因此,有人甚至把它称为“新一代的虚拟化”技术,并将基于容器打造的云平台亲切地称为“容器云”。
毫无疑问,Docker正是众多容器技术中的佼佼者,是容器技术发展过程中耀眼的一抹亮色。那么,什么是 Docker?它会带来哪些好处?它跟现有虚拟化技术又有何关系?
本章首先会介绍 Docker 项目的起源和发展过程,之后会为大家剖析 Docker 和相关容器技术,以及它为DevOps等场景应用带来的巨大便利。最后,还将阐述 Docker 在整个虚拟化领域中的技术定位。
1.1 什么是Docker
1. Docker开源项目背景
Docker是基于Go语言实现的开源容器项目。它诞生于2013年年初,最初发起者是 dotCloud公司。Docker自开源后受到业界广泛的关注和参与,目前已有80多个相关开源组件项目(包括Containerd、Moby、Swarm等),逐渐形成了围绕Docker容器的完整的生态体系。
dotCloud公司也随之快速发展壮大,在2013年年底直接改名为Docker Inc,并专注于Docker相关技术和产品的开发,目前已经成为全球最大的Docker容器服务提供商。官方网站为docker.com,如图1-1所示。
图1-1 Docker官方网站
Docker项目已加入Linux基金会,并遵循Apache 2.0协议,全部开源代码均在https://github.com/docker项目仓库进行维护。在Linux基金会最近一次关于“最受欢迎的云计算开源项目”的调查中,Docker 仅次于 2010 年发起的 OpenStack 项目,并仍处于上升趋势。2014 年,Docker 镜像下载数达到了一百万次,2015 年直接突破十亿次,2017 年更是突破了惊人的百亿次。
现在主流的操作系统包括 Linux 各大发行版、macOS、Windows 等都已经支持 Docker。例如,Redhat RHEL 6.5/CentOS 6.5、Ubuntu 16.04 以及更新的版本,都已经在官方软件源中默认带有 Docker 软件包。此外,各大云服务提供商也纷纷推出了基于 Docker 的服务。Google 公司在其 Platform as a Service(PaaS)平台及服务中广泛应用了 Docker 容器;IBM 公司与Docker公司达成了战略合作伙伴关系,进行云业务上的深入技术合作;Microsoft 公司在其 Azure 云平台上支持安全可扩展的 Docker 集群方案;公有云提供商 Amazon 在其 AWS 云平台上集成了对 Docker 的支持,提供高性能快速的部署。
Docker 的构想是要实现“Build, Ship and Run Any App, Anywhere”,即通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件级别的“一次封装,到处运行”。这里的应用组件,既可以是一个 Web 应用、一个编译环境,也可以是一套数据库平台服务,甚至是一个操作系统或集群。
基于 Linux 平台上的多项开源技术,Docker 提供了高效、敏捷和轻量级的容器方案,并支持部署到本地环境和多种主流云平台。可以说,Docker首次为应用的开发、运行和部署提供了“一站式”的实用解决方案。
2. Linux容器技术—巨人的肩膀
与大部分新兴技术的诞生一样,Docker也并非“从石头缝里蹦出来的”,而是站在前人的肩膀上。其中最重要的就是 Linux 容器(Linux Containers,LXC)技术。IBM DeveloperWorks网站关于容器技术的描述十分准确:“容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心 CPU 本地运行指令,而不需要任何专门的解释机制。此外,也避免了准虚拟化(para-virtualization)和系统调用替换中的复杂性。”
当然,LXC 也经历了长期的演化。最早的容器技术可以追溯到 1982 年 Unix 系列操作系统上的 chroot 工具(直到今天,主流的 Unix、Linux 操作系统仍然支持和带有该工具)。早期的容器实现技术包括 Sun Solaris 操作系统上的 Solaris Containers(2004 年发布),FreeBSD 操作系统上的 FreeBSD jail(2000年左右发布),以及GNU/Linux上的Linux-VServer(http://linux-vserver.org,2001年10月)和OpenVZ(http://openvz.org,2005年)。
在LXC之前,这些相关技术经过多年的演化已经十分成熟和稳定,但是由于种种原因,它们并没有被很好地集成到主流的 Linux 内核中,使用起来并不方便。例如,如果用户要使用 OpenVZ 技术,需要先手动给操作系统打上特定的内核补丁方可使用,而且不同版本并不一致。类似的困难造成在很长一段时间内这些优秀的技术只在技术人员的小圈子中交流。
后来LXC项目借鉴了前人成熟的容器设计理念,并基于一系列新引入的内核特性,实现了更具扩展性的虚拟化容器方案。更加关键的是,LXC 终于被集成到到主流Linux内核中,进而成为Linux系统轻量级容器技术的事实标准。从技术层面来看,LXC已经趟过了绝大部分的“坑”,完成了容器技术实用化的大半历程。
3.从Linux容器到Docker
在LXC的基础上,Docker进一步优化了容器的使用体验,让它进入寻常百姓家。首先,Docker 提供了各种容器管理工具(如分发、版本、移植等),让用户无须关注底层的操作,更加简单明了地管理和使用容器;其次,Docker 通过引入分层文件系统构建和高效的镜像机制,降低了迁移难度,极大地改善了用户体验。用户操作 Docker 容器就像操作应用自身一样简单。
早期的Docker代码实现是直接基于 LXC 的。自 0.9 版本开始,Docker 开发了 libcon-tainer项目作为更广泛的容器驱动实现,从而替换掉了 LXC 的实现。目前,Docker 还积极推动成立了 runC 标准项目,并贡献给开放容器联盟,试图让容器的支持不再局限于 Linux 操作系统,而是更安全、更开放、更具扩展性。
简单地讲,读者可以将 Docker 容器理解为一种轻量级的沙盒(sandbox)。每个容器内运行着一个应用,不同的容器相互隔离,容器之间也可以通过网络互相通信。容器的创建和停止十分快速,几乎跟创建和终止原生应用一致;另外,容器自身对系统资源的额外需求也十分有限,远远低于传统虚拟机。很多时候,甚至直接把容器当作应用本身也没有任何问题。
笔者相信,随着 Docker 技术的进一步成熟,它将成为更受欢迎的容器虚拟化技术实现,并在云计算和 DevOps 等领域得到更广泛的应用。
- 点赞
- 收藏
- 关注作者
评论(0)