首页 > 解决方案 > 我可以在运行 Windows/WSL2 的远程主机上的容器中使用 VS Code 进行开发吗?

问题描述

原帖

我有一个安装了 WSL2 和 Docker 的 Windows 工作站,我可以使用它在 VS Code 中进行基于容器的开发。我希望能够在这个系统上的容器内远程开发。我能够通过 SSH 直接进入工作站上的 WSL2 环境,并且能够通过创建一个任务以自动启动守护程序,而无需直接登录到 Windows,如下所述:https ://stackoverflow.com/a/59467740 /10692741

但是,当我尝试按照本指南访问远程计算机上的 Docker 时:https ://code.visualstudio.com/docs/remote/containers-advanced#_developing-inside-a-container-on-a-remote-docker-主机,我收到以下错误:

error during connect: Get http://docker/v1.24/version: net/http: HTTP/1.x transport connection broken: malformed HTTP status code "\x00c\x00o\x00m\x00m\x00a\x00n\x00d\x00"

我还尝试通过此处概述的 SSH 隧道进行连接:https ://code.visualstudio.com/docs/remote/troubleshooting#_using-an-ssh-tunnel-to-connect-to-a-remote-docker-host并且我也无法连接到 Docker。

有没有人通过这样的设置成功?或者由于 Docker 在 Windows、WSL2 和/或 Windows OpenSSH 实现上的限制,这是否不受支持?

更新:2021-01-21

当我远程 SSH 进入 Windows 机器时,我可以在 VS Code 扩展中看到 docker 容器。我能够启动它们,停止它们,并使用 shell 进入它们。但是,当我尝试附加 VS Code 时,我得到了上面显示的相同错误。

在过去的几天里,可能会影响到这一点的事情:

另外我想指出,我尝试使用 Windows、Mac 和 Linux 作为本地计算机。使用 Mac 和 Linux,我可以打开到 Windows 机器的远程会话,但是从 Windows 本地机器我可以通过 SSH 连接到远程 Windows 机器,但由于某种原因无法在 VS Code 中打开远程连接。

标签: windowsdockervscode-remotewsl-2

解决方案


好的,我能够使用端口/套接字转发技术来完成这项工作。为了清楚起见,我将使用:

  • 本地 开发 工作站,本地 工作站, 或 只是工作站来 表示 我们 希望 使用 VSCode 访问 Docker 容器 的 计算机 ...

  • 远程 Docker 主机远程或只是Docker 主机

健全性检查——你在两个系统上都安装了 Docker Desktop 吗?在本地开发工作站上,您可以跳过 WSL2 集成,但您至少需要客户端工具,因为 VSCode 扩展使用它们。

我采取的步骤:

  • 我已经在我的主系统(为了本练习的目的,成为我的远程 Docker 主机)以及 VSCode 上设置了带有 WSL2 集成的 Docker,所以我知道一切都在那里工作。听起来这也是你的起点。

  • 在同一网络上的另一个系统上(使用 RDP 访问以使其变得简单),我已经安装了 VSCode,以及远程开发扩展包。我在那个系统上也有 WSL,但那里只有一个 v1 实例。并不是说工作站上的 WSL完全应该是本练习的一个因素。

  • 我在该本地开发工作站上安装了 Docker Desktop for Windows 。

  • 我还为 VSCode 安装了 Docker 扩展,因为我还没有在本地开发工作站上安装它。

  • 工作站上,我还没有设置从 PowerShell SSH 到远程上的 WSL Ubuntu 发行版。从工作站上的 PowerShell 中,我生成了一个 ECDSA 密钥(根据文档和其他文档),并将公钥添加到远程我的 authorized_keys 中。

  • 工作站上,我启动了 OpenSSH 身份验证服务并将新创建的密钥添加到代理(在 PowerShell 中)ssh-agent add ~\.ssh\id_ecdsa

  • 我从工作站注销并重新登录,以便为 Docker 桌面安装获取路径更改。

  • 然后,我可以通过端口转发从本地的 Powershell SSH到远程的Ubuntu/WSL 。由于我使用 Windows 10 OpenSSH 服务器作为 WSL SSH 服务器的跳转主机,因此我的命令看起来略有不同(-o "ProxyCommand ...主要是 a),但总体结构与您链接的“SSH 隧道”文档中列出的结构相同在你的问题中。

  • 远程(手动,而不是通过本地的任何集成)上,我做了一个基本的操作docker run -it --rm Ubuntu并将其保持打开状态。

  • 本地,从 PowerShell,我通过设置 DOCKER_HOST 环境变量[System.Environment]::SetEnvironmentVariable("DOCKER_HOST","tcp://localhost:23750")

  • 然后我能够看到在本地使用的远程容器。我也可以远程进入它。docker psdocker exec -it containername bash

  • 当然,从长远来看,上述两个步骤对于 VSCode 来说并不是必需的,它们只是我确保一切正常运行的过程的一部分(因为,正如你所料,我确实有几个失败的地方在这个过程中)。

  • 因此,在 VSCode 中,将 Docker 扩展的 DOCKER_HOST 设置更改为 tcp://localhost:23750 是一件简单的事情。瞧,我可以看到遥控器上的所有图像以及从 VSCode 附加到它们。

其他要检查的事项

如果我们发现它可能无法正常工作的其他原因,我将添加到此列表中,但现在:

  • 您提到您正在通过任务管理器在启动时自动启动 Docker 桌面守护程序,但您没有提及有关 WSL2 实例的任何内容。但是,既然您可以通过 ssh 进入它,我认为您也有办法将其启动?我的经验是,除非拥有用户已登录,否则 WSL 会在几秒钟后终止任何实例,即使服务正在运行。我相信有一种解决方法,如果这是一个问题,我可以解决这个问题。

推荐阅读