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高山分布。
键入 exit
或 Ctrl+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 分发容器
试图让我的头脑围绕 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高山分布。
键入 exit
或 Ctrl+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 分发容器