在 WSL 2 中使用 Docker
2020 年 3 月 2 日,作者:Matt Hernandez,@fiveisprime
去年六月,Docker 团队宣布他们将投入精力让 Docker 在 Windows Subsystem for Linux (WSL) 上运行。这一切都得益于 WSL 架构最近的变化,使其能够在一个轻量级虚拟机 (VM) 中运行,我们在之前一篇关于 WSL 2 的博客文章中讨论过这一点。自此公告发布以来,Docker 团队已经发布了一个包含 WSL 2 支持的 Docker 技术预览版。
本文将解释 Docker Desktop 技术预览版的工作原理,以及如何将 Docker 扩展与该技术预览版结合使用。
工作原理
这个新的 Docker 架构的工作方式很像 Visual Studio Code 的 WSL 远程开发支持,即在主机上运行的 Docker CLI 会在远程 WSL 虚拟机上运行的 Docker 集成包(Docker Integration Package)中执行命令。
图片来源:Docker Engineering
DockerD 直接在 WSL 内部运行,因此不再需要 Hyper-V 虚拟机,并且所有 Linux 容器都在 Windows 上的 Linux 用户空间内运行,从而提高了性能和兼容性。
开始设置
首先是一些先决条件
- 为 WSL 2 安装 Windows 10 Insider Preview build 18975(慢速通道)或更高版本。
- 从 Microsoft store 安装 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 Insiders 慢速通道非常稳定,但您仍可能遇到一些问题。如果您确实发现了某些功能未按预期工作,请通过 Windows 中的反馈工具(Feedback tool)提交问题。任何与 Docker 直接相关的问题或反馈都可以记录在 Docker for Windows 的代码仓库中。
编码愉快!
Matt Hernandez,VS Code 项目经理 @fiveisprime