Windows 10 上的 Ubuntu:Docker 与 WSL

alv*_*gom 18 docker windows-10 windows-subsystem-for-linux

我知道目前可以通过两种不同的方式在 Windows 10 上运行 Ubuntu:

  1. 使用适用于 Linux 的 Windows 子系统 (WSL)。
  2. 为 Windows 10 安装 docker,并在 Ubuntu 中使用容器。

但是,我找不到一个易于理解的解释它们之间有什么区别(谈论应用程序),以及优缺点。

我发现了一篇关于在 WSL 上使用 docker 的帖子:Ubuntu via (Windows Linux Subsystem) 和 Docker。但我说的是直接在 Windows 10 上使用它。所以我将感谢有关这两个的任何信息。

Ric*_*ner 18

更新 2020/02/18 以反映 WSL2 中引入的更改

你好!Microsoft PM 在这里研究 WSL 和命令行。

WSL 允许您直接在 Windows 上运行本机、未经修改的 Linux ELF-64 二进制文件,并使您能够在 Windows“主机”操作系统上运行您喜欢的 Linux 工具。

WSL1 采取了在 NT 内核顶部添加 Linux 系统调用兼容层的方法,允许 Linux 二进制文件在 NT 上运行,与主机操作系统共享相同的底层文件系统、网络、进程列表等。

另一方面,即将发布的 WSL2 在 Linux 容器中运行发行版的二进制文件,在真正的 Linux 内核之上,在轻量级 VM 中,该 VM 仅分配其运行的应用程序所需的 RAM,然后将释放的 RAM 释放回主机操作系统。这提供了 100% 的 Linux 兼容性,并允许您的 Linux 工具以接近本机的性能运行,并消耗主机所需的最少资源,确保您的机器快速流畅地运行。

在 WSL2 之前,可以在 WSL1 中运行 Docker 客户端,使用它来驱动 Docker for Windows 在本地主机上的 Hyper-V 上运行,或者管理远程 Docker 服务器。但是由于许多技术原因,不能在 WSL1 上运行 Docker Engine。

但是,您可以在 WSL2 上的 Docker 中执行相同的操作,但如果您愿意,也可以在 WSL 之上运行 Docker 引擎本身。这是Docker 在 Windows 桌面上运行 Docker 的首选和未来路径

要了解有关 WSL 的更多信息,请在此处查看视频和文档:https : //aka.ms/learnwsl


Not*_*1ds 8

据我所知,目前可以通过两种不同的方式在 Windows 10 上运行 Ubuntu。

...它们之间有什么区别(谈论应用程序),以及优点和缺点。

在提出问题时,实际上有三种方法可以在 Windows 10 上运行 Ubuntu:

  • WSL 上的 Ubuntu(当时的版本 1)
  • Docker 容器中的 Ubuntu 使用 Docker Desktop 和 Hyper-V 后端。
  • 虚拟机中的 Ubuntu

目前,还有两个附加选项:

  • WSL2 上的 Ubuntu
  • Docker 容器中的 Ubuntu 使用 Docker Desktop 和 WSL2 后端。

所有这五个选项目前都是可行的,并且大多数在某些情况下仍然有用。所有这些选项都允许 ELF64 二进制文件在 Ubuntu 生态系统中未经修改地运行。

Ubuntu 在带有 WSL2 后端的 Docker Desktop 下运行

最适合:

  • 使用 Ubuntu 基础(或任何其他基础,但这个问题专门针对运行 Ubuntu)构建/开发 Docker 容器。
  • 单一用途的工具将作为需要或最好在 Ubuntu 上运行的容器进行分发。

当出现以下情况时较弱:

  • 几乎还有其他任何事情。这并不是一件坏事——Docker 是一个很棒的容器化工具,但容器并不意味着成为一般意义上“运行 Ubuntu”的一种方式。*

    对于初学者(可能也是最重要的)来说,容器是在覆盖文件系统中构建的,每次进行更改时都会添加一个层。因此,每个层sudo apt update && sudo apt upgrade都会在旧层之上生成一个全新的层。这对于运行“通用”系统来说是一种极其浪费的方式。

    每次需要对底层系统进行更改时,通常都会重建容器。

    此外,当您在 Windows 上运行 Docker Desktop 时,您几乎总是会使用 WSL2 后端。在这种情况下,在 WSL2 上使用 Ubuntu 会更高效。

概括:

  • 具有 WSL2 后端的 Docker Desktop 是使用 Docker 构建容器的绝佳工具。
  • 它将 WSL2 子系统的低资源利用率与创建可复制、快速启动的 Ubuntu(或其他)容器的能力结合在一起。
  • 建议在 Windows(或其他任何地方)下运行通用 Ubuntu 系统。
