在 WSL 2 中使用 Docker
2020 年 3 月 2 日,作者 Matt Hernandez,@fiveisprime
去年六月,Docker 团队宣布他们将致力于使 Docker 能够与适用于 Linux 的 Windows 子系统 (WSL) 配合使用。所有这些都得益于 WSL 架构的最新更改,使其能够在轻量级虚拟机 (VM) 中运行,我们在早期关于 WSL 2 的博客文章中讨论过这一点。自宣布以来,Docker 团队发布了包含支持 WSL 2 的 Docker技术预览版。
本文将解释 Docker Desktop 技术预览版的工作原理,以及如何将 Docker 扩展与技术预览版配合使用。
工作原理
这种新的 Docker 架构的工作方式与 Visual Studio Code 的WSL 远程开发支持非常相似,即主机上运行的 Docker CLI 在 Docker 集成包中执行命令,该包运行在远程 WSL 虚拟机上。

图片来源:Docker Engineering
DockerD 直接在 WSL 中运行,因此无需 Hyper-V 虚拟机,并且所有 Linux 容器都在 Windows 上的 Linux 用户空间中运行,从而提高了性能和兼容性。
开始设置
首先是一些先决条件
- 安装适用于 WSL 2 的 Windows 10 预览体验计划内部版本 18975 (慢速) 或更高版本。
- 从Microsoft 商店安装 Ubuntu。
- 按照此指南启用 WSL 2。
- 为 VS Code 安装WSL扩展。
- 安装Docker WSL 2 技术预览版。
安装后,Docker 将识别您已安装 WSL 并提示启用 WSL 集成。对于本教程,您需要**启用 WSL 集成**。

此选项允许您直接从 Linux 发行版中通过 Docker CLI 访问 Docker Desktop。
如果您有多个 Linux 发行版,请确保在 Docker 设置中仅为您想要的发行版启用 WSL 集成

配置完成后,所有命令都将在 Linux 上下文中执行——这包括从 PowerShell 运行的 Docker 命令,因此运行类似 docker run mongo… 的命令将启动 WSL 虚拟机内的 Linux 容器。

在 WSL 中运行 docker ps 命令时,您将看到预期的容器。请注意容器 ID 是匹配的。

使用 VS Code
设置并运行后,您可以安装 VS Code Docker 扩展并访问您的容器。如果您已经运行了 WSL 2 和 WSL 扩展,这将有助于将 Docker 集成到您的 WSL 工作流程中,而不是在需要容器时切换上下文。由于 Docker CLI 的上下文设置为使用 WSL 中的 DockerD,因此扩展将与您的容器一起工作,无论您是使用 WSL 扩展打开 VS Code 还是其他方式。
请注意下面的截图中,我已连接并正在 WSL 中工作,并且仍然在不离开我偏好的环境(Ubuntu 中的 zsh)的情况下构建/运行容器。

主题:Noctis Sereno
我个人注意到使用此配置时容器执行时间有了很大改善,并且我日常开发工作流程的每个部分都保持不变。我还在 WSL 中使用了 Dev Containers 扩展来测试特定的环境,而无需直接在我的机器上进行设置。
我们希望获得您的反馈
请记住,您使用的是预发布软件,虽然 Windows 预览体验计划慢速环非常稳定,但您可能会遇到一些问题。如果您确实发现某些内容不如预期工作,请通过 Windows 中的“反馈”工具打开一个问题。任何直接的 Docker 问题或反馈都可以记录在 Docker for Windows 仓库中。
编码愉快!
Matt Hernandez,VS Code 项目经理 @fiveisprime