Docker不是一种虚拟化方法。它依赖于实际实现基于容器的虚拟化或操作系统级虚拟化的其他工具。为此,Docker最初使用的是LXC驱动程序,后来改为libcontainer,现在更名为runc。Docker主要关注应用程序容器内应用程序的自动化部署。应用程序容器设计用于打包和运行单个服务,而系统容器设计用于运行多个进程,如虚拟机。因此,Docker被认为是容器化系统上的容器管理或应用程序部署工具。
为了了解它与其他虚拟化有什么不同,我们来看看虚拟化及其类型。那么,就更容易理解其中的区别了。
虚拟化
在其构思形式中,它被认为是一种逻辑划分大型机的方法,以允许多个应用程序同时运行。然而,当公司和开源社区能够提供一种以某种方式处理特权指令的方法,并允许多个操作系统在一个基于x86的系统上同时运行时,情况发生了巨大的变化。
管理程序
虚拟机监控程序负责创建来宾虚拟机运行的虚拟环境。它监督来宾系统,并确保在必要时为来宾分配资源。虚拟机监控程序位于物理机和虚拟机之间,为虚拟机提供虚拟化服务。为了实现它,它拦截虚拟机上的来宾操作系统操作,并模拟主机操作系统上的操作。
虚拟化技术的快速发展(主要是在云端)进一步推动了虚拟化的使用,它允许在Xen、VMware Player、KVM等虚拟机监控程序的帮助下,在一台物理服务器上创建多个虚拟服务器,并将硬件支持纳入商品处理器中,比如英特尔VT和AMD-V。
虚拟化的类型
虚拟化方法可以根据其模拟客户操作系统硬件和模拟客户操作环境的方式进行分类。主要有三种类型的虚拟化:
模仿
这类示例包括VMware Player、VirtualBox、QEMU、Bochs、Parallels等。
半虚拟化
半虚拟化,也称为1型虚拟机监控程序,直接在硬件或裸机上运行,并直接向其上运行的虚拟机提供虚拟化服务。它帮助操作系统、虚拟化硬件和真实硬件协作以实现最佳性能。这些虚拟机监控程序通常占用的空间很小,而且本身不需要大量资源。
这一类的例子包括Xen、KVM等。
基于容器的虚拟化
基于容器的虚拟化,也称为操作系统级虚拟化,支持在单个操作系统内核中执行多个独立的执行。它具有尽可能最好的性能和密度,并具有动态资源管理功能。这种类型的虚拟化提供的隔离虚拟执行环境称为容器,可以被视为一组跟踪的进程。
容器的概念是由Linux内核2.6.24版中添加的名称空间特性实现的。容器向每个进程添加其ID,并向每个系统调用添加新的访问控制检查。可以通过
克隆()
允许创建以前全局命名空间的单独实例的系统调用。
名称空间可以以多种不同的方式使用,但最常见的方法是创建一个孤立的容器,该容器无法查看或访问容器外的对象。容器中运行的进程似乎是在普通的Linux系统上运行的,尽管它们与位于其他名称空间中的进程共享底层内核,对于其他类型的对象也是如此。例如,在使用名称空间时,容器内的root用户不会被视为容器外的root用户,从而增加了额外的安全性。
Linux控制组(cgroups)子系统是支持基于容器的虚拟化的下一个主要组件,用于对进程进行分组并管理它们的总资源消耗。它通常用于限制容器的内存和CPU消耗。由于容器化Linux系统只有一个内核,并且内核对容器具有完全可见性,因此只有一个级别的资源分配和调度。
Linux容器有几种管理工具,包括LXC、LXD、systemd nspawn、lmctfy、Warden、Linux VServer、OpenVZ、Docker等。
容器与虚拟机
与虚拟机不同,容器不需要启动操作系统内核,因此可以在不到一秒钟的时间内创建容器。与其他虚拟化方法相比,此功能使基于容器的虚拟化具有独特性和可取性。
由于基于容器的虚拟化几乎不会给主机增加开销,因此基于容器的虚拟化具有接近本机的性能
与其他虚拟化不同,基于容器的虚拟化不需要额外的软件。
主机上的所有容器共享主机的调度程序,从而节省额外资源的需要。
与虚拟机映像相比,容器状态(Docker或LXC映像)的大小较小,因此容器映像易于分发。
容器中的资源管理是通过cGroup实现的。cGroup不允许容器消耗超过分配给它们的资源。然而,到目前为止,主机的所有资源都在虚拟机中可见,但无法使用。这可以通过运行
top
或
htop
同时在容器和主机上。所有环境中的输出看起来都是相似的。
更新:
Docker如何在非Linux系统中运行容器?
如果容器因为Linux内核中的可用特性而成为可能,那么显而易见的问题是非Linux系统如何运行容器。Docker for Mac和Windows都使用Linux虚拟机来运行容器。Docker工具箱用于在虚拟机中运行容器。但是,最新的Docker在Windows和Hypervisor中使用Hyper-V。Mac中的框架。
现在,让我详细描述Docker for Mac如何运行容器。
https://github.com/moby/hyperkit
为了模拟hypervisor功能,Hyperkit使用hypervisor。其核心是框架。管理程序。框架是Mac的本机管理程序解决方案。Hyperkit还使用VPNKit和DataKit分别为网络和文件系统命名。
Docker在Mac中运行的Linux虚拟机是只读的。但是,您可以通过运行以下命令来实现:
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
.
现在,我们甚至可以检查这个虚拟机的内核版本:
# uname -a
Linux linuxkit-025000000001 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:86_64 Linux
.
所有容器都在这个虚拟机中运行。
虚拟机监控程序有一些限制。框架因为Docker不会暴露
docker0
Mac中的网络接口。因此,您无法从主机访问容器。到目前为止,
docker0
仅在虚拟机内部可用。
Hyper-v是Windows中的本机虚拟机监控程序。他们还试图利用Windows 10的功能在本地运行Linux系统。