VS Code:连接远程服务器中的Docker容器

39

我想要在远程服务器的容器中工作,但无法实现。

环境:

本地:Windows 10

用于ssh的本地终端:Windows 10中的WSL

服务器:Ubuntu 18.04

我查看了这两篇文章。

https://code.visualstudio.com/docs/remote/containers-advanced https://code.visualstudio.com/docs/containers/ssh

我按照以下步骤进行操作:

  1. 在VS Code中安装[Remote Development]扩展。
  2. Remote-SSH:连接主机。 连接正常。
  3. 在远程服务器上安装[Docker]扩展。
  4. 现在我可以在Docker选项卡中看到我的容器和镜像。
  5. 我点击一个容器并单击[Attach Visual Studio Code],它显示没有运行的容器可供附加。

enter image description here


11
如果 VS Code 团队能够创建一个关于这个主题的 YouTube 教程,那就太棒了。 - barakbd
这里也有同样的问题。这可能是docker扩展的一个bug,因为附加到本地发现的vscode容器没有问题,但是在远程运行时会出问题。 - Konstantinos Lamogiannis
这似乎是一个已经修复的错误?我按照原帖中的步骤操作,它在我的本地 Linux 上运行得非常完美。 - Madacol
10个回答

20

我通过在本地计算机上切换到远程服务器的Docker上下文来解决了这个问题:

docker context create some-context-label --docker "host=ssh://user@remote_server_ip"

docker context use some-context-label

docker ps
# A list of remote containers on my local machine! It works!

接下来:

  1. 通过远程SSH连接到容器服务器
  2. 右键点击相关容器 -> "附加 Visual Studio Code"

这对我有效。

(注意:有人会认为我可以直接使用本地的VSCode(跳过第一步)连接到远程容器,但是在Docker控制面板中,VSCode报错“连接失败。Docker是否在运行?”)


4
当我运行 docker ps 时,出现以下错误:error during connect: Get "http://docker.example.com/v1.24/containers/json?all=1": fork/exec /usr/bin/ssh: permission denied。有什么建议吗?谢谢! - urningod

8

这可能听起来很奇怪,但对我来说,在使用VS Code中的远程容器扩展之前,我必须先在远程SSH服务器上打开一个文件夹。如果我不这样做,它会不断尝试在本地查找运行的Docker服务,即使终端选项卡已连接到远程SSH服务器。

这看起来非常奇怪,因为如果您通过VS Code连接SSH,则扩展应该假定您正在尝试附加到远程服务器上的容器。不应该需要先打开一个远程文件夹。

通过在远程服务器上“打开文件夹”,远程容器扩展程序能够将VS代码连接到运行在远程SSH服务器上的容器。我不必执行任何那些文章中的步骤。只需使用Remote SSH通过SSH远程连接VS Code,打开一个文件夹,然后使用远程容器即可。


是否已经开启问题以解决这种行为?这是一种令人困惑和沮丧的用户体验。 - Julian Fortune
我对Docker还比较新,您能详细说明一下“在远程SSH服务器上打开文件夹”的意思吗?谢谢。 - Phil
我确认这对我也起作用了。 - Sergio

7
我使用SSH隧道解决了这个问题,按照https://florian-kriegel.de/blog/?p=234中的步骤进行操作。
总结如下:
  1. 在VSCode的设置文件settings.json中设置(或添加)"docker.host": "tcp://localhost:23750"。
  2. 在本地机器上打开一个SSH隧道,按照远程机器(其中运行着docker守护进程)的凭据更改用户和主机名: ssh -NL localhost:23750:/var/run/docker.sock user@hostname。
  3. 现在,在docker选项卡中,您将能够查看并附加到远程机器中的容器。
请注意,此情况下不使用Remote SSH扩展程序。

