Docker入门知识|Docker资源容器 与 VM虚拟机的区别与联系

炎黄科技

2019-01-06 00:18
关注

身体大数据时代,我们几乎每个人都得了解一下虚拟机与大数据平台。趋势如此,要不什么也很难前行。的确如此,从网格运算思想的出现,再到了后来virtual-box、VMware、kvm、virtual PC等等方案。到了前两年,也许是因为是亚马逊公司太过尊大,虚拟机的集成方案cloudstack、openstack、zstack应运而生。在技术层面本并不是一种太过神秘的技术,只是有了资本的介入,这虚拟机之上的计算技术竟然炒到“虚拟机成就了信息技术的革命新时代”!

一、虚拟机思想并不复杂,可以把一台计算机分隔成若干台机器使用;

计算机技术多任务运算并不是一项新概念,只不过扩大子当初多任务的粒度而已。计算机系统软件将所有硬件资源统一一处,再将这些资源化整为零分为多个小的计算区,每一个区都可以独立运算。是不是人类聪明了,计算机也就被累得半死。

图:虚拟机将计算机化整为零

所谓虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能、并可以运行在一个完全隔离环境中的完整计算机系统。虚拟机就是相对于传统计算机而言的计算机概念,一个非实体的计算机,但具有所有传统计算机的功能。

虚拟机系统可以通过生成现有操作系统的全新虚拟镜像(比如iso),也就是一个大个头的文件。对于windows操作系统而言,它具有真实windows系统完全一样的功能。对于linux/unix系统,也是如此,一个linux(unix系统)被分隔为多个相对独立的小系统(麻雀虽小却五脏俱全)。进入虚拟系统后,所有操作都是在这个全新的独立的虚拟系统里面进行,可以独立安装运行软件,保存数据,甚至拥有自己的独立桌面互动操作,却不会对真正的宿主系统产生任何影响 ,更为方便的是这种系统具有能够在宿主系统与虚拟镜像之间灵活切换。虚拟系统和传统的虚拟机(Parallels DesktopVmwareVirtualBoxVirtual pc、kvm)存在不同。

图:ubuntu下virtualbox-windiws综

具体就在于:虚拟系统不会大量降低电脑的性能,启动虚拟系统不需要像启动windows/linux系统那样耗费时间,运行程序更加方便快捷;虚拟系统只能模拟和现有操作系统相同的环境,而虚拟机则可以模拟出其他种类的操作系统(比如在笔者的宿主ubuntu下用virtualbox来运行windowsxp)。缺点也不是没有的,虚拟机计算需要多了一个虚拟机与宿主机模拟底层之间的交换层,所以在应用程序运行速度上比虚拟系统慢得多。但是值得相信的是,现在的硬件越来越快,应该可以不考虑这占损失就好了,尤其还会有未来的量子计算机产生。

不得不说说的linux-kvm。

QEMU-KVM:从前面对KVM内核模块的介绍知道,它只负责CPU和内存的虚拟化,加载了它以后,用户就可以进一步通过工具创建虚拟机(KVM提供接口),当然仅有KVM还是不够的,用户还无法直接控制内核去做事情(KVM只提供接口功能,至于怎么创建虚拟机,分配vCPU等并不在它上面进行),因此还必须有个运行在用户空间的工具,KVM的开发者选择了比较成熟的开源虚拟化软件QEMU来担当了用户空间工作的工具。QEMU-KVM也就这样出现了。

在QEMU-KVM中,KVM运行在内核空间;QEMU运行在用户空间,实际模拟创建,管理各种虚拟硬件。QEMU将KVM整合了进来,通过/ioctl 调用 /dev/kvm,从而将CPU指令的部分交给内核模块来做,KVM实现了CPU和内存的虚拟化,但kvm不能虚拟其他硬件设备,因此qemu承担起模拟IO设备(磁盘,网卡,显卡等)的作用,KVM加上QEMU后就是完整意义上的服务器虚拟化。当然,由于qemu模拟io设备效率不高的原因,现在常常采用半虚拟化的virtio方式来虚拟IO设备。

二、容器技术--一种比传统虚拟机更伟大的计算资源利用管理技术

有了虚拟机vm的长期网红,容器技术很快就被程序高手们挖掘出来。Cgroup被引入linux系统的内核体系,随之基于cgroup的应用就多了起来!也许很多朋友一开始只希望用这个cgroup来实行操作系统层面资源隔离,从而形成linux系统下多用户使用中的资源安全。可是GO语言出来之后,喜欢尝鲜的程序员,用GO写出了docker这大型工具。GO的新生面孔与Docker强大未来前途,一下子把高密度运算带到了一个新高度。

其实在c语言中的Namespaces是不是在Cgroup面前有点似曾相识的味道?

