原始帖子
我有一个安装了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会在几秒钟后终止任何实例,甚至如果服务正在运行。我相信有一个变通办法,如果这是一个问题,我可以掸掉灰尘