VS代码:连接远程服务器中的docker容器

VS代码:连接远程服务器中的docker容器,docker,vscode-remote,Docker,Vscode Remote,我想在远程服务器的容器中工作。 但它不起作用 环境: 本地:Windows 10 Windows 10中ssh:WSL的本地终端 服务器:Ubuntu 18.04 我检查了这两篇文章 我遵循这些步骤 我在VS代码中安装了[Remote Development]扩展 远程SSH:连接到主机。它很好用 我在远程服务器上安装了[Docker]扩展 现在我可以在docker选项卡中查看我的容器和图像 我单击了一个容器并单击了[AttachVisualStudioCode],它说没有运行中的容器可以连

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

环境:

本地:Windows 10

Windows 10中ssh:WSL的本地终端

服务器:Ubuntu 18.04

我检查了这两篇文章

我遵循这些步骤

  • 我在VS代码中安装了[Remote Development]扩展
  • 远程SSH:连接到主机。它很好用
  • 我在远程服务器上安装了[Docker]扩展
  • 现在我可以在docker选项卡中查看我的容器和图像
  • 我单击了一个容器并单击了[AttachVisualStudioCode],它说没有运行中的容器可以连接

  • 我按照中的步骤使用SSH隧道解决此问题

    总结:

  • 设置(或添加)“docker.host”:tcp://localhost:23750“在settings.json中 在VSCode中
  • 在本地计算机中打开类似这样的SSH隧道 通过远程计算机(docker守护程序正在运行的位置)凭据更改用户和主机名: ssh-NL localhost:23750:/var/run/docker.sockuser@hostname.
  • 现在,在docker选项卡中,您将能够看到并连接到远程机器中的容器
  • 请注意,在这种情况下不使用远程SSH扩展。

    在Visual Studio代码中使用“远程SSH”和“远程资源管理器”扩展的解决方案。 按照上面()的步骤,我了解了如何使用SSH远程和远程资源管理器扩展。第一步同上:

  • 在VSCode中打开settings.json文件,按F1键并选择“>首选项:打开设置(json)”并添加/编辑以下行:
    “docker.host”:tcp://localhost:23750“
  • 打开ssh配置文件,单击“远程资源管理器”扩展,然后单击“ssh目标”“配置”按钮并打开ssh配置文件。 将以下行添加到ssh连接:
    LocalForward localhost:23750/var/run/docker.sock
  • 备注:之前我使用了本线程()中前面描述的解决方案。在下面描述的解决方案生效之前,我必须重新启动本地机器和远程机器

    之后,我必须使用多个VSCode窗口:

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

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

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

    • 右键单击所需的容器并选择“附加Visual Studio代码”
    • 按F1键并选择“>远程容器:连接到正在运行的容器…”,然后选择您选择的容器
    附加到Docker容器的第三个VSCode窗口将打开

  • 此解决方案的利弊 (+)使用“远程资源管理器”扩展,我只需单击一下,就可以直接连接并打开远程计算机上以前使用过的项目文件夹


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

    如果您可以通过ssh到达运行Docker引擎的远程节点,为什么还需要容器中的另一个ssh服务器?从运行容器的主机上,可以安全地使用tty,即附加

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

    当然,可以使用-p选项随机化端口,但这并不方便。在容器级别管理密钥和用户也不如在主机级别方便,因为主机级别的所有机器都由主机软件提供


    使用SSHD加载每个容器会增加容器大小。在Kubernetes中,每个容器都可以通过pass Pod->container访问,而不需要在容器内运行任何SSHD,因为Pod具有IP,并且容器可以通过id连接,即“Docker host->container”

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

    • 确保远程Docker守护程序可以接受来自主机的连接
    • 出于测试目的,我在远程服务器上使用以下命令 机器强制Docker守护进程侦听所有IP上的端口4243, 小心,这是不安全的
    不支持从
    /etc/sysconfig
    或其他地方读取文件以修改命令行。幸运的是,systemd为我们提供了改变这种行为所需的工具。 最简单的解决方案可能是创建包含以下内容的文件
    /etc/systemd/system/docker.service.d/docker external.conf
    (确切的文件名不重要;它只需要以.conf结尾):

    然后:

    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-设置(或添加)
    “docker.host”:tcp://localhost:4243“
    settings.json中的

    我通过切换到本地计算机上远程服务器的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!
    
    之后:

  • 通过远程SSH连接到容器服务器
  • 右键单击相关容器->附加Visual Studio代码
  • 这对我很有用


    (注意:人们可能会认为,在切换本地上下文后,我应该能够使用本地VSCode(跳过步骤1)连接到所述远程容器,但VSCode抱怨连接失败。docker正在运行吗?
    在docker控制窗格中。)

    远程开发扩展现在处理所有事情;不需要解决办法。J
    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!