在我提出的解决方案中,我没有使用远程资源管理器,所以也许你正在尝试另一种方法。我假设你已经本地安装并运行了Docker桌面版,以便“附加Visual Studio Code”。 - cantonjf
我的设置如下, 本地:安装了VSC的Windows 10笔记本电脑, 远程:安装了VSC和Docker的Ubuntu 18.04 按照您的指示,我能够在本地VSC实例的Docker扩展中看到远程机器上可用的Docker镜像,但是正在运行的容器列表为空,尽管远程机器上有一个容器正在运行。容器列表上方的进度条只是移动,但什么也没有发生。 我是否错过了需要提前设置的任何设置? - ai2ys
最终,在重新启动两台计算机后,我能够使用VSC远程浏览器和ssh配置文件来实现“附加Visual Studio Code”到正在运行的Docker容器。 - ai2ys
@ai2ys 我认为在 你的解决方案 中,你需要使用“连接到远程服务器的VSCode窗口(SSH)”,而不是像我一样在本地机器上打开终端并直接通过SSH连接,启动我描述的完整命令或使用ssh.config。最后,我有三个打开的窗口,就像你一样(本地的VSCode、带有SSH的终端和容器的VSCode)。但是如果你愿意,可以关闭本地的VSCode。 - cantonjf
这帮助我解决了我为之苦苦挣扎了几天的问题。只需这三个步骤,我就能从VS Code连接到远程容器。非常感谢。我已经点赞了。 - coderHASH64codingHASH46code
显示剩余3条评论

