【问题标题】:Can I develop with VS Code in containers on a remote host running Windows/WSL2?我可以在运行 Windows/WSL2 的远程主机上的容器中使用 VS Code 进行开发吗?
【发布时间】:2021-04-23 04:47:56
【问题描述】:

原帖

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

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

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 中打开远程连接。

【问题讨论】:

  • 根据我对所有这些组件的了解,我相当肯定有一种方法可以使 Remote/WSL2/SSH/Docker 工作流正常工作,但它可能需要跳过一些障碍(正如你已经注意到的那样)。我现在没有足够的时间深入研究这个问题,但首先让我请您确认您可以从开发机器 SSH 到远程机器上的 WSL2 实例。我在您的问题中看到确认您可以“直接通过 SSH 进入工作站上的 WSL2 环境”,我认为这意味着您正在本地执行该步骤,但我不确定。
  • 是的,我根据本指南将 WSL2 设置为 OpenSSH 连接的默认 shell:hanselman.com/blog/…,唯一的区别是我将默认设置为 wsl.exe 而不是 bash.exe。因此,当我通过密码或密钥进行身份验证时,它会自动在 WSL2 中打开一个 shell。
  • 啊,很好。我使用了一种稍微不同的技术,但我也喜欢那个。好的,所以至少我们不需要为您的案例担心解决方案的那一部分。

标签: windows docker vscode-remote wsl-2


【解决方案1】:

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

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

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

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

我采取的步骤:

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

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

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

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

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

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

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

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

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

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

  • 然后我可以在 local 上使用 docker ps 看到 remote 容器。我也可以远程docker exec -it containername bash

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

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

需要检查的其他事项

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

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

【讨论】:

  • WSL2 似乎可以在没有活动用户登录 Windows 的情况下正常工作,尽管我正在使用我的 Windows 用户打开 SSL 连接,所以这可能就是原因。我用更多细节更新了原始帖子,我取得了一些进展,但仍然无法将 VS Code 附加到远程容器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 2020-09-28
相关资源
最近更新 更多