虚拟化
1.虚拟化发展史
早期一台一台物理机通常只能运行一个操作系统,大多数的应用程序像web服务、网站等等只能解决用户的一个需求。这就意味着如果想要部署两个不同地址的应用时需要使用两台服务器,每台服务器都需要部署应用程序、数据库等等。如果服务端感觉到压力时增加物理机实现应用程序的水平扩容,一方面每次增加物理机都要重新安装相应的软件应用程序;另一方面每个物理的资源其实并没有被有效利用。
为了解决应用程序和物理机只能一一对应的问题,web服务器、数据库等等基础层应用开始提供逻辑隔离功能:允许一个基础层上同时支撑多个应用。比如:单个数据库可以提供完全隔离的多个逻辑数据库。基于虚拟化技术,可以将逻辑上隔离的应用部署到同一台物理机上。
随着 Linux 在服务器领域越来越流行,操作系统虚拟化也逐渐发展起来,它允许在一台物理机上同时运行多个操作系统。在这种新的模型下,一台物理机上的每个应用程序都可以拥有自己的操作系统和运行环境,这就是虚拟机技术。 后来前辈们把进程“装箱”到了一个操作系统不同的资源子集当中,于是容器化技术诞生了。容器直接运行在操作系统内核之上的用户空间,因此容器虚拟化也被称为“操作系统级虚拟化”,它可以让多个独立的用户空间运行在同一台宿主机上。由于“客居”操作系统所以只能运行与底层宿主机相同或者类似的操作系统。
2.虚拟机和容器的比较
在服务器或者大型计算机集群中,往往需要运行大量作业和应用,为保证这些作业和应用的进程之间互不干扰,人们尝试使用了资源隔离技术来为各个应用进程划定固定的资源空间,使得进程运行范围被限制在有限空间内,由此就保证了进程的运行不受其他进程的干扰。这其中被广泛使用的技术包括虚拟机技术和容器技术,这两种技术都属于虚拟化的范畴,但是实现的机理和运行效率却相差悬殊。
与虚拟机相比,容器更轻量且速度更快,因为它利用了 Linux 底层操作系统在隔离的环境中运行。虚拟机的 hypervisor 创建了一个非常牢固的边界,以防止应用程序突破它,而容器的边界不那么强大。
另一个区别是,由于 Namespace 和 Cgroups 功能仅在 Linux 上可用,因此容器无法在其他操作系统上运行。那Docker 如何在 macOS 或 Windows 上运行? Docker 实际上使用了一个技巧,并在非 Linux 操作系统上安装 Linux 虚拟机,然后在虚拟机内运行容器。