现已发布!阅读 10 月份的新功能和修复。

在远程 Docker 主机上开发

有时你可能希望使用“开发容器”扩展在远程服务器上的容器中进行开发。Docker **不支持** 将你的本地文件系统挂载(绑定)到远程开发容器中,因此 Visual Studio Code 的默认 devcontainer.json 行为使用你的本地源代码将无法正常工作。虽然这是默认行为,但在本节中,我们将介绍连接到远程主机的方法,以便你可以使用 “远程 - SSH”扩展 在容器中打开远程主机上的文件夹,附加到任何正在运行的容器,或者使用 **本地** devcontainer.json 文件作为一种方法来配置、创建和连接到使用套接字的远程开发容器。

使用“远程 - SSH”扩展连接

如果使用的是 Linux 或 macOS SSH 主机,则可以将 “远程 - SSH” 和“开发容器”扩展结合使用。你甚至不需要在本地安装 Docker 客户端。为此,请执行以下操作

  1. 按照 安装 和 SSH 主机设置 步骤操作,以使用“远程 - SSH”扩展。
  2. 可选:为服务器设置 SSH 基于密钥的身份验证,这样你就无需多次输入密码。
  3. 在 SSH 主机上 安装 Docker。你不需要在本地安装 Docker。
  4. 按照 快速入门 中的步骤操作,以使用“远程 - SSH”扩展连接到主机并在那里打开文件夹。
  5. 从命令面板 (F1⇧⌘P (Windows、Linux Ctrl+Shift+P)) 中使用 “开发容器:在容器中重新打开” 命令。

“开发容器”快速入门中的其余步骤按原样适用。你可以从 “远程 - SSH”扩展文档 中了解有关它的更多信息。

使用“远程 - 隧道”扩展连接

可以将 “远程 - 隧道” 和“开发容器”扩展结合使用,以在容器中打开远程主机上的文件夹。你甚至不需要在本地安装 Docker 客户端。这与上面的 SSH 主机方案类似,但使用的是“远程 - 隧道”而不是 SSH 主机。为此,请执行以下操作

  1. 按照 入门 指示操作,以使用“远程 - 隧道”扩展。
  2. 在隧道主机上 安装 Docker。你不需要在本地安装 Docker。
  3. 按照 步骤 操作,以使用“远程 - 隧道”扩展连接到隧道主机并在那里打开文件夹。
  4. 从命令面板 (F1⇧⌘P (Windows、Linux Ctrl+Shift+P)) 中使用 “开发容器:在容器中重新打开” 命令。

“开发容器”快速入门中的其余步骤按原样适用。你可以从 “远程 - 隧道”扩展文档 中了解有关它的更多信息。

使用 Docker CLI 连接

此模型仅要求在你的本地 Docker CLI 可以连接到的远程主机上运行 Docker 引擎。虽然使用“远程 - SSH”和“远程 - 隧道”扩展更简单,而且甚至不需要在本地安装 Docker CLI,但此模型对于你已经从命令行连接到的主机而言非常有用。如果你希望附加到此远程服务器上已运行的容器,此方法也很有用。

一个基本的远程示例

将 VS Code 设置为附加到远程 Docker 主机上的容器就像在 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 代理** 中。有关配置代理和添加密钥的详细信息,请参阅 使用 Git 时使用 SSH 密钥 一文。

此时,可以 附加到 远程主机上的容器。我们将在本文的后面介绍有关如何使用 设置和环境变量Docker 上下文 连接的更多信息。

对于 devcontainer.json,还需要执行一个额外的步骤:你需要更新任何配置的(或自动配置的)绑定挂载,使其不再指向本地文件系统。

此设置有两个变体。第一个是 **先创建远程开发容器**,然后 **将你的源代码克隆到命名卷** 中,因为这不需要你直接访问远程主机上的文件系统。

以下是此设置的一个基本的 devcontainer.json 示例

{
  "image": "node", // Or "dockerFile"
  "workspaceFolder": "/workspace",
  "workspaceMount": "source=remote-workspace,target=/workspace,type=volume"
}

实际上,命令面板 (F1) 中的 “开发容器:将存储库克隆到容器卷中...” 命令使用的是相同的方法。如果你在 GitHub 存储库中已经有一个 devcontainer.json 文件,该文件引用了一个映像或 Dockerfile,那么该命令将自动使用命名卷而不是绑定挂载,这也适用于远程主机。

