1.虚拟化和容器技术

Docker是⼀款以容器虚拟化技术为基础的软件,因此在了解有关 Docker 的概念知识和使⽤⽅法之前,虚拟化和容器技术是不可或缺的基础知识。

虚拟化

虚拟化技术就是将计算机物理资源进行抽象、转换为虚拟的计算机资源提供给程序使用。这里的计算机资源包括硬盘的存储资源、CPU的控制和运算资源、网卡的网络传输资源等等。

在虚拟化的实现中,需要着重提的就是虚拟机。所谓虚拟机,通常来说就是通过⼀个虚拟机监视器 ( Virtual Machine Monitor ) 的设施来隔离操作系统与硬件或者应⽤程序和操作系统,以此达到虚拟化的⽬的。这个夹在其中的虚拟机监视器,常常被称为 Hypervisor。虚拟机通过隔离程序和操作系统,将程序的指令转换为当前所在操作系统平台所能执⾏的指令,达到了不⽤对程序进⾏任何修改即可执⾏的⽬的。也正是这个原因 Java 虚拟机 JVM,PHP 虚拟机 HHVM 等等这些语⾔的程序都具有⾮常强的跨平台性。

当所有的指令都必须经过虚拟机监视器的处理。这也就意味着,虚拟机的性能是低下的,例如运⾏在 ZendVM 或者 HHVM 中的 PHP 程序,所有代码虽然编译成了 Opcode 码,但其依然是通过虚拟机才最终转换为机器所能识别的机器码去执⾏。这种效率的低下有时候是⽆法容忍的,为了解决这个问题,真实的虚拟机程序常常不完全遵循 虚拟机的设计结构,⽽是引⼊⼀些其他技术来解决效率问题。例如,在 VMware Workstation、Xen 中能够看到硬件辅助虚拟化的使⽤,通过让指令直达⽀持虚拟化的硬件,以此避开了效率低下的Hypervisor。⽽如 JRE、HPHP 中,除了基于 Hypervisor 实现的解释执⾏机制外,还有即时编译 ( Just In Time ) 运⾏机制,让程序代码在运⾏前编译成符合当前硬件平台的机器码,这种⽅式就已经不属于虚拟化的范畴了。

容器技术

按照分类或者实现方式来说,容器技术应该属于系统虚拟化的范畴,也就是由操作系统提供虚拟化支持。所谓容器技术就是能够让应用程序互不干扰的运行在独立的环境中,这个独立的运行环境就好像一个容器包裹住了应用程序。

容器技术在性能上要远超虚拟机等其他的虚拟化实现,因为容器技术不需要指令的转换。由于没有指令转换,所以运行在容器中的应用必须支持在真实的操作系统上运行。所以容器技术并没有解决跨平台兼容的问题,并不是真正意上的虚拟化技术,但是容器提供了相对独立的应用运行环境和资源控制的功能,可以归其为实现不完全的虚拟化技术。
在这里插入图片描述
由于没有了虚拟操作系统和虚拟机监视器这两个层次,⼤幅减少了应⽤程序运⾏带来的额外消耗。

更准确的来说,所有在容器中的应⽤程序其实完全运⾏在了宿主操作系统中,与其他真实运⾏在其中的应⽤程序在指令运⾏层⾯是完全没有任何区别的。

既然容器中的程序需要运行在宿主机操作系统中,那么docker是如何实现跨平台的?
docker本身基于容器技术,但docker自身是跨平台的。
docker是一个引擎,是基于内核的一种技术。比如Linux内核,那么它就只关心是不是Linux内核,它不关心你是Ubuntu还是CentOS。所以docker也实现了和操作系统的解耦。而在docker的容器内的进程是直接运行于宿主机内核的,是不直接和操作系统打交道。

假设宿主是 Ubuntu,容器是 CentOS。CentOS 容器中的进程会直接向 Ubuntu 宿主内核发送 syscall,而不会直接或间接的使用任何Ubuntu 的 userland 的库。

这点和虚拟机有本质的不同,虚拟机是虚拟环境,在现有系统上虚拟一套物理设备,然后在虚拟环境内运行一个虚拟环境的操作系统内核,在内核之上再跑完整系统,并在里面调用进程。

还以上面的例子去考虑,虚拟机中,CentOS 的进程发送 syscall 内核调用,该请求会被虚拟机内的 CentOS 的内核接到,然后 CentOS 内核访问虚拟硬件时,由虚拟机的服务软件截获,并使用宿主系统,也就是 Ubuntu 的内核及 userland 的库去执行。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值