Docker 图像中缺少 WSL 发行版

Missing WSL distros in Docker images

试图让我的头脑围绕 Docker、WSL2、发行版、图像和容器。 WSL 发行版和 Docker 映像有什么区别?看看下面的两个快照,看起来它们是不同的东西:

WSL 中已安装的发行版列表:

Docker 桌面中的图像列表:

Alpine 和 Ubuntu 列在附加发行版列表中,但未显示在映像列表中。

我应该如何 运行 已安装的 WSL 发行版之一(Alpine 或 Ubuntu)作为容器并到达其终端?最后,我可以从那个容器中启动 Ubuntu 的桌面 UI 吗?

Docker 从用法 的角度来看,图像和 WSL 发行版是完全不同的两个东西。

在over-simplifying的上下文中比较和解释两者:

  • WSL 发行版包含您使用 Linux 与应用程序交互和开发应用程序所使用的工具。这包括您的 shell(Ubuntu 中默认为 bash)和 docker 客户端(由 Docker Desktop 提供)。

  • Docker 图像是您用作 Docker 容器的起点。

您提供的第三个屏幕截图是“设置”对话框,允许您选择应集成 Docker 的 WSL 图像。请尝试以下操作:

  • 在该设置中关闭 Ubuntu
  • 应用并重新启动 Docker 桌面
  • 通过 运行 从“开始”菜单(或者最好是 Windows 终端,如果您安装了它)启动您的 Ubuntu WSL 分发。
  • 尝试 运行使用 docker 命令

你应该会发现它不存在。

  • 在 Docker 桌面设置中重新打开 Ubuntu
  • 应用并重新启动 Docker 桌面
  • 您不需要重新启动 Ubuntu,但 docker 命令现在应该在那里。

Docker 桌面实际上为 docker 命令注入了一个 link:

  • 来自 docker-desktop 分布
  • 在“设置”选项中 select 进入“用户”分布。

一般来说,为所有发行版保留它就可以了。

现在我知道你的下一个问题了:

那么我如何 运行 基于 Alpine 或 Ubuntu docker 图像的 Docker 容器?

您需要先将 Docker 图像拉到您的计算机上:

  • 确保您已再次启用所有 WSL2 发行版(不一定需要,但您不想错误地关闭任何发行版)。
  • 开始您的 Ubuntu 分发
  • 运行:
    docker run --rm -it alpine
    

Docker 会检测到您没有安装 Docker Alpine 镜像,拉取它,然后 运行 它。这有点Docker shorthand 两步,实际上:

docker pull alpine
docker run --rm -it alpine

-it 选项用于“交互式”和“终端”。

此时,您将进入 BusyBox shell 提示符(Alpine 的默认设置),即 运行ning inside 您的 Ubuntu WSL分布。

退出前,返回 Docker 桌面并检查容器和图像列表。你会看到:

  • 一张“高山”图片
  • 一个 randomly-named 容器 运行ning 基于 alpine 图像

如果您在 Ubuntu 打开的情况下启动另一个终端,您可以 运行:

  • docker ps给你看集装箱信息
  • docker images给大家看图片信息

这与您在 Docker 桌面版中看到的信息基本相同。

返回第一个 Ubuntu WSL2 终端,它正在 运行 带有 BusyBox 提示的 Alpine 容器。在那里尝试 运行ning docker -- 它不会工作,因为这是一个基于 Docker Alpine 图像的容器,而不是您的 WSL高山分布。

键入 exitCtrl+D 退出该提示,您现在将返回 bash 提示 Ubuntu.

此时,您会注意到您的 Docker 容器 现在不见了,因为我们指定了 --rm 选项,当过程结束。如果我们没有这样做,它仍然会在 Docker.

中显示为“已停止”容器

您会发现 Alpine Docker image 仍然存在。一旦拉到您的机器上,Docker 图像会一直保留,直到您删除它们。

Docker 图像和容器可能需要一点时间才能理解,我可以理解 WSL 发行版中增加的混乱。稍微尝试一下,阅读一些 Docker 教程,上面的信息很快就会变得有意义。


旁注:在上面的内容变得有意义之后再回来阅读这篇文章。

Docker 容器和 WSL2 发行版在架构上有一个 相似之处,至少——它们 都是容器技术,只是不同而已。

WSL2 发行版实际上是容器 运行 在(隐藏的)WSL2 Hyper-V 虚拟机内它们自己的命名空间中。它们共享相同的内核和网络,但每个 WSL2 distribution/instance 都有自己独立的 PID 和用户命名空间。

这在核心上与 Docker 容器使用的概念 相同。所以有了 WSL2 和 Docker,我们真的 运行ning:

  • WSL2 VM 内的 WSL2 分发“容器”
  • 里面有一个Docker个容器WSL2 分发容器