通过 SSH 连接到远程 Docker
我们建议使用 Visual Studio Code 的 Remote - SSH 扩展连接到运行 Docker 引擎的远程机器。你可以将 Remote - SSH 和 Dev Containers 扩展一起使用。你可以在 Dev Containers 文档 中查看这些步骤。
也可以使用 SSH 隧道直接连接到远程 Docker 引擎,你可以在下面详细了解。
设置 SSH 隧道
-
使用 ssh-keygen 或类似工具获取和配置用于 SSH 身份验证的公钥/私钥对。Docker 不支持密码身份验证,并且在基于
DOCKER_HOST
的配置中也不可行。如果已经设置了密钥对,则可以使用它。 -
在 **本地** 系统上使用上面生成的 **私钥** 文件配置
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.osxargs
值在终端启动时运行此命令,或者以其他方式配置启动脚本。你也可以在每次登录时手动运行该命令。
-
-
使用
ssh-add -l
验证你的身份是否可供代理使用。它应该列出一个或多个看起来像2048 SHA256:abcdefghijk somethingsomething (RSA)
的身份。如果它没有列出任何身份,你就无法连接。此外,它需要具有正确的身份。Docker CLI 工作并不意味着资源管理器窗口会工作。资源管理器窗口使用 dockerode(它反过来使用 ssh2),而 Docker CLI 使用ssh
命令,并受益于自动推断的配置。 -
创建一个指向运行 Docker 的远程机器的 Docker 上下文。使用
ssh://username@host:port
作为 Docker 终结点(将“host”替换为你的远程机器名称或远程机器 IP 地址)。从终端窗口发出以下命令docker context create my-remote-docker-machine --docker "host=ssh://username@host:port"
始终在 Docker 终结点地址中包含用户名,即使它与本地用户名相同。如果你省略端口,则默认端口为 22。
-
使用 **命令面板** (⇧⌘P (Windows, Linux Ctrl+Shift+P)) 发出 **Docker 上下文:使用** 命令以激活指向远程机器的 Docker 上下文。此命令会导致 VS Code 和 Docker CLI 都使用远程机器上下文。
-
建议使用
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 构建 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 构建 1909 及更早版本受到 Windows 操作系统更新后阻止 SSH 获取你的身份的问题的影响。解决方法是向系统配置添加一个虚拟服务条目。从管理员 PowerShell 窗口运行以下命令
New-Service sshd -BinaryPathName "C:\Windows\System32\OpenSSH\ssh.exe"