

























在计算机技术中,虚拟化(Virtualization)是一种资源管理技术。它是将计算机的各种实体资源,如:服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以用更好的方式来利用这些资源。
虚拟化的目的是为了在同一个主机上运行多个系统或应用,从而提高系统资源的利用率,并带来降低成本、方便管理和容错容灾等好处。
从实现形式来分,虚拟化技术可分为基于硬件的虚拟化和基于软件的虚拟化。
硬件虚拟化就是硬件物理平台本身提供了对特殊指令的截获和重定向的支持。支持虚拟化的硬件,也是一些基于硬件实现软件虚拟化技术的关键。在基于硬件实现软件虚拟化的技术中,在硬件是实现虚拟化的基础,硬件(主要是 CPU)会为虚拟化软件提供支持,从而实现硬件资源的虚拟化。
支持虚拟化的硬件有:
软件虚拟化就是利用软件技术,在现有的物理平台上实现对物理平台访问的截获和模拟。在软件虚拟化技术中,有些技术不需要硬件支持,如:QEMU;而有些软件虚拟化技术,则依赖硬件支持,如:VMware、KVM。
对软件虚拟化进行细分,又可以分为以下几类:
虚拟化是通过软件的方式模拟实体服务器,其初衷是为了解决「一种应用占用一台服务器」模式所带来的服务器数量剧增的问题,从而降低数据中心复杂度,简化管理难度。在虚拟化的发展过程中,出现过以下主要虚拟化技术或产品:
Docker 是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到安装了任何 Linux 发行版本的机器上。Docker 基于 LXC 来实现类似 VM 的功能,可以在更有限的硬件资源上提供给用户更多的计算资源。与同 VM 等虚拟化的方式不同,LXC 不属于全虚拟化、部分虚拟化或半虚拟化中的任何一个分类,而是一个操作系统级虚拟化。
Docker 是直接运行在宿主操作系统之上的一个容器,使用沙箱机制完全虚拟出一个完整的操作,容器之间不会有任何接口,从而让容器与宿主机之间、容器与容器之间隔离的更加彻底。每个容器会有自己的权限管理,独立的网络与存储栈,及自己的资源管理能,使同一台宿主机上可以友好的共存多个容器。
Docker 借助 Linux 的内核特性,如:控制组(Control Group)、命名空间(Namespace)等,并直接调用操作系统的系统调用接口。从而降低每个容器的系统开销,并实现降低容器复杂度、启动快、资源占用小等特征。
Docker 历史
2010 年,几个搞 IT 的年轻人,在美国旧金山成立了一家名叫「dotCloud」的公司。
这家公司主要提供基于 PaaS 的云计算技术服务。具体来说,是和 LXC 有关的容器技术。
后来,dotCloud 公司将自己的容器技术进行了简化和标准化,并命名为 Docker。
Docker 技术诞生之后,并没有引起行业的关注。而 dotCloud 公司,作为一家小型创业企业,在激烈的竞争之下,也步履维艰。
正当他们快要坚持不下去的时候,脑子里蹦出了「开源」的想法。
什么是开源?开源,就是开放源代码。也就是将原来内部保密的程序源代码开放给所有人,然后让大家一起参与进来,贡献代码和意见。
有的软件是一开始就开源的。也有的软件,是混不下去,创造者又不想放弃,所以选择开源。自己养不活,就吃「百家饭」嘛。
2013 年 3 月,dotCloud 公司的创始人之一,Docker 之父,28 岁的 Solomon Hykes 正式决定,将 Docker 项目开源。 不开则已,一开惊人。
越来越多的 IT 工程师发现了 Docker 的优点,然后蜂拥而至,加入 Docker 开源社区。
Docker 的人气迅速攀升,速度之快,令人瞠目结舌。
开源当月,Docker 0.1 版本发布。此后的每一个月,Docker 都会发布一个版本。到 2014 年 6 月 9 日,Docker 1.0 版本正式发布。
此时的 Docker,已经成为行业里人气最火爆的开源技术,没有之一。甚至像 Google、微软、Amazon、VMware 这样的巨头,都对它青睐有加,表示将全力支持。
Docker 和容器技术为什么会这么火爆?说白了,就是因为它「轻」。
在容器技术之前,业界的网红是虚拟机。虚拟机技术的代表,是 VMWare 和 OpenStack。
相信很多人都用过虚拟机。虚拟机,就是在你的操作系统里面,装一个软件,然后通过这个软件,再模拟一台甚至多台「子电脑」出来。
在「子电脑」里,你可以和正常电脑一样运行程序,例如开 QQ。如果你愿意,你可以变出好几个「子电脑」,里面都开上 QQ。「子电脑」和「子电脑」之间,是相互隔离的,互不影响。
虚拟机属于虚拟化技术。而 Docker 这样的容器技术,也是虚拟化技术,属于轻量级的虚拟化。
虚拟机虽然可以隔离出很多「子电脑」,但占用空间更大,启动更慢,虚拟机软件可能还要花钱(例如 VMWare)。
而容器技术恰好没有这些缺点。它不需要虚拟出整个操作系统,只需要虚拟一个小规模的环境(类似「沙箱」)。
它启动时间很快,几秒钟就能完成。而且,它对资源的利用率很高(一台主机可以同时运行几千个 Docker 容器)。此外,它占的空间很小,虚拟机一般要几 GB 到几十 GB 的空间,而容器只需要 MB 级甚至 KB 级。
正因为如此,容器技术受到了热烈的欢迎和追捧,发展迅速。
Docker 理念
Docker 是基于 Go 语言实现的云开源项目。
Docker 的主要目标是 "Build,Ship and Run Any App,Anywhere",也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的 APP(可以是一个 Web 应用或数据库应用等等)及其运行环境能够做到「一次封装,到处运行」。
Linux 容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用运行在 Docker 容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
Docker 火爆
Docker 最初是 dotCloud 公司创始人、Solomon tykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 Github 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动开放容器联盟(OCI)。
Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目已经超过 5 万 7 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,dotCloud 公司决定改名为 Docker。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Gogle 也在其 PaS 产品中广泛应用 Docker。
Docker 使用 Google 公司推出的 Go 语言进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 0verlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
这是 Docker 公司宣传的 Docker 的主要使用场景。虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件、系统),Docker 在降低额外开销的情况下提供了同样的功能。它能让你将运行环境和配置放在代码中然后部署,同一个 Docker 的配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度。
前一个场景对于管理代码的流水线起到了很大的帮助。代码从开发者的机器到最终在生产环境上的部署,需要经过很多的中间环境。而每一个中间环境都有自己微小的差别,Docker 给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少。
这就带来了一些额外的好处:Docker 能提升开发者的开发效率。详细一点的例子,可以参考 Aater 在 DevOpsDays Austin 2014 大会或者是 DockerCon 上的演讲。
不同的开发环境中,我们都想把两件事做好。一是我们想让开发环境尽量贴近生产环境,二是我们想快速搭建开发环境。
理想状态中,要达到第一个目标,我们需要将每一个服务都跑在独立的虚拟机中以便监控生产环境中服务的运行状态。然而,我们却不想每次都需要网络连接,每次重新编译的时候远程连接上去特别麻烦。这就是 Docker 做的特别好的地方,开发环境的机器通常内存比较小,之前使用虚拟的时候,我们经常需要为开发环境的机器加内存,而现在 Docker 可以轻易的让几十个服务在 Docker 中跑起来。
有很多种原因会让你选择在一个机器上运行不同的应用,比如之前提到的提高开发效率的场景等。
我们经常需要考虑两点,一是因为要降低成本而进行服务器整合,二是将一个整体式的应用拆分成松耦合的单个服务(微服务架构)。如果你想了解为什么松耦合的应用这么重要,请参考 Steve Yege 的这篇论文,文中将 Google 和亚马逊做了比较。
Docker 提供了很多的工具,这些工具不一定只是针对容器,但是却适用于容器。它们提供了很多的功能,包括可以为容器设置检查点、设置版本和查看两个容器之间的差别,这些特性可以帮助调试 Bug。你可以在《Docker 拯救世界》的文章中找到这一点的例证。
另外一个 Docker 有意思的使用场景是在多租户的应用中,它可以避免关键应用的重写。我们一个特别的关于这个场景的例子是为 IoT(物联网)的应用开发一个快速、易用的多租户环境。这种多租户的基本代码非常复杂,很难处理,重新规划这样一个应用不但消耗时间,也浪费金钱。
使用 Docker,可以为每一个租户的应用层的多个实例创建隔离的环境,这不仅简单而且成本低廉,当然这一切得益于 Docker 环境的启动速度和其高效的 diff 命令。
在虚拟机之前,引入新的硬件资源需要消耗几天的时间。Docker 的虚拟化技术将这个时间降到了几分钟,Docker 只是创建一个容器进程而无需启动操作系统,这个过程只需要秒级的时间。这正是 Google 和 Facebook 都看重的特性。
你可以在数据中心创建销毁资源而无需担心重新启动带来的开销。通常数据中心的资源利用率只有 30%,通过使用 Docker 并进行有效的资源分配可以提高资源的利用率。
优势 1:一致的运行环境,更轻松的迁移
在开发的时候,在本机测试环境可以跑起来,但是在生产环境跑不起来
这里我们拿 Java Web 应用程序举例,我们一个 Java Web 应用程序涉及很多东西,比如 jdk、tomcat、mysql 等软件环境。当这些其中某一项版本不一致的时候,可能就会导致应用程序跑不起来这种情况。Docker 则将程序以及使用软件环境直接打包在一起,无论在那个机器上保证了环境一致。
优势 2:对进程进行封装隔离,容器与容器之间互不影响,更高效的利用系统资源
服务器自己的程序挂了,结果发现是别人程序出了问题把内存吃完了,自己程序因为内存不够就挂了
这种也是一种比较常见的情况,如果你的程序重要性不是特别高的话,公司基本上不可能让你的程序独享一台服务器的,这时候你的服务器就会跟公司其他人的程序共享一台服务器,所以不可避免地就会受到其他程序的干扰,导致自己的程序出现问题。Docker 就很好解决了环境隔离的问题,别人程序不会影响到自己的程序。
优势 3:通过镜像复制 N 多个环境一致容器
公司要弄一个活动,可能会有大量的流量进来,公司需要再多部署几十台服务器。
在没有 Docker 的情况下,要在几天内部署几十台服务器,这对运维来说是一件非常折磨人的事,而且每台服务器的环境还不一定一样,就会出现各种问题,最后部署地头皮发麻。用 Docker 的话,我只需要将程序打包到镜像,你要多少台服务,我就给力跑多少容器,极大地提高了部署效率。
虚拟机 Virtual Machine 与容器化技术(代表 Docker)都是虚拟化技术,两者的区别在于虚拟化的程度不同。

