【docker学习系列二】docker vs 虚拟机:本质的区别

搞清楚docker和虚拟机的区别是有意义的,这并不是说一方将取代一方,事实上,这两种技术在可预计的将来将会共存。学习他们的区别有助于我们更好的理解和使用它们。

这里引用《Kubernetes in Action》中的两个图片,这两张图片很细节的对比了docker和虚拟机的运行机制,比网络上的其他图更能反映本质。

首先,虚拟机在宿主机操作系统(host os)上运行一个管理程序(称为hypervisor),它管理多个虚机操作系统。每个虚机都运行着一个完整的发行版本的操作系统,包括内核+二进制和依赖库等组成。在每个虚拟机之上,都运行着一个或多个服务。想要更好的了解虚拟机的底层实现原理(深入浅出、通俗易懂)请转到 --> 虚拟机是怎么实现的? - 高鹏的回答 - 知乎

【docker学习系列二】docker vs 虚拟机:本质的区别_第1张图片
再来看docker容器,明显比虚拟机更加轻量。容器本质上是宿主机操作系统之上的一个进程,镜像本质上是隔离的二进制和依赖库,这也就不难理解为何docker镜像要明显比系统镜像要小。如何做到的呢?如果对Linux操作系统了解就不难理解。诸如centos、ubuntu这些系统是linux的发行版本,他们都使用了共同的linux的内核(内核的版本称为内核版本,通过uname -r可以查看)。centos、ubuntu这些操作系统包括了内核和“其他软件”(包括系统实用程序、应用程序、shell以及公用函数库等)。docker镜像就是这里的“其他软件”。

此外,为了进一步压缩空间,docker镜像是分层的、共用的。也就是说不同的app可以建立在不同的容器内部,而不同的容器可以基于相同的镜像实例化。这样在隔离app的同时,降低了开销。

然而,docker在轻量的同时也带来了局限性。当镜像或者应用对于内核的版本有要求时,就不能在宿主机上实例化容器(可以通过虚拟机或者模拟器实现)。除此之外,虽然容器通过namespace和cgroup实现了命名空间隔离和资源限制,但是由于共用内核,因此会有安全隐患。所以我们看到,在公有云提供商的云主机业务中,是通过虚拟机来实现的。在不采用微服务架构的非互联网企业(如政府、学校、传统公司等等)中,使用虚拟化技术部署的私有云(VMware公司)几乎独占了市场。
【docker学习系列二】docker vs 虚拟机:本质的区别_第2张图片
简而言之,要性能,要微服务,要devops,选docker。而要安全、要兼容传统架构,选虚拟机。

扯远了,但这些是我对虚拟化技术与容器技术的理解。

你可能感兴趣的:(docker)