在 VS Code 中试试

通过 SSH 连接到远程 Docker

我们推荐使用 Visual Studio Code Remote - SSH 扩展连接到运行 Docker 引擎的远程计算机。您可以同时使用 Remote - SSH开发容器 扩展。您可以查阅开发容器文档中的步骤。

也可以直接使用 SSH 隧道连接到远程 Docker 引擎,您可以在下方了解更多信息。

设置 SSH 隧道

  1. 使用 ssh-keygen 或类似工具获取和配置用于 SSH 身份验证的公钥/私钥对。Docker 不支持密码身份验证,并且基于 DOCKER_HOST 的配置也不支持。如果已设置密钥对,则可以使用它。

  2. 在**本地**系统上,使用上面生成的**私钥**文件配置 ssh-agent

    • Windows (OpenSSH): 最新版本 Windows 10 默认包含 OpenSSH。有一个名为 ssh-agent 的 Windows 服务默认处于禁用状态,需要重新启用并设置为自动启动。从管理员 PowerShell 提示符下,运行 Set-Service ssh-agent -StartupType "Automatic"Start-Service ssh-agent。然后,运行 ssh-add <keyfile>

    • Windows (Pageant): 您可以使用 Pageant 代替 OpenSSH,在这种情况下需要设置环境变量 SSH_AUTH_SOCK=pageant。最简单的方法是将其设置为用户或系统环境变量。

    • Linux: ssh-agent 默认存在。运行 ssh-add <keyfile>。已在 Ubuntu 上测试;在其他发行版上结果可能有所不同。

    • macOS: ssh-agent 默认存在,但 ssh-add 不会在登录会话之间持久化。运行 ssh-add <keyfile>。我们建议通过使用设置 terminal.integrated.profiles.osxargs 值来配置 VS Code 在终端启动时运行此命令,或者配置一个启动脚本。您也可以在每次登录时手动运行该命令。

  3. 使用 ssh-add -l 验证您的身份是否可供代理使用。它应该列出一个或多个身份,类似于 2048 SHA256:abcdefghijk somethingsomething (RSA)。如果未列出任何身份,您将无法连接。此外,它需要拥有正确的身份。Docker CLI 工作正常并不意味着资源管理器窗口也能正常工作。资源管理器窗口使用 dockerode(它又使用 ssh2),而 Docker CLI 使用 ssh 命令,并受益于自动推断的配置。

  4. 创建一个指向运行 Docker 的远程计算机的 Docker 上下文。使用 ssh://username@host:port 作为 Docker 端点(将“host”替换为您的远程计算机名称或远程计算机 IP 地址)。在终端窗口中执行以下命令

    docker context create my-remote-docker-machine --docker "host=ssh://username@host:port"
    

    即使远程用户名与本地用户名相同,也要在 Docker 端点地址中包含用户名。如果省略端口,则默认为 22。

  5. 使用**命令面板**(⇧⌘P (Windows, Linux Ctrl+Shift+P))执行**Docker Contexts: Use** 命令,以激活指向远程计算机的 Docker 上下文。此命令会使 VS Code 和 Docker CLI 都使用远程计算机上下文。

    如果您没有此命令,请确保安装 Docker 扩展

  6. 建议使用 docker.explorerRefreshInterval 设置将刷新率更改为大于默认值的时间。通过 SSH 的连接速度较慢,可能导致在前一次刷新完成之前就尝试再次刷新。我们建议至少 3000 毫秒。

提示

  • Docker 端点字符串(ssh://username@host:port)中的“host”部分必须是全局可解析的 DNS 计算机名称或 IP 地址。Docker 扩展无法使用 SSH 配置文件中定义的主机别名。

  • 确保远程计算机主机密钥已记忆在 known_hosts 文件中。确保这一点的最简单方法是通过 ssh 客户端程序连接到该计算机(从命令行运行 ssh username@host:port)。首次连接时,ssh 程序将显示主机密钥,让您批准,从而自动更新 known_hosts 文件。

  • Windows 10 Build 1909 及更早版本自带的 ssh-keygen 工具存在一个问题 ,导致其无法与较新的 SSH 守护程序(例如 Ubuntu 20.04 LTS 及更新版本自带的守护程序)正常工作。解决方法是使用 ECDSA 类型的密钥进行 SSH 连接,而不是 RSA 类型的密钥。您可以使用以下命令生成 ECDSA SSH 密钥并将其添加到 SSH 代理中

    ssh-keygen -t ecdsa -b 521
    ssh-add id_ecdsa
    
  • Windows 10 Build 1909 及更早版本受到一个问题的影响,该问题导致 SSH 在 Windows 操作系统更新后无法获取您的身份信息。解决方法是将一个虚拟服务条目添加到系统配置中。从管理员 PowerShell 窗口运行以下命令

    New-Service sshd -BinaryPathName "C:\Windows\System32\OpenSSH\ssh.exe"