如果 Docker 在 windows 上本地运行,那么为什么它需要 hyper-v

If Docker runs natively on windows, then why does it need hyper-v

如果 Docker 社区 运行 本身就在 windows 上,那么它为什么需要 Hyper-v?即,本机是否暗示 Docker-Engine 可以 运行 对 windows 的指令?在我看来,它仍然启动了一个 Linux VM 并且 运行s with-in that.

对我来说,似乎 docker-toolbox 使用 oracle hyper-visor 运行ning linux,而 Docker 社区使用 Hyper-V 运行宁linux。我还忽略了另一个重要的区别吗?

这是正确的吗?我对 "native" 这个词的理解有误吗,docker 是否误用了这个词,还是我遗漏了其他方面?

我问这个问题的原因是因为我注意到您没有将 Docker-machine 与社区版一起使用,我想知道为什么会这样。 docker-machine 是 运行 在 windows 上的东西,而 Docker 引擎不是吗?我认为 docker 这个词用词过多,在这种情况下可能会导致混淆 :)

提前致谢!

我的理解是 Hyper-V 是 windows' 虚拟机解决方案的实现。

Docker 运行ning on windows 'natively' 表示它不需要安装第三方软件,例如 virtualbox、vmware fusion 或 parallels 以 运行,而是使用 windows 10.

附带的 Hyper-V 软件

Docker 对 Windows 的支持有多种变体:

  1. Docker 工具箱 其中包括 Docker 将在 VirtualBox 中启动 boot2docker 映像的机器。这些是 Linux 容器 运行 VM 中的 Linux 内核。这最初是 Windows 用户的唯一选择。

  2. Docker for Windows 使用 Hyper-V 到 运行 Moby 虚拟机,基于 Linux套件,到运行Linux张图片。 LinuxKit 提供了一个基于容器的 Linux OS,并且有一些集成使其看起来不像最终用户的 VM,例如您可以使用 127.0.0.1 而不是 VirtualBox VM 的 IP。如果您有可用的 Hyper-V 并希望在 Windows 上 运行 Linux 容器,这是首选选项。

  3. Windows Server Containers which 运行 Windows binaries on the same host OS, similar Linux Linux OS 上的容器如何不需要 VM。

  4. Hyper-V 容器 其中 运行 Windows 二进制文件位于单独的 VM 内以进行额外隔离。

您可以在 Microsoft's docs 中阅读有关后两个选项的更多信息。

需要注意的重要一点是,当您在受支持的服务器(如 2016)上为 Windows 安装 Docker 时,您可以在选项 2、3 和 4 之间切换。对于 Linux 和 Windows 容器,有一个 switch in the settings 会影响所有 运行ning 容器和命令。在 Windows 服务器容器和 Hyper-V 容器之间,docker run 命令行上有一个 --isolation 选项。所以我相信即使您只想要选项 3,您也需要 Hyper-V 支持来涵盖 2 和 4。

Windows 服务器容器需要在 Windows 10 上进行 Hyper-V 隔离,以便为开发人员提供将在生产中使用的相同内核版本和配置,有关更多信息,请访问关于 Windows container page.

对 Windows 上的 Docker 的支持不是原生的,Docker 最初被写为 Linux 上的 运行。所以 运行ning Docker CE on Windows 的要求是:

  1. 必须启用虚拟化,因为 docker-ce 在 Hyper-V 上创建 VM。由于所有管理程序都需要启用硬件虚拟化,因此 Hyper-V 在这方面也不例外。 Docker for Windows 安装程序将为您启用 Hyper-V,如果需要,并重新启动您的机器。

  2. 对于不支持硬件虚拟化的旧 Windows 系统,建议使用 Docker Toolbox,它使用 Oracle Virtualbox 启动将托管 [=29] 的 VM =] 容器而不是 Hyper-V。

Windows 除了 "Hyper-v Isolation".

之外还支持 "Process Isolation"

Windows 运行 上的进程隔离容器,无需额外的虚拟化层(类似于您可能习惯于 linux 上的 docker);我相信这就是 OP 在提到 "native" 容器时所寻找的。

进程隔离支持仍然是相当新的,但是 Windows Server 2019 和 Windows 10 的最新版本确实可以 运行 windows 容器而无需额外的开销hyper-v 虚拟主机。需要注意的一件事是,您的 windows 容器基础映像内核版本必须与主机上的内核版本相匹配。因此,您可能无法简单地使用与 运行 在 hyper-v.

上完全相同的容器

这里有一个 Windows container version compatibility table 突出显示了哪些主机操作系统支持 processhyperv 隔离。

即使此^页面未指明,Windows 10 更新 1809 是第一个支持 Docker 进程隔离 的更新,如Docker Engine Release Notes.

我知道我迟到了,但同样的问题最近一直困扰着我的新手,所以这是我的 2 美分。

简答

即使我们说我们永远不会在 Windows 上启动 Linux 容器或使用 Hyper-V 隔离模式,有一件事仍然存在,即 Hypervisor 是 需要。我说的是 vNICWindows container networking 向我们展示了它是 Windows 服务器容器不可或缺的一部分。

长答案

据我了解,这里有两个关键组件使 Windows 上的 Native 容器成为可能:

  1. Host Compute Service and Host Network Service 作为低级功能之上的抽象层实现。服务协同工作以创建容器并将端点附加到网络。
  2. Server Silo 是一项主要功能,可让本机容器成为 'isolated'。如果我没记错的话,该功能在不同的地方也被称为容器用户模式或命名空间。 Windows Containers Internals.
  3. 中给出了很好的概述

至于 Networking,每个容器都有一个连接到 Hyper-V 虚拟交换机 (vSwitch) 的虚拟网络适配器 (vNIC),所以我猜这是您仍然使用的主要技术原因需要 Hyper-V 的东西。

Docker 在 Linux 上进化。 Docker 试图在 Windows.

上支持容器化引起了很多混淆

一个容器被认为是“原生的”,如果它可以 运行 直接在主机操作系统上。

Linux 容器:一个 Linux 应用程序,运行 处于隔离的 Linux 环境中。
同样的容器可以在 Windows 上 运行 使用虚拟化来模拟 Linux 环境,但容器在 Linux 上仍然是 运行ning。这个虚拟化可以

  • VirtualBox(Docker 工具箱)
  • Hyper-V 后端(Docker 桌面)
  • WSL2 后端(Docker 桌面)

Windows(服务器)容器:一个 Windows 应用程序,运行 处于隔离的 Windows 环境中。

  • 进程隔离——这是容器的“传统”隔离模式。它与 Linux 容器 运行 在 Linux
  • 上的方式大致相同
  • Hyper-V 隔离 - 这种隔离模式在主机和容器版本之间提供增强的安全性和更广泛的兼容性。

如您所见,Hyper-V 可用于 运行 甚至本机 Windows 容器,这通常是混淆的根源。

此外,docker-machine 是被取代的产品。

Machine was the only way to run Docker on Mac or Windows previous to Docker v1.12. Starting with the beta program and Docker v1.12, Docker Desktop for Mac and Docker Desktop for Windows are available as native apps and the better choice for this use case on newer desktops and laptops.

有关大部分术语、技术和参考资料的高级概述,请参阅 Docker Container in Linux and Windows