可以看出虚拟机非常庞大,重,虚拟机操作系统的环境依赖虚拟机操作系统,虚拟机操作系统依赖虚拟机,虚拟机依赖主机操作系统。获取和传递资源经历每一层
而 Docker 直接依赖操作系统,直接请求操作系统获取数据
虚拟机是在物理资源层面实现的隔离,相对于虚拟机,Docker 是 APP 层面实现的隔离,并且省去了虚拟机操作系统(Guest OS),从而节省了一部分的系统资源;Docker 守护进程可以直接与主操作系统进行通信,为各个 Docker 容器分配资源;它还可以将容器与主操作系统隔离,并将各个容器互相隔离。虚拟机启动需要数分钟,而 Docker 容器可以在数毫秒内启动。由于没有臃肿的从操作系统,Docker 可以节省大量的磁盘空间以及其他系统资源。
虚拟机与容器 Docker 的区别,在于 vm 多了一层 guest OS,虚拟机的 Hypervisor 会对硬件资源也进行虚拟化,而容器 Docker 会直接使用宿主机的硬件资源。
下面我们采用形象的比喻区分两者的隔离级别:
在于隔离性上面,由于 vm 对操作系统也进行了虚拟化,隔离的更加彻底。而 Docker 共享宿主机的操作系统,隔离性较差。
由于 vm 的隔离操作,导致生成虚拟机的速率大大低于容器 Docker 生成的速度,因为 Docker 直接利用宿主机的系统内核。比如 openstack 能够以 10 台 /min 的速度创建虚拟机,而 Docker 可以做到在几秒钟之内创建大量容器,它们的启动速度是在数量级上的差距。
因为虚拟机增加了一层虚拟硬件层,运行在虚拟机上的应用程序在进行数值计算时是运行在 Hypervisor 虚拟的 CPU 上的;另外一方面是由于计算程序本身的特性导致的差异。虚拟机虚拟的 CPU 架构不同于实际 CPU 架构,数值计算程序一般针对特定的 CPU 架构有一定的优化措施,虚拟化使这些措施作废,甚至起到反效果。
在资源利用率上虚拟机由于隔离更彻底,因此利用率也会相对较低。
因为虚拟机增加了一层虚拟硬件层,运行在虚拟机上的应用程序在进行数值计算时是运行在 Hypervisor 虚拟的 CPU 上 的;另外一方面是由于计算程序本身的特性导致的差异。虚拟机虚拟的 CPU 架构不同于实际 CPU 架构,数值计算程序一般针对特定的 cpu 架构有一定的优化措施,虚拟化使这些措施作废,甚至起到反效果。比如对于本次实验的平台,实际的 CPU 架构是 2 块物理 CPU。