第二种方法是 **将远程计算机上的文件夹绑定挂载** 到你的容器中。这需要你能够访问远程文件系统,但也允许你使用远程计算机上的 **现有源代码**。

更新上面示例中的 workspaceMount 属性,以使用此模型

"workspaceMount": "source=/absolute/path/on/remote/machine,target=/workspace,type=bind,consistency=cached"

在任何一种情况下,要试用它,请运行 “开发容器:在容器中打开文件夹...”,并选择包含 .devcontainer.json 文件的本地文件夹。

有关其他方案(如 Docker Compose)的信息,请参阅 转换现有的或预定义的 devcontainer.json

使用 VS Code 设置或本地环境变量连接

如果已有一个正在运行的远程 Docker 主机,则可以在工作区或用户的 settings.json 中使用以下属性来指定主机。

SSH 协议

最新版本的 Docker(18.06+)添加了对 SSH 协议的支持,以连接到远程 Docker 主机。这很容易配置,因为你只需要在 settings.json 中设置一个属性即可使用它。

首先,安装 受支持的 SSH 客户端,配置 基于密钥的身份验证,然后 **将你的密钥导入到本地 SSH 代理** 中(在 Windows 和 Linux 上,此代理通常默认情况下未运行)。有关配置代理和添加密钥的详细信息,请参阅 使用 Git 时使用 SSH 密钥 一文。

然后,将以下 “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,可以在终端中设置 **环境变量**。执行此操作的步骤如下

  1. 关闭 **所有实例** 的 VS Code。
  2. 确保 VS Code 位于你的操作系统 PATH 中。
  3. 在终端/命令提示符中设置环境变量(例如 DOCKER_HOST)。
  4. 在同一个终端/命令提示符中键入 code,以启动已设置了变量的 VS Code。

使用 Docker 上下文连接

Docker 上下文 允许你与不同的主机进行交互 - 可以为每个主机设置上下文,并在它们之间切换。

可以使用 docker context create 创建新的上下文。可以使用 docker context use <context> 更改当前上下文。

The Docker 扩展 带有 docker.environment 设置,可以在其中设置环境变量,例如 DOCKER_HOSTDOCKER_CONTEXT,这些环境变量也会被 Dev Containers 扩展使用。

注意: 上述设置仅在安装 Docker 扩展后可见。如果没有安装 Docker 扩展,Dev Containers 将使用当前上下文。

转换现有的或预定义的 devcontainer.json

要将现有的或预定义的本地 devcontainer.json 转换为远程 devcontainer.json,请按照以下步骤操作

  1. 在 VS Code 中打开一个本地文件夹(而不是远程文件夹),您希望在其中转换文件。

  2. 如果您没有选择包含 devcontainer.json 的文件夹,您可以通过运行Dev Containers: Add Container Configuration File...(从命令面板 (F1))选择一个预定义的 devcontainer.json

  3. 根据您的 .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 的文档

  4. 从命令面板 (F1) 运行Dev Containers: Reopen in Container 命令,或运行Dev Containers: Rebuild Container

  5. 如果您使用卷而不是绑定挂载,请使用 ⌃⇧` (Windows、Linux Ctrl+Shift+`) 在容器内打开一个终端。您可以在此处运行 git clone 来拉取您的源代码,并使用文件 > 打开... / 打开文件夹... 打开克隆的存储库。

下次您想连接到同一个容器时,请运行Dev Containers: Open Folder in Container... 并选择 VS Code 窗口中的同一个本地文件夹。

可选:使远程源代码在本地可用

如果您将源代码存储在远程主机文件系统中,而不是 Docker 卷中,那么您可以通过几种方法访问本地文件

  1. 使用 SSHFS 挂载远程文件系统.
  2. 使用 rsync 将文件从远程主机同步到本地计算机.
  3. 使用 mount 命令,如果您使用的是 Docker Machine

使用 SSHFS 或 Docker Machine 的 mount 命令是比较方便的选择,并且不需要任何文件同步。但是,性能将明显慢于通过 VS Code 进行操作,因此它们最适合用于单文件编辑和上传/下载内容。如果您需要使用批量读写许多文件的应用程序(例如本地源代码控制工具),则 rsync 是更好的选择。