02-Docker 容器和虚拟机的区别
1、虚拟机(VM)
虚拟机是共享一个服务器的物理资源的操作系统。它是主机硬件上的 Guest
,因此也被称为 Guest
虚拟机。
虚拟机由几层组成。支持虚拟化的层是 hypervisor
。hypervisor
是一种虚拟化服务器的软件。
1.1、虚拟机是怎么工作的
运行应用程序所需的一切都包在虚拟机里,如:虚拟化的硬件,操作系统以及任何所需的二进制文件和库。因此,虚拟机具有自己独立的基础架构。
1.2、虚拟机的优势
虚拟机可减少在服务器设备上的支出,可以利用一个物理服务器资源切分成多个独立的虚拟机来完成许多工作。
由于只有一台主机,因此可以利用虚拟机管理程序的集中功能高效地管理所有虚拟环境。这些系统完全相互独立,这意味着你可以在不同的虚拟机里安装不同的系统环境。
最重要的是,虚拟机与主机操作系统隔离,是进行实验和开发应用程序的安全场所。
1.3、虚拟机的劣势
虚拟机占用主机大量的系统资源。虚拟机的大小为数GB,在虚拟服务器上运行单个应用程序意味着还要运行 Guest OS
以及 Guest OS
运行所需的所有硬件的虚拟副本。这样就增加了很多RAM
和CPU
资源消耗。
迁移虚拟机上运行的应用程序的过程也可能很复杂,因为它始终附加在操作系统上。因此,必须同时迁移应用程序和操作系统。
同样,在创建虚拟机时,系统管理程序会分配专用于VM的硬件资源。不过与运行单独的实体服务器相比,这仍然是经济的。
2、容器
容器是一个不依赖于操作系统,运行应用程序的环境。它通过 Linux 的 Namespaces
和 Cgroups
技术对应用程序进程进行隔离和限制的。
Namespace
的作用是隔离,它让应用进程只能看到该Namespace
内的世界;Cgroups
的作用是限制分配给进程的宿主机资源,它给这个世界围上了一圈看不见的墙。
但对于宿主机来说,这些被“隔离”了的进程跟其他进程并没有太大区别。容器只是运行在宿主机上的一种特殊的进程,多个容器之间使用的还是同一个宿主机的操作系统内核。
关于Namespaces
和Cgroups
这里你只知道他们是启动隔离和限制应用进程的就行了。
简单来说:docker 把电脑中的网络、存储等分成几份,并虚拟成容器,我们的软件运行在容器中,每个容易只占用电脑的部分所需要的资源,并不是一个完整的电脑。
2.1、容器是怎么工作的
通过 Mount Namespace
可以修改容器进程对自己的文件系统 **”挂载点”**。在容器进程启动之前都会重新挂载它的整个根目录 **”/“**(通过pivot_root
系统调用改变进程的文件系统,如果系统不支持,则使用chroot
),而由于Mount Namespace
的存在,这个挂载对宿主机不可见的。
这个挂载在容器根目录上、用来为容器进程提供隔离后执行环境的文件系统,就是所谓的“容器镜像”。它还有一个更为专业的名字,叫做:rootfs
(根文件系统)。rootfs
只是一个操作系统所包含的文件、配置和目录,并不包括操作系统内核。
所以说,**rootfs
只包括了操作系统的”躯壳”,并没有包括操作系统的内核**。同一台机器上的所有容器,都会共享宿主机操作系统的内核。
这就意味着,如果容器里的应用程序需要配置内核参数、跟内核进行直接的交互,这些都是操作的宿主机操作系统的内核,它对于该机器上的所有容器来说是一个“全局变量”,牵一发而动全身。
这也是容器相比于虚拟机的主要缺陷之一:毕竟虚拟机有模拟出来的硬件机器充当沙盒,而且每个虚拟机里还运行着一个完整 Guest OS
让应用随便折腾。
不过由于 rootfs
里打包的不只是应用,而是整个操作系统的文件和目录,也就意味着,应用以及它运行所需要的所有依赖,都被封装在了一起。这就赋予了容器所谓的一致性:无论在本地、云端,还是在一台任何地方的机器上,用户只需要解压打包好的容器镜像,那么这个应用运行所需要的完整的执行环境就能被重现出来。
2.2、容器的优势
容器占用的大小比虚拟机小很多,甚至可以小到10MB,可以轻松限制容器的内存和CPU使用率。与部署应用需要部署整个操作系统的虚拟机相比,容器非常轻巧且启动迅速。这样让我们可以快速扩展容器并添加相同的容器。
同样,容器对于持续集成和持续部署(CI/CD)实施也是极好的选择。他们通过在开发人员之间分发和合并镜像来促进协作开发。
2.3、容器的劣势
容器无法提供与虚拟机相同的安全性和稳定性。由于它们共享主机的内核,因此不能像虚拟机一样完全隔离。
容器是进程级的隔离,一个容器可以通过影响宿主机内核的稳定性来影响其他容器。
一旦容器执行了任务,它就会关闭并删除其中的所有数据。如果希望数据保留下来,则必须使用”数据卷”进行保存,这需要在主机上进行手动配置。
2.4、为什么 Docker 会比 VM 虚拟机快
docker 有着比虚拟机更少的抽象层。
由于 docker 不需要 Hypervisor(虚拟机) 实现硬件资源虚拟化,运行在 docker 容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。docker 利用的是宿主机的内核,而不需要加载操作系统OS内核。
当新建一个容器时,docker 不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程是分钟级别的。而 docker 由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个 docker 容器只需要几秒钟。
容器还是虚拟机
上面我们列出了容器和虚拟机各自的优势和劣势,我们在因为优势选择了其一后默认就要其忍受劣势所带来的副作用,凡事都有两面性没有东西可以只有优点没缺点的。
就虚拟机来说,因为其完整的隔离和安全性虚拟机通常用于要求苛刻的应用程序,网络基础结构以及能消耗VM大部分资源的应用程序。
容器通常用于Web应用,微服务。从运作原理上来看,docker 更加的轻量级,虚拟机更加的笨重,docker 启动也十分的快,部署起来也方便。
下边是一张虚拟机和docker的对比,这里要注意一下:docker 本身并不是容器,而是创建容器的工具;而虚拟机它就是虚拟机了。