在远程 Docker 主机上开发
有时您可能希望使用“开发容器”扩展在位于远程服务器上的容器内进行开发。Docker 不支持将本地文件系统挂载(绑定)到远程开发容器中,因此 Visual Studio Code 默认的 devcontainer.json
行为(使用本地源代码)将不起作用。虽然这是默认行为,但在本节中,我们将介绍如何连接到远程主机,以便您可以使用 Remote - SSH 扩展在容器中打开远程主机上的文件夹,附加到任何正在运行的容器,或者使用本地 devcontainer.json
文件来配置、创建和使用套接字连接到远程开发容器。
使用 Remote - SSH 扩展连接
如果您使用的是 Linux 或 macOS SSH 主机,则可以一起使用 Remote - SSH 和“开发容器”扩展。您甚至不需要在本地安装 Docker 客户端。要这样做
- 按照 Remote - SSH 扩展的安装和 SSH 主机设置步骤进行操作。
- 可选:设置到服务器的 SSH 基于密钥的身份验证,这样您就不需要多次输入密码。
- 在您的 SSH 主机上安装 Docker。您不需要在本地安装 Docker。
- 按照 Remote - SSH 扩展的快速入门连接到主机并在其中打开文件夹。
- 从命令面板中使用 Dev Containers: Reopen in Container 命令(F1、⇧⌘P(Windows,Linux Ctrl+Shift+P))。
其余的“开发容器”快速入门照常适用。您可以在其文档中了解有关 Remote - SSH 扩展的更多信息。
使用 Remote - Tunnels 扩展连接
您可以一起使用 Remote - Tunnels 和“开发容器”扩展,以在容器内打开远程主机上的文件夹。您甚至不需要在本地安装 Docker 客户端。这与上面的 SSH 主机场景类似,但使用的是 Remote - Tunnels。要这样做
- 按照 Remote - Tunnels 扩展的入门说明进行操作。
- 在您的隧道主机上安装 Docker。您不需要在本地安装 Docker。
- 按照 Remote - Tunnels 扩展的步骤连接到隧道主机并在其中打开文件夹。
- 从命令面板中使用 Dev Containers: Reopen in Container 命令(F1、⇧⌘P(Windows,Linux Ctrl+Shift+P))。
其余的“开发容器”快速入门照常适用。您可以在其文档中了解有关 Remote - Tunnels 扩展的更多信息。
使用 Docker CLI 连接
此模型仅要求您的本地 Docker CLI 可以连接的远程主机上运行 Docker Engine。虽然使用 Remote - SSH 和 Remote - Tunnels 扩展更容易,并且甚至不需要在本地安装 Docker CLI,但对于您已经从命令行连接到的主机的情况,此模型可能很有用。如果您希望附加到此远程服务器上已经运行的容器,此方法也很有用。
基本远程示例
在远程 Docker 主机上设置 VS Code 以附加到容器可以像在 settings.json
中设置 Docker 扩展 docker.environment
属性并重新启动 VS Code(或重新加载窗口)一样简单。
例如
"docker.environment": {
"DOCKER_HOST": "ssh://your-remote-user@your-remote-machine-fqdn-or-ip-here"
}
使用 SSH 需要一个受支持的 SSH 客户端,您已为远程主机配置了 基于密钥的身份验证,并且该密钥已导入到您的本地 SSH 代理中。有关配置代理和添加密钥的详细信息,请参阅有关将 SSH 密钥与 Git 结合使用的文章。
此时,您可以附加到远程主机上的容器。稍后在本节中,我们将介绍有关如何使用设置和环境变量或 Docker 上下文进行连接的更多信息。
对于 devcontainer.json
,还有一个额外的步骤:您需要更新任何配置的(或自动配置的)绑定挂载,使其不再指向本地文件系统。
此设置有两种变体。第一种是首先创建远程开发容器,然后将源代码克隆到已命名的卷中,因为这不需要您直接访问远程主机上的文件系统。
下面是此设置的基本 devcontainer.json
示例
{
"image": "node", // Or "dockerFile"
"workspaceFolder": "/workspace",
"workspaceMount": "source=remote-workspace,target=/workspace,type=volume"
}
实际上,命令面板中的 Dev Containers: Clone Repository in Container Volume... 命令(F1)使用相同的技术。如果 GitHub 存储库中已经有一个 devcontainer.json
文件,该文件引用映像或 Dockerfile,则该命令将自动使用已命名的卷而不是绑定挂载 - 这也适用于远程主机。
第二种方法是将远程计算机上的文件夹绑定挂载到您的容器中。这要求您有权访问远程文件系统,但也允许您处理远程计算机上的现有源代码。
更新上面的示例中的 workspaceMount
属性以使用此模型
"workspaceMount": "source=/absolute/path/on/remote/machine,target=/workspace,type=bind,consistency=cached"
无论哪种情况,要试用它,请运行 Dev Containers: Open Folder in Container...,然后选择其中包含 .devcontainer.json
文件的本地文件夹。
有关 Docker Compose 等其他场景的信息,请参阅转换现有或预定义的 devcontainer.json。
使用 VS Code 设置或本地环境变量连接
如果您已经启动并运行了远程 Docker 主机,则可以使用工作区或用户 settings.json
中的以下属性来指定主机。
SSH 协议
Docker 的最新版本 (18.06+) 已添加对 SSH 协议的支持以连接到远程 Docker 主机。这很容易配置,因为您只需在 settings.json
中设置一个属性即可使用它。
首先,安装一个受支持的 SSH 客户端,配置基于密钥的身份验证),然后将您的密钥导入到本地 SSH 代理(通常在 Windows 和 Linux 上默认情况下不运行)。有关配置代理和添加密钥的详细信息,请参阅有关将 SSH 密钥与 Git 结合使用的文章。
然后,将以下 Docker 扩展 docker.environment
属性添加到 settings.json
(根据需要替换值)
"docker.environment": {
"DOCKER_HOST": "ssh://your-remote-user@your-remote-machine-fqdn-or-ip-here"
}
重新启动 VS Code(或重新加载窗口)后,您现在将能够附加到远程主机上的任何正在运行的容器。您还可以使用专门的本地 devcontainer.json
文件来创建/连接到远程开发容器。
提示: 如果这对您不起作用,但您可以使用命令行通过 SSH 连接到主机,请确保您已运行带有身份验证密钥的 SSH 代理。如果一切都失败了,您可以将 SSH 隧道用作后备。
使用 TCP 协议
虽然 SSH 协议有自己的内置授权机制,但使用 TCP 协议通常需要在 settings.json
中设置其他 Docker 扩展属性。这些是
"docker.environment": {
"DOCKER_HOST": "tcp://your-remote-machine-fqdn-or-ip-here:port",
"DOCKER_CERT_PATH": "/optional/path/to/folder/with/certificate/files",
"DOCKER_TLS_VERIFY": "1" // or "0"
}
与 SSH 一样,重新启动 VS Code(或重新加载窗口)以使设置生效。
使用环境变量而不是 settings.json
如果您不想使用 settings.json
,可以在终端中设置环境变量。执行此操作的步骤是
- 关闭 VS Code 的所有实例。
- 确保 VS Code 在您的操作系统
PATH
中。 - 在终端/命令提示符中设置环境变量(例如
DOCKER_HOST
)。 - 在此同一终端/命令提示符中键入
code
以使用设置的变量启动 VS Code。
使用 Docker 上下文连接
Docker 上下文允许您与不同的主机进行交互 - 您可以为每个主机设置上下文并在它们之间切换。
您可以使用 docker context create
创建新上下文。可以使用 docker context use <context>
更改当前上下文。
Docker 扩展带有 docker.environment
设置,可以在其中设置环境变量(例如 DOCKER_HOST
或 DOCKER_CONTEXT
),这些变量也受“开发容器”扩展支持。
注意: 只有在安装了 Docker 扩展后,才会显示以上设置。如果没有 Docker 扩展,“开发容器”将使用当前上下文。
转换现有或预定义的 devcontainer.json
要将现有或预定义的本地 devcontainer.json
转换为远程的,请按照以下步骤操作
-
在 VS Code 中打开您要转换文件的本地文件夹(而不是远程文件夹)。
-
如果您没有选择其中包含
devcontainer.json
的文件夹,则可以通过从命令面板 (F1) 运行 Dev Containers: Add Container Configuration File... 来选择一个预定义的文件夹。 -
根据
.devcontainer/devcontainer.json
或.devcontainer.json
引用的内容,按照以下步骤操作以更改源代码挂载Dockerfile 或映像:
如果您不具有对远程主机的登录访问权限,请使用 Docker“卷”作为源代码。按如下方式更新
.devcontainer/devcontainer.json
(如果需要,请将remote-workspace
替换为唯一的卷名称)"workspaceMount": "source=remote-workspace,target=/workspace,type=volume" "workspaceFolder": "/workspace",
如果您有登录权限,可以使用远程文件系统绑定挂载。
"workspaceMount": "source=/absolute/path/on/remote/machine,target=/workspace,type=bind,consistency=cached" "workspaceFolder": "/workspace",
如果您有不同的场景,
workspaceMount
属性支持与 Docker CLI--mount
标志相同的值。Docker Compose:
如果您没有远程主机的登录权限,请更新(或扩展)您的
docker-compose.yml
。 将your-service-name-here
替换为devcontainer.json
中"service"
属性指定的值,并将remote-workspace
替换为唯一的卷名。version: '3' services: your-service-name-here: volumes: - remote-workspace:/workspace # ... volumes: remote-workspace:
如果您有登录权限,可以使用远程文件系统绑定挂载。
version: '3' services: your-service-name-here: volumes: - /absolute/path/on/remote/machine:/workspace:cached # ...
如果您需要支持不同的场景,请参阅 Docker Compose 关于
volumes
的文档。 -
从命令面板(F1)运行 Dev Containers: Reopen in Container 命令或 Dev Containers: Rebuild Container。
-
如果您使用卷而不是绑定挂载,请使用 ⌃⇧`(Windows,Linux Ctrl+Shift+`)在容器内打开终端。 您可以在这里运行
git clone
来拉取您的源代码,并使用 文件 > 打开... / 打开文件夹... 来打开克隆的存储库。
下次您想连接到同一个容器时,运行 Dev Containers: Open Folder in Container... 并在 VS Code 窗口中选择相同的本地文件夹。
可选:使远程源代码在本地可用
如果您将源代码存储在远程主机的文件系统上,而不是 Docker 卷内,您可以通过几种方式在本地访问文件。
使用 SSHFS 或 Docker Machine 的 mount 命令是更方便的选择,不需要任何文件同步。但是,性能将比通过 VS Code 工作慢得多,因此它们最适合用于单文件编辑和上传/下载内容。 如果您需要使用一次性批量读取/写入多个文件的应用程序(例如本地源代码控制工具),rsync 是更好的选择。