Windows WSL 2 上的 Docker 远程容器入门
本文内容显示另外 2 个本分步指南将通过使用 WSL 2(适用于 Linux 的 Windows 子系统,版本 2)设置 Docker Desktop for Windows,帮助开始使用远程容器进行开发。 Docker Desktop for Windows 为生成、交付和运行 Docker 化的应用提供了一个开发环境。 通过启用基于 WSL 2 的引擎,可以在同一计算机上的 Docker Desktop 中运行 Linux 和 Windows 容器。 (Docker Desktop 免费供个人和小型企业使用,有关专业、团队或企业定价的信息,请参阅 Docker 站点常见问题解答)。 备注
Docker 容器概述
Docker 是一种工具,用于创建、部署和运行应用程序(通过使用容器)。 容器使开发人员可以将应用与需要的所有部件(库、框架、依赖项等)打包为一个包一起交付。 使用容器可确保此应用的运行与之前相同,而不受任何自定义设置或运行该应用的计算机上先前安装的库的影响(运行应用的计算机可能与用于编写和测试应用代码的计算机不同)。 这使开发人员可以专注于编写代码,而无需操心将运行代码的系统。 Docker 容器与虚拟机类似,但不会创建整个虚拟操作系统。 相反,Docker 允许应用使用与运行它的系统相同的 Linux 内核。 这使得应用包能够仅要求主计算机上尚未安装的部件,从而降低包大小以及提高性能。 将 Docker 容器与 Kubernetes 等工具结合使用以实现持续可用性是容器普及的另一个原因。 这样就可以在不同的时间创建应用容器的多个版本。 无需关闭整个系统进行更新或维护,每个容器 (及其特定微服务) 可以动态替换。 你可以准备一个包含所有更新的新容器,将该容器设置用于生产,并在新容器准备就绪后直接指向该容器。 你还可以使用容器对不同版本的应用进行存档,如有需要,还可将其作为安全回退保持运行。 先决条件
备注 WSL 可以在 WSL 版本 1 或 WSL 2 模式下运行发行版。 可通过打开 PowerShell 并输入以下内容进行检查:wsl -l -v。 通过输入 wsl --set-version <distro> 2,确保发行版设置为使用 WSL 2。 将 <distro> 替换为发行版名称(例如 Ubuntu 18.04)。 在 WSL 版本 1 中,由于 Windows 和 Linux 之间的根本差异,Docker 引擎无法直接在 WSL 内运行,因此 Docker 团队使用 Hyper-V VM 和 LinuxKit 开发了一个替代解决方案。 但是,由于 WSL 2 现在在具有完整系统调用容量的 Linux 内核上运行,因此 Docker 可以在 WSL 2 中完全运行。 这意味着 Linux 容器可以在没有模拟的情况下以本机方式运行,从而在 Windows 和 Linux 工具之间实现更好的性能和互操作性。
安装 Docker Desktop
借助 Docker Desktop for Windows 中支持的 WSL 2 后端,可以在基于 Linux 的开发环境中工作并生成基于 Linux 的容器,同时使用 Visual Studio Code 进行代码编辑和调试,并在 Windows 上的 Microsoft Edge 浏览器中运行容器。 提示 下面是一些需要了解的有用 Docker 命令: - 通过输入以下命令列出 Docker CLI 中可用的命令:docker
- 使用以下命令列出特定命令的信息:docker <COMMAND> --help
- 使用以下命令列出计算机上的 docker 映像(此时仅为 hello-world 映像):docker image ls --all
- 使用以下命令列出计算机上的容器:docker container ls --all 或 docker ps -a(如果没有 -a 显示全部标志,则仅显示正在运行的容器)
- 使用以下命令列出有关 Docker 安装的系统范围的信息,包括 WSL 2 上下文中你可使用的统计信息和资源(CPU & 内存):docker info
使用 VS Code 在远程容器中开发
若要开始将 Docker 与 WSL 2 配合使用来开发应用,建议使用 VS Code 以及 WSL、开发容器和 Docker 扩展。 安装 VS Code WSL 扩展。 此扩展使你能够在 VS Code 中打开在 WSL 上运行的 Linux 项目(无需担心路径问题、二进制兼容性或其他跨 OS 的难题)。
让我们使用 Docker 为现有应用项目创建开发容器。 备注 始终将代码存储在使用工具的相同文件系统中。 这将提高文件访问性能。 在本例中,我们使用的是 Linux 发行版 (Ubuntu),并且想要将项目文件存储在 WSL 文件系统 \\wsl\ 上。 在 WSL 中使用 Linux 工具访问项目文件时,将项目文件存储在 Windows 文件系统上会明显降低速度。
在 WSL 终端中,将目录更改为此项目的源代码文件夹: Bash复制
cd helloworld-django通过输入以下命令,在本地 WSL 扩展服务器上运行的 VS Code 中打开项目: Bash复制
code .通过检查 VS Code 实例左下角的绿色远程指示器,确认已连接到 WSL Linux 发行版。 从 VS Code 命令托盘 (Ctrl + Shift + P) ,输入:开发容器:打开容器中的文件夹...如果此命令在开始键入时未显示,检查以确保已安装上面链接的开发容器扩展。 选择要容器化的项目文件夹。 在我的示例中,它是 \\wsl\Ubuntu-20.04\home\mattwojo\repos\helloworld-django\ 将显示容器定义列表,因为项目文件夹 (存储库) 中没有开发容器配置。 显示的容器配置定义列表将根据项目类型进行筛选。 对于 Django 项目,我将选择 Python 3。 系统将打开新的 VS Code 实例,开始生成新映像,生成完成后,将启动容器。 将看到出现新的 .devcontainer 文件夹,其中 Dockerfile 和 devcontainer.json 文件中包含容器配置信息。 若要确认项目仍然连接到 WSL 和容器中,请打开 VS Code 集成终端 (Ctrl + Shift + ~)。 通过输入 uname 检查操作系统,并通过 python3 --version 检查 Python 版本。 可以看到,uname 返回为“Linux”,因此你仍然连接到 WSL 2 引擎,Python 版本号将基于容器配置,该配置可能不同于 WSL 发行版上安装的 Python 版本。 若要使用 Visual Studio Code 在容器内运行和调试应用,请首先打开“运行”菜单(Ctrl+Shift+D 或选择最左侧菜单栏上的选项卡)。 然后选择“运行和调试”以选择调试配置,并选择最适合项目的配置(在我的示例中,这将是“Django”)。 这会在项目的 launch.json 文件夹中创建一个 .vscode 文件,其中包含有关如何运行应用的说明。 在 VS Code 中,选择“运行”>“开始调试”(或只按 F5 键)。 这会在 VS Code 中打开终端,并且你应会看到如下所示的结果:“正在 http://127.0.0.1:8000/ 启动开发服务器。使用 CONTROL-C 退出服务器。”按住 Control 键并选择显示的地址,以在默认 Web 浏览器中打开应用,并查看在其容器中运行的项目。
现在,你已使用 Docker Desktop 成功配置了远程开发容器,该容器由 WSL 2 后端提供支持,你可以使用 VS Code 对该容器进行编码、生成、运行、部署或调试! 故障排除
已弃用的 WSL docker 上下文
如果你使用的是 Docker for WSL 的早期技术预览版,则可能有一个名为“wsl”的 Docker 上下文,该上下文现已弃用。 可以使用以下命令进行检查:docker context ls。 如果想要同时对 Windows 和 WSL2 使用默认上下文,可以使用 docker context rm wsl 命令删除此“wsl”上下文,以避免出现错误。 使用此已弃用的 wsl 上下文可能遇到的错误包括:docker wsl open //./pipe/docker_wsl: The system cannot find the file specified. 或 error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_wsl/v1.40/images/json?all=1: open //./pipe/docker_wsl: The system cannot find the file specified. 查找 docker 映像存储文件夹时遇到问题
Docker 创建了两个用于存储数据的发行版文件夹: - \wsl$\docker-desktop
- \wsl$\docker-desktop-data
可以通过打开 WSL Linux 发行版并输入 explorer.exe . 以在 Windows 文件资源管理器中查看文件夹来查找这些文件夹。 Enter: \\wsl\<distro name>\mnt\wsl 将 <distro name> 替换为分发 (的名称。Ubuntu-20.04) 查看这些文件夹。 有关 WSL 中常规故障排除问题的更多帮助,请参阅 故障排除文档。 其他资源
|