WSL2 上的 Ubuntu

最适合:

  • 开发任务,包括 GPU 计算
  • Linux 命令行工具和 shell
  • 系统管理任务,例如 ssh 客户端、Ansible、AWS/Azure/Google Cloud 管理等。
  • 通过 WSL 互操作混合和匹配 Windows 和 Linux 工具。

当出现以下情况时较弱:

  • 您需要频繁访问 Windows 驱动器上无法移动到 Ubuntu/WSL2 文件系统的文件,因为 WSL2 在访问 Windows 文件时速度要慢得多。
  • 您需要访问物理硬件。
  • 您正在使用的应用程序(或您遵循的指示)利用 Systemd,而 WSL(1 或 2)不容易支持 Systemd。
  • 您需要从其他设备/计算机访问在 Ubuntu 中运行的服务。例如,在 WSL2 中运行 Web 服务器将要求您设置某种类型的端口转发才能访问该服务。
  • 您需要访问桌面环境(Gnome、Xfce4 等)

概括:

  • 在 WSL2 VM 下的某种“容器”中运行
  • WSL2 VM运行微软提供的真正的Linux内核
  • 内核是开源的
  • 您可以从源代码构建自己的内核
  • 主要是命令行第一环境
  • 在 Windows 11 上,支持开箱即用的图形 Linux 应用程序
  • 在 Windows 10 上,可以通过附加配置运行图形 Linux 应用程序
  • 极快的启动、资源占用
  • 旁注:可以直接在 WSL2 上的 Ubuntu 上运行 Docker Engine,但推荐的方式仍然是 Docker Desktop。
虚拟机中的 Ubuntu

最适合:

  • 使用自己的网络堆栈、虚拟硬件、控制台等来模拟“真实”计算机。
  • 需要 Systemd 或由 Systemd 简化的服务或任务
  • 运行完整的桌面环境,尤其是 Gnome,因为它大量使用 Systemd。
  • 学习 Grub、磁盘分区、网络等工具,这些工具可以更好地与真实或虚拟硬件配合使用。

当出现以下情况时较弱:

  • 您需要与 PowerShell 等 Windows 工具集成
  • 您需要/想要从 Windows 中快速访问 Ubuntu。WSL 的快速启动和精益资源利用更适合快速启动 Ubuntu 环境。

概括:

  • 在虚拟机中运行是在 Windows 上运行 Ubuntu 的数十年历史的方法,它早于这里的所有其他方法。
  • 它提供的虚拟硬件允许 Ubuntu 在几乎所有情况下“按预期”运行。
  • 有趣的旁注:只要您的系统支持嵌套虚拟化,并且具有合理的性能水平,您实际上可以在 VM 中运行 Ubuntu,例如 WSL2 中的 QEMU/KVM。
WSL1 上的 Ubuntu

最适合:

  • 没有能够提供虚拟化的 CPU 的系统 - WSL1 仍然可以提供以合理的性能水平运行本机 ELF64 二进制文件的 Ubuntu 发行版,而无需虚拟化支持。
  • 访问 Windows 驱动器上的文件。为此,性能大约比 WSL2 快 10 倍。
  • 需要inotify支持 Windows 驱动器上的文件的任务,因为当前 WSL2 不支持此功能。

当出现以下情况时较弱:

  • 您正在运行的应用程序需要“较少使用”的内核功能。由于内核系统调用被“翻译”为 Windows API,因此并非所有功能都受支持。WSL1 不支持 Cgroup、命名空间等功能(但 WSL2 和此处列出的所有其他方法均支持)。

  • 您正在使用的应用程序(或您遵循的指示)利用 Systemd,而 WSL(1 或 2)不容易支持 Systemd。

  • 您需要访问桌面环境(Gnome、Xfce4 等)

概括:

  • WSL1 提供了与 WSL2 类似级别的与 Windows 的紧密集成,并且对于某些任务来说仍然更可取。
  • 虽然它作为“翻译层”(有点像“反向 Wine”)运行,但兼容性水平仍然相当高——它支持大约 85% 的系统调用,涵盖大约 98% 的常见开发工具。
  • 由于它不支持 Cgroup、命名空间和其他用于容器化的内核功能,因此 Docker 不会直接在 WSL1 上运行。
Docker Desktop 中的 Ubuntu 使用 Hyper-V 后端

最适合:

  • 在运行 Hyper-V 但不运行 WSL2 的罕见系统上开发利用 Ubuntu 的 Docker 容器。这将是不寻常的。

当出现以下情况时较弱:

  • 任何其他场景。除了在 WSL2 由于某种原因无法工作时测试 Docker 之外,我真的不知道有谁使用此场景进行任何其他操作。