现已推出!阅读有关 11 月新功能和修复的信息。

通过 SSH 连接到远程 Docker

我们建议使用 Visual Studio Code Remote - SSH 扩展来连接到运行 Docker 引擎的远程计算机。你可以一起使用 Remote - SSHDev 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 <keyfile>

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

    • Linux: 默认情况下存在 ssh-agent。执行 ssh-add <keyfile>。已测试 Ubuntu;你在其他发行版上可能会有不同的结果。

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

  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 上下文: 使用 命令以激活指向远程计算机的 Docker 上下文。此命令使 VS Code 和 Docker CLI 都使用远程计算机上下文。

  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 及更高版本附带的守护程序)正常工作。解决方法是为 SSH 连接使用 ECDSA 类型密钥,而不是 RSA 类型密钥。你可以生成一个 ECDSA SSH 密钥,并使用以下命令将其添加到 SSH 代理

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

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