通过SSH连接到远程Docker

我们建议使用Visual Studio Code的Remote - SSH扩展来连接到运行Docker引擎的远程机器。您可以同时使用Remote - SSHDev Containers扩展。您可以查看Dev Containers文档中的步骤。

也可以直接使用SSH隧道连接到远程Docker引擎,您可以在下面阅读更多相关信息。

设置SSH隧道

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

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

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

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

    • Linux: ssh-agent 默认存在。执行 ssh-add 。Ubuntu 已经过测试;在其他发行版上可能会有不同的结果。

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

  3. 验证您的身份是否对代理可用,使用ssh-add -l。它应该列出一个或多个身份,看起来像2048 SHA256:abcdefghijk somethingsomething (RSA)。如果没有列出任何身份,您将无法连接。此外,它需要具有正确的身份。Docker CLI 工作并不意味着 Explorer 窗口也会工作。Explorer 窗口使用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都使用远程机器上下文。

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

提示

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

  • 确保远程机器的主机密钥已经存储在known_hosts文件中。最简单的方法是使用ssh客户端程序连接到机器(从命令行运行ssh username@host:port)。在首次连接时,ssh程序将显示主机密钥并让您批准它,自动更新known_hosts文件。

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

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

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