VS代码:在远程服务器上连接Docker容器

时间:2020-02-27 01:28:53

标签: docker vscode-remote

我想在远程服务器的容器中工作。 但这不起作用。

环境:

本地: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. 远程SSH:连接到主机。效果很好。
  3. 我在远程服务器上安装了[Docker]扩展。
  4. 现在我可以在docker标签中看到我的容器和图像了。
  5. 我单击了一个容器,然后单击了[附加Visual Studio代码],它说没有附加的运行容器。

enter image description here

8 个答案:

答案 0 :(得分:5)

我按照https://florian-kriegel.de/blog/?p=234

中的步骤使用SSH隧道解决了此问题

总结:

  1. 在settings.json中设置(或添加)“ docker.host”:“ tcp:// localhost:23750” 在VSCode中。
  2. 在本地计算机中打开一个像这样的SSH隧道 通过远程机器(运行docker daemon的地方)凭据更改用户和主机名: ssh -NL localhost:23750:/var/run/docker.sock user @ hostname。
  3. 现在,在docker选项卡中,您将能够查看并附加到远程计算机中的容器。

请注意,在这种情况下,不使用远程SSH扩展。

答案 1 :(得分:4)

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

这看起来很奇怪,因为如果你在 VS Code 中通过 SSH 连接,那么扩展应该假设你正在尝试连接到远程服务器上的容器。不必先打开远程文件夹。

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

答案 2 :(得分:2)

在Visual Studio代码中使用“远程SSH”和“远程资源管理器”扩展名的解决方案。

按照上面的步骤(https://stackoverflow.com/a/61728799/11687201),我弄清楚了如何利用SSH远程和远程资源管理器扩展。第一步与上面相同:

  1. 在VSCode中打开settings.json文件,按F1并选择“首选项:打开设置(JSON)”并添加/编辑以下行:
    "docker.host": "tcp://localhost:23750"
  2. 打开ssh配置文件,单击“远程资源管理器”扩展,然后单击“ SSH目标”“配置”按钮,然后打开ssh配置文件。 将以下行添加到您的ssh连接中:
    LocalForward localhost:23750 /var/run/docker.sock

备注:以前,我使用此线程(https://stackoverflow.com/a/61728799/11687201)中前面介绍的解决方案。在解决下面描述的解决方案之前,我不得不重新启动本地计算机和远程计算机。

然后我必须使用多个VSCode Windows:

  1. 本地计算机:启动VSCode并使用“远程资源管理器”通过新的VSCode窗口连接到远程计算机

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

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

    • 右键单击所需的容器,然后选择“附加Visual Studio代码”
    • 按F1键,然后选择“远程容器:附加到运行中的容器...”,然后选择您选择的容器

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

此解决方案的优缺点

(+)使用“远程资源管理器”扩展名,我可以一键直接连接并打开远程计算机上以前使用的项目文件夹

(-)需要3个VSCode窗口(本地计算机,远程ssh和远程容器),而不是2个VSCode窗口

答案 3 :(得分:0)

如果您可以通过SSH到达运行Docker引擎的远程节点,为什么在容器内还需要另一台SSH服务器?通过运行容器的主机,可以安全地使用tty,即attach。

我认为在容器内运行SSHD并不是一个好主意,尽管有可能。为了有用,SSHD必须侦听每个容器中的非冲突端口。否则,两个容器偶尔会在同一节点上暴露相同的端口,就会像在该节点上运行的任何其他服务一样发生冲突。

当然,可以使用-P选项将端口随机化,但这并不方便。与在主机级别由主机软件提供所有主机的主机级别相比,在容器级别管理密钥和用户也不太方便。

使用SSHD加载每个容器会增加容器的大小。在Kubernetes中,每个容器都可以通过Pod-> Container传递而无需在容器内运行任何SSHD,因为Pod具有IP并且容器可以通过ID附加,即``Docker-host-> container''

答案 4 :(得分: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的"docker.host": "tcp://localhost:4243"中设置(或添加)settings.json

答案 5 :(得分:0)

我通过在本地计算机上切换到远程服务器的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代码”

对我有用。

(注意:有人认为我应该能够在切换本地上下文后使用本地VSCode(跳过步骤1)连接到所述远程容器,但是VSCode在Docker控制面板中抱怨Failed to connect. Is docker running?

答案 6 :(得分:0)

远程开发扩展现在可以处理一切;不需要解决方法。只需从 VS Code 内部通过 SSH 连接到您的远程机器,然后在那里安装 vs Code docker 扩展(它可以在扩展下找到)

答案 7 :(得分:-1)

出于某种原因,当我在尝试附加到容器之前在远程窗口中打开文件夹时,此问题已为我解决。