Docker 官方的 logo 是鲸鱼,即是 Docker 引擎。
鲸鱼身上的箱子:代表日后咱们通过 Docker 启动一个一个软件环境 MySQL,一个软件环境称之为一个容器。容器与容器隔离,互相之间互不影响,对进程封装隔离,保证容器与容器的独立性。
| 传统虚拟机 | Docker 容器 | |
|---|---|---|
| 磁盘占用 | 几个 GB 到几十个 GB 左右 | 几十 MB 到几百 MB 左右 |
| CPU 内存占用 | 虚拟操作系统非常占用 CPU 和内存 | Docker 引擎占用极低 |
| 启动速度 | (从开机到运行项目)几分钟 | (从开启容器到运行项目)几秒 |
| 安装管理 | 需要专门的运维技术 | 安装、管理方便 |
| 应用部署 | 每次部署都费时费力 | 从第二次部署开始轻松便捷,第一次慢些 |
| 耦合性 | 多个应用服务安装到一起,容易互相影响,争夺资源 | 每个应用服务一个容器,达成隔离 |
| 系统依赖 | 无 | 需求相同或类似的内核,目前推荐是 Linux |
仓库、镜像、容器的关系

Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。就好似 Java 中的类和对象,类就是镜像,容器就是对象!
Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。
它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。
可以把容器看做是一个简易版的 Linux 环境(包括 root 用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序
容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
仓库(Repository)是集中存放镜像文件的场所。
仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式
最大的公开仓库是 Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云、网易云等
小结:
Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎 image 镜像文件。只有通过这个镜像文件才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
image 文件生成的容器实例,本身也是一个文件,称为镜像文件。
一个容器运行一种服务,当我们需要的时候,就可以通过 Docker 客户端创建一个对应的运行实例,也就是我们的容器。
至于仓库,就是放了一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候从仓库中拉下来就可以了。


https://www.pdai.tech/md/devops/docker/docker-01-docker-vm.html
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。