Windows WSL2“发行版”只是底层的 Docker 容器吗?

Windows WSL2“发行版”只是底层的 Docker 容器吗?

我在github上找到了这个文档:

WSL2 发行版作为容器运行

不过它已经有一段时间没有更新了,所以我想知道是否有人知道微软是否已经发布了描述 WSL2 发行版作为容器的实现的技术文档。

答案1

您的标题中有一个问题,正文中的问题又有些不同。可以肯定的是,这些问题高度相关。

Windows WSL2“发行版”只是底层的 Docker 容器吗?

作为@DanielB 已经回答了,WSL2 发行版使用与 Docker 相同的 Linux 内核容器/命名空间技术,但它们不是Docker 容器。

Linux 上的几乎每种容器技术都在核心上使用相同的技术 - LXC、systemd-nspawn以及许多其他技术。

是的,这意味着当我们在 WSL2 上运行 Docker Engine 或 Docker Desktop 时,我们实际上是在 WSL2 管理的 VM 内的(WSL2)容器内使用(Docker)容器。

我想知道是否有人知道微软是否已经发布了描述 WSL2 发行版作为容器的实现的技术文档。

据我所知,没有。MicrosoftDocs/WSL Github 问题当然,您的链接仍然打开。

并且在宣布 WSL 2在 CommandLine devblog 上发布的帖子中提到:

您可以在不久的将来看到关于此博客上发布的架构具体变化的更多详细信息,敬请关注!

然而,我从未在博客上看到过深入的探讨。

我能找到的最接近的描述是本次 Build 2019 会议。在 40 多分钟的时间里,提到他们利用标准 Linux 命名空间和容器 API 在 WSL2 VM 内创建发行版。

通过检查来学习

虽然如果有关于此的深入的文档会很棒,但我们现在至少有一个不错的替代方案——将命令行放入根 WSL2 命名空间并直接检查分发命名空间。

从发布开始0.51.2,您可以将以下内容添加到您的%userprofile%\.wslconfig

[wsl2]
debugShell=true

然后发出wsl --shutdown。下次启动 WSL2 发行版时,您还将获得一个单独的控制台,该控制台以 root 身份登录到直接在 WSL2 VM 中运行的 Mariner 发行版。运行ps axjf将为您提供一个相当广泛的进程列表,包括每个发行版中运行的进程。假设您只运行一个发行版,您可以:

pgrep -u 1000 bash

... 找到以 uid 1000(默认 WSL uid)运行的 bash shell。然后通过以下方式检查命名空间:

lsns -p $(pgrep -u 1000 bash)

我会让你从那里开始探索。

答案2

是的,有点类似。它们是容器,但 Docker 并未参与其中。相反,WSL 2 直接建立在同样支持 Docker 的 Linux 技术之上(命名空间和控制组)。

WSL 2 分发容器有自己的 PID 和挂载命名空间,但所有分发都共享单个网络命名空间。

相关内容