5
使用Visual Studio Code中的“Remote SSH”和“Remote Explorer”扩展解决方案。
按照上述步骤(https://dev59.com/VlIH5IYBdhLWcg3wOrS7#61728799),我找到了如何利用SSH Remote和Remote Explorer扩展。第一步与上面相同:
  1. 在VSCode中打开settings.json文件,按F1并选择“>Preferences: Open Settings (JSON)”,然后添加/编辑以下行:
    "docker.host": "tcp://localhost:23750"
  2. 打开ssh配置文件,单击“Remote Explorer”扩展,然后单击“SSH Targets”“Configure”按钮并打开ssh配置文件。 将以下行添加到您的ssh连接中:
    LocalForward localhost:23750 /var/run/docker.sock
备注:之前我使用了本主题早期描述的解决方案(https://dev59.com/VlIH5IYBdhLWcg3wOrS7#61728799)。在下面描述的解决方案生效之前,我必须重新启动本地机器和远程机器。

接下来我需要使用多个VSCode窗口:

  1. 本地机器:启动VSCode并使用“Remote Explorer”连接到远程机器,使用新的VSCode窗口

  2. 已连接到远程的VSCode窗口(SSH)
    → 启动您选择的Docker容器
    (我无法从此VSCode窗口“附加Visual Studio Code”)

  3. 已连接到本地机器的VSCode窗口
    → 单击“Docker”扩展程序,列出在远程运行的Docker容器。使用以下选项之一将VSCode附加到正在运行的容器:

    • 右键单击所需容器,选择“附加Visual Studio Code”
    • 按F1并选择“> Remote-Containers: Attach to Running Container ...”,然后选择所需的容器

    第三个VSCode窗口将打开并附加到Docker容器。

此解决方案的优缺点

(+) 使用“Remote Explorer”扩展程序,我可以直接连接并打开先前在远程机器上使用的项目文件夹,只需单击即可完成

需要使用三个 VSCode 窗口(本地机器、远程 SSH 和远程容器),而不是两个窗口。

有没有办法在这里添加一个额外的端口呢?“docker.host”:“tcp:// localhost:23750”,我尝试过:“docker.host”:[“tcp:// localhost:23750”,“tcp:// localhost:23751”],但它不起作用。 - dasilvadaniel
2
使用最新版本的 VSCode,我不再需要定义“docker.host”和“LocalForward”。我只需使用远程扩展连接我的 VSCode 到 SSH 远程主机。之后,在 Docker 扩展中,我可以直接点击所需的 Docker 容器,并选择“附加 Visual Studio Code”。 - ai2ys
1
在我从定义“docker.host”和“LocalForward”转移到使用Docker上下文之前,我可以在本地系统上切换到本地和远程系统上的Docker。我认为使用Docker上下文的解决方案在这里的另一个答案中有描述。 - ai2ys

2

您是否看到以下错误消息?

Failed to connect. Is Docker running?
  Error: connect EACCES /var/run/docker.sock

VSCode错误信息

这是因为VSCode使用远程主机的/var/run/docker.sock与Docker服务通信。

有两种方法。

方法1。(安全,需要重启或退出登录)在ubuntu 14.04上执行dockerode npm以下代码后,出现错误“connect EACCES /var/run/docker.sock”

方法2。(即时生效。如果您不处理生产服务器,请使用此方法)在SSH控制台上运行以下命令。

sudo chmod o+rw /var/run/docker.sock

方法2对我有效,我一直在尝试各种方法1的迭代但没有成功。 - Hamman Samuel
方法2运行得非常好。 - vicky

1

我发现Daniel的回答非常有帮助,但对我没有用。我想补充一些内容。

太长不看

  1. 为远程机器创建一个新的docker上下文。
docker context create some-context-label --docker "host=ssh://user@remote_server_ip"

docker context use some-context-label
  1. 打开VSC,进入Docker(您应该已经安装了扩展)选项卡,您将看到最近创建的远程上下文中所有正在运行的容器列表。
  2. 右键单击所需的容器并选择附加Visual Studio Code

您还可以使用Remote Explorer选项卡,只需在左上角的下拉菜单中选择容器

为什么不要ssh远程主机

当将Visual Studio Code附加到容器时,您可以通过单击底部左侧的通知设置远程容器(显示日志)来检查日志。 在那里,您可以检查以下内容:

...
[26154 ms] Start: Run: ssh some-remote-host /bin/sh
[26160 ms] Start: Run in host: id -un

我的猜测是它正在尝试从本身通过远程SSH连接到远程主机,因为我们已经通过远程SSH连接了。


1

出于某种原因,在尝试连接到容器之前,我先在远程窗口中打开一个文件夹,这样问题就得到了解决。


0
如果您可以通过SSH访问运行Docker引擎的远程节点,为什么还需要在容器内部使用另一个SSH服务器?从运行容器的主机上,可以安全地使用tty,即附加。

虽然可以实现在容器内部运行SSHD,但我认为这不是一个好主意。要有用,SSHD必须在每个容器中监听非冲突端口。否则,在同一节点上偶尔暴露相同端口的2个容器将会发生冲突,就像同一节点上运行的任何其他服务一样。

当然,可以使用-P选项随机分配端口,但这不太方便。在容器级别管理密钥和用户也比在主机级别更不方便,因为所有机制都由主机软件提供。

在每个容器中加载SSHD会增加容器的大小。在Kubernetes中,可以通过传递Pod->Container来直接访问每个容器,而无需在容器内部运行SSHD,因为Pod具有IP地址,容器可以通过ID连接到" Docker-host->container"。


0
这是对我有效的方法...
(我特别是连接到运行在Unraid服务器上的docker)
1. 安装“Remote SSH”扩展。 2. 安装“Docker”扩展。 3. 在通过SSH连接时启用Docker扩展。 进入VSCode设置界面 > “Remote SSH: Default Extensions” > 添加项目 添加“ms-azuretools.vscode-docker” docker setting 4. 使用Remote SSH扩展连接到远程服务器。 5. 在侧边栏中点击Docker扩展,它就可以正常工作了!

0

步骤1 - 远程机器上的Docker守护进程

  • 确保您的远程Docker守护进程可以接受来自主机的连接
  • 为了测试目的,我在远程机器上使用以下命令,强制Docker守护进程在所有IP上监听端口4243,请注意这不安全

没有支持从/etc/sysconfig或其他地方读取文件以修改命令行的功能。幸运的是,systemd为我们提供了改变这种行为所需的工具。 最简单的解决方案可能是创建文件/etc/systemd/system/docker.service.d/docker-external.conf(确切的文件名并不重要;它只需要以.conf结尾)并包含以下内容:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock

然后:

systemctl daemon-reload
systemctl restart docker

步骤3 - 使用FirewallD打开Docker端口

firewall-cmd --permanent --zone=public --change-interface=docker0
firewall-cmd --permanent --zone=public --add-port=4243/tcp
firewall-cmd --reload

步骤4 - 在VSCode的settings.json中设置(或添加)"docker.host":"tcp://localhost:4243"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接