Windows 10 上的 Ubuntu:Docker 与 WSL

Windows 10 上的 Ubuntu:Docker 与 WSL

据我了解,目前可以通过两种不同的方式在 Windows 10 上运行 Ubuntu:

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

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

我找到了一篇讨论在 WSL 上使用 docker 的帖子:Ubuntu(Windows Linux 子系统)和 Docker。但我说的是直接在 Windows 10 上使用它。因此,我将非常感激有关这两者的任何信息。

答案1

于 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 客户端,使用它来驱动在本地主机上的 Hyper-V 上运行的 Docker for Windows,或管理远程 Docker 服务器。但由于许多技术原因,人们无法在 WSL1 上运行 Docker Engine。

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

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

答案2

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

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

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

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

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

  • WSL2 上的 Ubuntu
  • 在 Docker 容器中使用带有 WSL2 后端的 Docker Desktop 运行 Ubuntu。

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

使用 WSL2 后端在 Docker Desktop 下运行的 Ubuntu

最适合:

  • 使用 Ubuntu 基础(或任何其他基础,但这个问题专门涉及运行 Ubuntu)构建/开发 Docker 容器。
  • 单一用途的工具将作为容器分发,需要在 Ubuntu 上运行或最适合在 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 工具。

较弱的情况:

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

概括:

  • 在 WSL2 VM 下某种“容器”中运行
  • WSL2 VM 运行 Microsoft 提供的真实 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 几乎在任何情况下都能“按预期”运行。
  • 有趣的旁注:只要您的系统支持嵌套虚拟化,您实际上可以在 WSL2 内的 QEMU/KVM 等 VM 内运行 Ubuntu,并具有合理的性能水平。
WSL1 上的 Ubuntu

最适合:

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

较弱的情况:

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

  • 您正在使用的应用程序(或您正在遵循的方向)使用 Systemd,而 WSL(1 或 2)不易支持该系统。

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

概括:

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

最适合:

  • 在运行 Hyper-V 但不运行 WSL2 的稀有系统上开发利用 Ubuntu 的 Docker 容器。这种情况并不常见。

较弱的情况:

  • 任何其他场景。我真的不知道有谁会使用这个场景来做任何事情,除了当 WSL2 由于某种原因无法工作时测试 Docker。

答案3

没错。您没有提到的一件事是,即使使用快速 ssd/大量 ram/8 核 xeon cpu,WSL 目前的 io 速度也相当慢。这在 2019 年 1 月仍然是一个问题。我刚刚在带有三星 SSD 的工作站上执行了 ray@DESKTOP-O0MT13B:/mnt/c/Users/rayjh$ dd if=/dev/zero of=test bs=64k count=16k conv=f​​datasync,速度只有 97.6 MB/s。

运行裸机 ubuntu LTS 时,此框将获得几倍的效果。当您尝试将 WSL 与 VSCODE 结合时,不要介意无穷无尽的问题。

我正在从这里擦除 Windows 10 并安装 ubuntu 18.04LTS。

答案4

WSL 最大的问题之一就是 IO,尤其是在挂载不同的文件系统时。例如,将文件放在 Windows 中并通过 Docker Compose 进行映射非常慢。使用 WSL + Docker 的另一种方法是将文件移动到框中并进行远程连接,就像 Visual Studio Code 使用 Remote-WSL 插件所做的那样(https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl)。这样,您就摆脱了不必要的挂载点的开销,而这些挂载点实际上只不过是网络共享。

相关内容