「Docker 那些事儿」容器很难理解?带你从头到尾捋一遍
1. 初始虚拟化
🍑 虚拟化概念
在计算机技术中,虚拟化(Virtualization) 是一种资源管理技术。 虚拟化的目的是在一台计算机上运行多个系统或应用,从而提高资源的利用率,节约成本。将单台服务器中的各种资源,如网络、CPU 及内存等,整合转换为一台或多台虚拟机,用户就可以从多个方面充分利用计算资源。 由下图可以看出,一台物理机可以拥有多台虚拟机,而这些虚拟机都是基于物理机运行。 其中,物理机又叫作虚拟机的宿主机(可简称为主机),只要它处于正常运行状态,就可以一直承载虚拟机的运行。 由于虚拟机基于物理机运行,硬件设备都是共享的,在创建多台虚拟机时,也要考虑到物理机的配置是否能够承载足够数量的虚拟机。
🍑 硬件虚拟化
硬件虚拟化是对宿主机的硬件进行虚拟化,使硬件对用户隐藏,并将虚拟化的硬件呈现在用户面前,如下图所示。
图中所示的硬件并非真实的物理硬件,而是通过虚拟化技术虚拟出来的,与虚拟机一样基于物理机硬件。 虚拟机的运行需要考虑物理机硬件的配置,例如,将物理机中的网卡取出后,在虚拟机设置中是无法添加网卡的,但只要物理机中有网卡,虚拟机中就可以添加多个网卡。 再例如,物理机的内存有 16GB,用户直接给虚拟机配置 16GB 内存,这也是无法实现的,因为物理机的运行也需要消耗内存。
下面是一些硬件虚拟化的例子👇
Inter-VT(Inter Virtualization Technology,Intel 公司的虚拟化技术)。 为了解决纯软件虚拟化安全、性能等方面的不足,这种技术可以让一个 CPU 看起来像是多个 CPU 在工作一样,从而实现在一台计算机上同时存在多个操作系统。 AMD-V(AMD Virtualization,AMD 公司的虚拟化技术)。 它是针对 x86 处理器系统架构的一组硬件扩展虚拟化技术,可以简化纯软件的虚拟化解决方案,改进 VMM(VirtualMachine Manager,虚拟机监视程序)的设计,更充分地利用硬件资源,提高了服务器和数据中心的虚拟化效率。
2. Docker 容器
🍑 Docker 技术的诞生
容器(Container) 技术是基于虚拟化技术的,它使应用程序可以从一个计算环境快速可靠地转移到另一个计算环境运行,可以说是一种新型的虚拟化技术。 由于容器技术的优越性,越来越多的互联网公司开始开发容器应用。 早在 1979 年,UNIX 系统中就出现了一种 chroot 机制,这是容器技术的维形。 2000 年,FreeBSD Jails 技术出现。它基于 FreeBSD 系统,将计算机分为多个独立的小型计算系统。 2006 年,谷歌推出了 Process Containers (过程容器)技术,它不仅可以隔离进程,还可以对隔离空间限制计算资源。 2008 年,出现了第一个完整的容器管理工具——LXC (Linux Container, Linux 容器)。 2013 年,,LMCTFY (Let Me Contain That For you,我为你的程序打包)作为由谷歌开发的开源容器技术,实现了在 Linux 系统中使用容器技术,,LMCTFY 最终成为 Libcontainer 容器管理的重要组成部分。 同年,,Docker 技术问世,容器热度呈爆发式增长,Docker 逐渐成为了容器中的杰出代表,如下图所示👇
Docker 是一个开源的容器引擎,它可以使开发者打包好的应用程序在 Docker 空间中运行起来。 当一台物理机中运行多个 Docker 容器时,就算其中一个容器出故障,也不会影响到整个业务。 Docker 技术之所以独特,是因为它专注于开发人员和系统操作员的需求,将应用程序依赖项与基础架构分开。目前,容器无处不在,在 Linux、Windows、数据中心、公有云中,都可以看到容器的影子,如下图所示。 我们引入集装箱的概念来辅助理解 Docker 容器。集装箱被誉为运输业与世界贸易最重要的发明。 早期的货物运输时,设法将不同的货物放在运输机上和因货物规格不同而频繁进行的货物装载与卸载等浪费了大量的人力物力。 为此人们发明了集装箱,根据货物的形状、大小,使用不同规格的集装箱进行装载,然后再放在运输机上运输。 集装箱密封,只有货物到达目的地才需要拆封,在运输过程中能够在不同的运输机上平滑过渡,避免了资源的浪费。
Docker 容器就是利用了集装箱的思想,为应用程序提供基于容器的标准化运输系统。 Docker 可以将任何应用及其依赖包打包进一个轻量级、可移植、自包含的容器。容器几乎可以运行在所有操作系统上。 因此才有了那句话 “Build Once,Run Anywhere(生成一次,到处运行)”。Docker 的思想从其 Logo 中也不难看出——一堆可移动的集装箱,如下图所示。
🍑 容器与虚拟化
传统的虚拟机技术是模拟出一套硬件,在其上运行一套完整的操作系统,拥有自己独立的内核。 虚拟机包含应用程序、必需的库或二进制文件,以及一个完整的 Guest 操作系统。 而容器没有进行硬件虚拟,容器包含应用程序和它所有的依赖,容器中的应用进程直接运行在宿主机的内核上,与宿主机共享内核,因此容器比传统的虚拟机更加轻便。 容器技术与虚拟化技术都对需要运行的东西进行隔离,形成一个独立的运行空间,与宿主机系统互不干扰。虚拟化技术是基于系统的隔离,它对物理层面的资源进行隔离,如下图所示。
而容器技术与之不同,容器的隔离空间中运行的是应用程序,隔离是基于程序的,不需要将系统隔离,如下图所示。
相较于虚拟化,容器是更加快捷方便的技术,它的部署与迁移都十分快速,结构更加精简,运行速率更高。 而虚拟化技术需要系统隔离,结构腑肿,无论是部署还是迁移都要消耗大量时间,每次创建都要新建系统,为用户的操作带来不便。
🍑 性能差别
虚拟化与容器还有着性能上的区别,如下表所示。
Docker 容器的操作系统是共享的,虚拟化的操作系统是独立的,所以后者的隔离性更强,但也注定结构复杂,无法被广泛应用到企业中。 如今,容器技术已进入成熟阶段,为开发人员与运维人员提供了更大的灵活性。容器可以快速部署,提供不变的基础架构。它们还取代了传统的修补过程,使组织可以更快地响应问题,并使应用程序更易于维护。 容器化之后,应用程序可以部署在任何基础架构上,如虚拟机、服务器以及运行不同虚拟机管理程序的各种公共云。许多企业从在虚拟化基础架构上运行容器开始,发现无须更改代码即可轻松地将其迁移到云。 容器本身具有固有的安全性。Docker 容器在应用程序之间以及应用程序与主机之间创建隔离层,并通过限制对主机的访问来减少主机对外暴露的面积,从而保护主机与主机上的其他容器。 在服务器上运行的 Docker 容器具有与在虚拟机上运行时相同的高级限制,来保证业务的安全性。 Docker 容器还可以通过保护虚拟机本身并为主机提供深度防御来与虚拟化技术完美结合。目前,大多数企业都有成熟的虚拟化环境,包括备份、监视、自动化工具以及与之相关的人员和流程。
🍑 Docker 优势
目前,Docker 发展趋势十分乐观,在企业中得到了广泛应用。接下来,我们将对 Docker 的优势进行详细介绍。
编排有序
在以往的项目交付过程中,常常出现在开发人员这里能够正常运行,到了运维人员那里却无法正常运行的情况,使业务不能在第一时间完成上线,导致交付过程效率低下。 Docker 提供了一种全新的发布机制。这种发布机制使用 Docker 镜像作为统一的软件制品载体,以 Docker 容器作为统一运行环境,通过 Docker Hub 提供镜像统一协作,最重要的是使用 Dockerfile 定义容器内部行为和容器关键属性来做支撑,从而使整个开发交付周期中软件环境保持统一,大大提高了产品交付效率。 Dockerfile 处于整个机制的核心位置。因为在 Dockerfile 中,不仅能够定义使用者要在容器中进行的操作,而且能够定义容器中的软件运行需要的配置,实现了软件开发和运维在配置文件上达成统一。运维人员能够使用 Dockerfile 在不同场合下部署出与开发环境一模一样的 Docker 容器。
高效易迁移
Docker 容器基于开放式标准,几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人计算机、服务器等。这种兼容性可以让用户轻松地把一个应用程序从一个平台直接迁移到另外一个平台。 Docker 是一款轻量级应用,在一台机器上运行的多个 Docker 容器可以共享这台机器的操作系统内核,能够做到快速启动,只需占用很少的服务器资源。镜像是通过文件系统层进行构造的,并共享一些公共文件,这样就能有效降低磁盘用量,使用户能够更快地下载镜像。
快速部署
公司进行业务迁移的时候(例如,公司的 IDC 机房要进行搬迁,业务要迁移到云服务器上),通常需要将所有应用在云服务器上重新部署,这些烦琐的工作极大地浪费了人力,并降低了工作效率。 利用 Docker 容器可以简化这项工作,实现快速部署。人们只需要在云服务器上运行相应的容器,无须考虑环境因素。 Docker 赋予应用的隔离性还独立于底层的基础设施。Docker 默认提供最强的隔离,因此应用出现间题也只是单个容器的问题,不会影响到整台机器。
3. 容器生态系统
Docker 容器能有今天的蓬勃发展,与它生态系统的支持是分不开的。这一套完整的生态系统就是 Docker 发展的基础,为 Docker 提供了一整套技术支持,包括核心技术、平台技术、支持技术。
🍑 核心技术
容器的核心技术是用来支持容器在主机上运行起来的技术,如下图所示
容器规范
虽然 Docker 是最常用的容器之一,但容器不是只有 Docker,还有其他的容器,如 rkt。 为了容器技术能够有更加良好的发展,各个容器技术的开发公司联合成立了 OCI ( Open Container Initiative,开放容器计划)组织。OCI 组织的主要目的就是定制一套完整的容器规范,以保证各个容器之间能够兼容。 目前已经发布了两个容器规范,分别是 runtime spec(运行环境规范) 与 image format spec(镜像格式规范),如下图所示。
这两个规范保证了不同公司开发出来的容器能够在不同的环境下运行,保证了容器的可移植性与互操作性。
容器 runtime
容器 runtime 是指容器的运行环境,用来包容容器的运行。 例如,要养一株花,就要给它阳光、空气和水,来营造一个舒适的环境。容器也是一样,想要让它运行起来就要给它相应的环境。 目前有三种主流的容器 runtime,如下图所示。
LXC (Linux Containers ) 是一款比较老的容器 runtime,最初 Docker 在 Linux 系统中就是用 LXC 作为容器 runtime 的,如下图所示👇
rkt 是 Core OS 公司开发的容器 runtime, 目前是 Docker 默认使用的容器 runtime, 如下图所示。👇
runC 是 Docker 公司自己专门为 Docker 容器开发的 runtime,与 rkt 一样都是符合 OCI 规范的。
管理工具
管理工具是任何一款应用程序必备的要素,否则将无法对应用进行管理。 例如,开车时,司机需要通过方向盘等来对汽车进行操作,用户则需要通过管理工具来对容器进行操作,如下图所示。 容器的管理工具不仅为用户提供管理界面,还与 runtime 进行交互,所以不同的 runtime 对应不同的管理工具。 LXC 对应的容器管理工具是 Ixd。
runC 对应的容器管理工具是 Docker Engine,分为 deamon 与 CLI 两部分。 rkt 对应的容器管理工具是 rktCLI。
定义工具
容器的定义工具用于定义容器的内容与属性,使用户随心所欲地创建自己想要的容器,如下图所示。
Docker Image 就是 Docker 镜像,用户会先根据自己的要求创建一个镜像,再根据配置好的镜像创建出容器。DockerImage 相当于一幅设计蓝图,用户将蓝图规划完成之后,Docker 程序会按照蓝图创建容器。 Dockerfile 是一个文本文件,它包含了在创建镜像时需要使用的命令,这些都是用户事先配置完成的。在创建镜像时,只要指定一个 Dockerfile,Docker 程序就会按照 Dockerfile 中的命令进行镜像的创建。 ACI (App Container Image,应用程序容器镜像)也是一种容器镜像,只不过它是由 CoreOS 公司开发的,专门用于 rkt 容器。
容器仓库
容器仓库并不是用来存放容器的,而是用来存放镜像的。 用户可以将使用过的镜像上传到容器仓库中,下次使用时再从容器仓库中下载需要的镜像,并且仓库中的镜像在一定范围内是共享的。各类容器仓库如图所示。👇
Docker Registry 支持企业自己搭建私有仓库。 Docker Hub 是 Docker 公司为用户提供的公有仓库,里面有许多 Docker 镜像,为广大用户提供了极大的便利。 Quay.io 也是公有仓库,只不过是由红帽(Red Hat)公司提供的。
容器 OS
容器 OS(Operating System,操作系统)专门用于容器的运行。 虽然几乎所有的系统都可以通过容器 runtime 来运行容器,但容器 OS 比起其他系统更加轻巧,更加适宜容器的运行,容器 OS 中的容器运行起来更加高效。常见的容器 OS 如图所示。
🍑 平台技术
在容器普及之前,企业为了便于管理,服务器都是分布式部署,容器平台技术支持容器集群在分布式环境中运行,如图所示。
容器编排引擎
企业根据业务需求随时可能会对容器进行创建、迁移或销毁。容器编排引擎为工程师们提供了更方便的容器集群管理方式。常见的容器编排引擎如图所示。
Docker Swarm 是 Docker 公司于 2014 年 12 月发布的容器编排引擎。 Kubernetes 其实是 Google(谷歌)公司早就开发出来的,直到 2014 年才启用。Kubernetes 同时支持 Docker 容器与 rkt 容器,是目前国内企业中最常用的容器编排引擎之一。 Mesos 是一个分布式内核,Marathon 是一个框架,二者结合即可为企业提供完整的容器集群管理引擎。
容器管理平台
容器管理平台与容器编排引擎一样用于管理容器集群,但容器管理平台是位于容器编排引擎之上的平台, 它可以兼容各类容器编排引擎。 容器管理平台将编排引擎的功能抽象化地呈现在 Web 页面中,使用户的管理方式更加简单。常见的容器管理平台如图所示。
容器 PaaS
PaaS (Platform as a Service,平台即服务) 是指将研发平台或环境作为一种服务,通过商业模式提供给用户或企业。 容器 PaaS 就是基于容器的 PaaS,开发人员无须对低层设施进行操作,直接在 PaaS 上进行研发。常见的容器 PaaS 如图所示。
🍑 支持技术
容器支持技术是用来支持容器设备的技术,有了这些技术的支持,容器才能完整地运行并运用到企业中,如图所示。
容器网络
容器运行在物理机中,一台物理机中又可能会有多个容器。 由于业务的架构不同,容器与容器之间或者容器与其他设备之间,都可能需要网络支持,但它们又相互隔离。 容器网络技术的出现解决了各个设备之间复杂的网络问题。常见的容器网络技术如图所示。
Docker Network 是 Docker 容器本身的网络技术,Flannel、Weave 与 Calico 都是主流的第三方容器网络技术,企业根据业务的不同需求选择不同的容器网络技术。
服务发现
容器集群是动态的,访问量增大就会自动创建容器,访问量减小就会自动销毁容器,还会根据业务需要进行容器迁移。 在这样一系列的变动之后,业务信息也发生改变,服务发现技术将这些变动之后的最新信息通知客户机,让客户能够准确地访问服务。常见的服务发现技术如图所示。
容器监控
在传统的服务集群中,为确保业务的正常运行,需要对业务进行监控管理。容器集群是动态的,这无疑给容器监控带来了挑战。常见的容器监控工具如图所示。
docker ps/top/stats 是 Docker 自带的命令行形式的监控工具,docker stats API 是通过接口使用户可以获取容器状态的工具。
数据管理
容器集群既然为用户提供服务,就会产生数据,为保证这些数据的安全性,就有了容器的数据管理技术。 数据管理技术可以使容器集群发生变化时,不对持久化数据造成损失,并且完整地保留新的数据。常见的数据管理技术如图所示。
日志管理
在用户访问网站时,Web 服务会将访问信息记录到特定的文件当中,这些文件就是日志文件。常见的日志管理工具如图所示。
Docker Logs 是 Docker 容器自带的日志管理工具。Logspout 通过容器接口从各个容器中收集日志信息,将收集到的日志信息发送给后续的程序进行处理,最终日志信息被写入日志系统。
容器安全
容器的安全性是企业工程师们时刻要关注的,也是整个企业都需要重视的事情。常见的容器安全工具如图所示。
Docker 本身也是有安全机制的,它通过对资源的限制与对信息的过滤来提高容器的安全性。另外,还有其他的第三方安全工具,如 Docker Bench、Clair 等。 Docker Bench 会按照相关安全规范来对容器进行一系列检查。 Clair 通过对镜像文件的扫描来发现容器的潜在风险。
4. 总结
本篇文章介绍了容器的基本概念、虚拟化技术、Docker 容器相对于传统虚拟化技术的优势,以及 Docker 容器在企业项目中存在的必要性。 我们可以清晰地感受到 Docker 容器在生产环境中带给我们的巨大便利,以及容器对于企业的重要性。
版权声明: 本文为 InfoQ 作者【飞向星的客机】的原创文章。
原文链接:【http://xie.infoq.cn/article/cc320e043b55cf03ad19c01d0】。文章转载请联系作者。
评论