我可以在运行Windows/WSL2的远程主机上的容器中使用VS代码进行开发吗



原始帖子

我有一个安装了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-在一个容器内部-在一个远程-后台,我得到以下错误:

error during connect: Get http://docker/v1.24/version: net/http: HTTP/1.x transport connection broken: malformed HTTP status code "x00cx00ox00mx00mx00ax00nx00dx00"

我还尝试过通过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代码扩展中看到docker容器。我能够启动它们,阻止它们,并用外壳进入它们。然而,当我尝试附加VS代码时,我会得到上面显示的相同错误。

过去几天可能影响这一点的事情:

  • 通过ssh-add /my/key将本地机器上的SSH密钥添加到SSH代理
  • 在上公开Docker守护程序tcp://localhost:2375在远程Windows计算机上没有TLS

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

好的,我能够使用端口/套接字转发技术来实现这一点。为了清楚起见,我将使用:

  • 本地开发工作站局部工作站作站来指示我们希望使用VSCode访问Docker容器的计算机。。。

  • 远程Docker主机远端或仅Docker主机

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

我采取的步骤:

  • 我已经在我的主系统上安装了带有WSL2集成的Docker(就本练习而言,它成为了我的远程Docker主机)以及VSCode,所以我知道那里一切都正常。听起来这也是你的出发点。

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

  • 我在本地开发工作站上安装了适用于Windows的Docker Desktop。

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

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

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

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

  • 然后,我能够通过端口转发从本地上的Powershell ssh到远程的Ubuntu/WSL。由于我使用Windows 10 OpenSSH服务器作为WSL SSH服务器的跳转主机,所以我的命令看起来略有不同(主要是-o "ProxyCommand ...),但总体结构与";SSH隧道";你在问题中联系的医生。

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

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

  • 然后,我可以在本地上使用docker ps查看远程容器。我也可以远程docker exec -it containername bash

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

  • 因此,在VSCode中,将Docker扩展的Docker_HOST设置更改为tcp://localhost:23750.瞧,我可以在远程上看到所有图像,也可以从VSCode连接到它们。

其他要检查的事项

如果我们发现它可能不起作用的其他原因,我会添加到这个列表中,但目前:

  • 您提到您在启动时通过任务管理器自动启动Docker Desktop守护进程,但您没有提到任何关于WSL2实例的内容。然而,既然您能够ssh到它中,我想您也有办法提起它吗?我的经验是,除非拥有用户登录,否则WSL会在几秒钟后终止任何实例,甚至如果服务正在运行。我相信有一个变通办法,如果这是一个问题,我可以掸掉灰尘

相关内容

  • 没有找到相关文章

最新更新