回头来看,虚拟化技术的长期使用,已经成为一种被大家广泛认可的服务器资源共享方式,它可以在按需构建操作系统实例的过程当中为系统管理员提供极大的灵活性。这样的特点为满足了投资者缩减成本的需求,也满足了管理人员的希望。但这种是基于hypervisor虚拟化技术的。hypervisor作为一个中间件充当一种运行在物理服务器和操作系统之间的中间软件层,其根本任务就在于允许多个操作系统和应用程序共享一套基础物理硬件(比如硬盘、内存、cpu、通讯总线等),它可以协调计算任务访问服务器上的所有物理设备和虚拟机,因此有时间人们又叫它是虚拟机监视(控)器(Virtual Machine Monitor)。Hypervisor是所有虚拟化技术的核心,非中断地支持多工作、多负载迁移的能力是Hypervisor的基本功能。每当服务器启动执行Hypervisor这个进程时,它会给每一台虚拟机分配适量的内存、CPU、网络和磁盘,并加载所有虚拟机的客户操作系统。

hypervisor仍然存在一些性能和资源使用效率方面的小问题,在大运算量有时候就成了一种瓶颈与制约,因此基于容器(Container)的新型虚拟化技术成为真实的新晋网红。这个网红代表就是Docker。

图:我们身边的Docker容器

如今Docker的使用已经非常普遍,特别在超级一线的互联网公司。使用Docker技术的优势可以帮助企业快速地扩展服务,从而实现弹性部署计算业务的能力。在云服务理念兴起之后,Docker的使用场景和范围进一步得到发展,如今微服务架构又流行起来,微服务+Docker再次成为完美组合,快速交付、快速布署、简捷运维部署一股脑儿就落地了。

图:docker的服务逻辑

值得强调的是,Docker是基于原生多cpu系统开发出来的容器,多任务处理,多资源整合天生强项!正因为这样的因素,编写他的开发工具,GO-lang也因此功成名就。

细说Docker。

Docker 是世界领先的软件容器平台。开发人员利用 Docker 消除了协作编码时“只在我的机器上可正常工作”的问题。对于运维人员而言,利用 Docker 可以在隔离容器并行运行和管理应用,获得更好的计算密度。企业利用 Docker 可以构建敏捷的软件交付方式,以高速度、高安全性、高可靠性地为 Linux 和 Windows Server 应用发布新功能,跨平台一气通吃。

Docker 属于 Linux 容器的一种封装,成套地提供了简单易用的容器使用接口。它是事实上目前最流行的 Linux 容器方案。Docker 将应用程序以及该程序运行的依赖计算环境,打包在了一个镜像文件之中。只要运行这个镜像文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就如同在真实的物理机上运行一样。

另外的优势就是,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。利用容器接口还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样方便快捷,当然前提是你必须学好docker的所有知识。

为什么要优先使用Docker,而不是虚拟机呢?

在性能上讲,容器除了运行其中应用外,基本不消耗额外的系统资源。就连虚拟机中 hypervisor 支持也节省了。因此使得应用的性能进一步提高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个安全隔离的应用就可以了。

其它Docker 的好处就在这里了。

图:docker的优势

更快速的交付和部署。对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器轻量级的,快速是原生特性。容器的启动时间秒级水平,大量地节约了开发、测试、部署时间。

更高效的虚拟化。Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。这一条是docker最伟大的地方。

更轻松的迁移和扩展。Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等等。 这种兼容性可以让用户“一次建设跑遍全天下成为事实”,最终简的方法就是把一个应用程序从一个平台直接复制迁移到另外一处即可 。

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

图:docker容器

Docker 与虚拟机对比下看看容器与虚拟机(VM)的效率。

VM是一个运行在宿主机之上的完整的操作系统,VM运行自身操作系统会占用较多的CPU、内存、硬盘资源。Docker不同于VM,只包含应用程序以及依赖库,基于libcontainer运行在宿主机上,并处于一个隔离的环境中,这使得Docker更加轻量高效,启动容器只需几秒钟之内完成。由于Docker轻量、资源占用少,使得Docker可以轻易的应用到构建标准化的应用中。虽然Docker目前还不够完善,比如隔离效果不如VM,还需要共享宿主机操作系统的一些基础库等(这可能与还不够完善GO-lang有关);网络配置功能相对简单,主要以桥接方式为主。

图:docker容器与VM间的不同

Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

相对kvm等等虚拟化方式,作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式具有众多优势。Docker 容器的启动可以在秒级实现;Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。

三、虚拟化技术下的云技术方案

有了虚拟化技术,然后有了虚拟化技术的综合应用平台,比如openstack、cloudstack、zstack......当然还有lxd、juju、Kubernetes......

图:openstack结构

当然Kubernetes最新鲜的云综合管理方案。Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。

图:kubernetes的新生力量

在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。如果计划开展Kubernetes学习,我们真需要认真了解Kubernetes方方面面的各种技术了!

Kubernetes......

举报/反馈