本站点文档内容均翻译自code.visualstudio.com,仅供个人学习,如有差异请以官网为准。

在远程Docker主机上开发

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

使用远程 - SSH 扩展进行连接

如果您正在使用 Linux 或 macOS SSH 主机,您可以将 Remote - SSH 和 Dev Containers 扩展一起使用。您甚至不需要在本地安装 Docker 客户端。要实现这一点:

  1. 按照安装和SSH主机设置步骤进行Remote - SSH扩展的设置。
  2. 可选: 设置 SSH 密钥认证 到服务器,这样你就不需要多次输入密码。
  3. 安装Docker在你的SSH主机上。你不需要在本地安装Docker。
  4. 按照快速入门指南,使用Remote - SSH扩展连接到主机并打开一个文件夹。
  5. 使用 开发容器:在容器中重新打开 命令从命令面板 (F1, ⇧⌘P (Windows, Linux Ctrl+Shift+P))。

其余的 Dev Containers 快速入门可以直接应用。您可以在其文档中了解更多关于 Remote - SSH 扩展的信息

使用远程 - 隧道扩展进行连接

您可以将Remote - Tunnels和Dev Containers扩展一起使用,以在远程主机上的容器内打开文件夹。您甚至不需要在本地安装Docker客户端。这类似于上面的SSH主机场景,但使用的是Remote - Tunnels。要实现这一点:

  1. 按照入门说明进行Remote - Tunnels扩展。
  2. 安装Docker在你的隧道主机上。你不需要在本地安装Docker。
  3. 按照步骤使用Remote - Tunnels扩展连接到隧道主机并打开一个文件夹。
  4. 使用 开发容器:在容器中重新打开 命令从命令面板 (F1, ⇧⌘P (Windows, Linux Ctrl+Shift+P))。

其余的 Dev Containers 快速入门可以直接应用。您可以在其文档中了解更多关于 Remote - Tunnels 扩展的信息

使用Docker CLI连接

此模型仅要求在远程主机上运行Docker Engine,并且您的本地Docker CLI可以连接到它。虽然使用Remote - SSH和Remote - Tunnels扩展更简单,并且不需要在本地安装Docker CLI,但在命令行中已经有一个主机需要连接的情况下,此模型仍然很有用。如果您希望连接到远程服务器上已经运行的容器,此方法也非常有用。

一个基本的远程示例

设置 VS Code 以连接到远程 Docker 主机上的容器可以简单到设置 Container Tools 扩展 容器.环境物业在settings.json并重启 VS Code(或重新加载Windows)。

例如:

"containers.environment": {
    "DOCKER_HOST": "ssh://你的远程用户@你的远程机器的完全限定域名或IP地址"
}

使用 SSH 需要一个支持的 SSH 客户端,您已经为远程主机配置了基于密钥的认证,并且该密钥已导入到您的本地 SSH 代理中。有关配置代理和添加密钥的详细信息,请参阅使用 SSH 密钥与 Git的文章。

在此刻,你可以连接到远程主机上的容器。我们将在本节的后面部分涵盖更多关于如何使用设置和环境变量Docker上下文进行连接的信息。

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

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

这是一个基本的devcontainer.json此设置示例:

{
  "image": "node", // 或 "dockerFile"
  "workspaceFolder": "/workspace",
  "workspaceMount": "源=远程工作区,目标=/workspace,类型=卷"
}

事实上,Dev Containers: 克隆容器卷中的仓库... 命令在命令面板 (F1) 中使用了相同的技术。如果你已经有一个devcontainer.json在 GitHub 仓库中引用图像或 Dockerfile 的文件,该命令将自动使用命名卷而不是挂载卷 - 这也适用于远程主机。

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

更新工作区挂载上面示例中的属性改为使用此模型:

"工作区挂载": "源=/远程机器上的绝对路径/目标=/工作区/类型=绑定/一致性=缓存"

在任何情况下,要尝试一下,运行 Dev Containers: 在容器中打开文件夹...,并选择本地文件夹.devcontainer.json文件中。

参见转换现有的或预定义的devcontainer.json,了解其他场景如Docker Compose的信息。

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

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

SSH 协议

最近版本的Docker(18.06+)已经添加了对SSH协议的支持,用于连接到远程Docker Host。这很容易配置,因为你只需要在设置中更改一个属性。settings.json使用它。

首先,安装一个支持的 SSH 客户端,配置基于密钥的认证,然后将你的密钥导入到本地 SSH 代理中(在 Windows 和 Linux 上通常默认不运行)。查看使用 SSH 密钥与 Git文章中的详细信息来配置代理和添加密钥。

然后,添加以下容器工具扩展 容器.环境属性到settings.json(根据需要替换值):

"containers.environment": {
    "DOCKER_HOST": "ssh://你的远程用户@你的远程机器的完全限定域名或IP地址"
}

重启 VS Code(或重新加载Windows)后,您现在可以连接到远程主机上的任何正在运行的容器。您还可以使用专门的本地devcontainer.json 文件用于创建/连接到远程开发容器.

提示: 如果这对你不起作用,但你能够通过命令行使用SSH连接到主机,请确保你有SSH代理运行并使用你的认证密钥。如果所有方法都无效,你可以使用SSH隧道作为备用方案

使用TCP协议

虽然 SSH 协议有其自身的内置授权机制,但使用 TCP 协议通常需要在你的 Container Tools 扩展 中设置其他属性settings.json这些是:

"containers.environment": {
    "DOCKER_HOST": "tcp://你的远程机器的完全限定域名或IP:端口",
    "DOCKER_CERT_PATH": "/可选的路径到包含证书文件的文件夹",
    "DOCKER_TLS_VERIFY": "1" // 或 "0"
}

和 SSH 一样,重启 VS Code(或重新加载Windows)以使设置生效。

使用环境变量而不是settings.json

如果你不希望使用settings.json,你可以在终端中设置环境变量。设置步骤如下:

  1. 关闭所有实例的 VS Code。
  2. 确保 VS Code 在您的操作系统中路径输入:.
  3. 设置环境变量(例如DOCKER_HOST在终端 / Commands提示符中执行。
  4. 类型代码在同一个终端/Commands提示符中启动VS Code并设置变量。

使用Docker Contexts连接

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

你创造了新的上下文docker context create当前上下文可以使用使用Docker上下文 <上下文>输入:.

容器工具扩展包含在容器.环境设置环境变量的环境DOCKER_HOSTDOCKER上下文可以设置并由 Dev Containers 扩展认可。

注意: 上述设置只有在安装了Container Tools扩展时才可见。没有Container Tools扩展时,Dev Containers将使用当前上下文。

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

将现有或预定义的本地转换devcontainer.json将一个远程的,按照以下步骤进行:

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

  2. 如果您没有选择一个文件夹devcontainer.json 在其中,您可以通过在命令面板中运行 Dev Containers: 添加容器配置文件... 来选择预定义的一个 (F1)。

  3. 根据您的情况,按照以下步骤操作.devcontainer/devcontainer.json.devcontainer.json参考文献修改源代码挂载:

    Dockerfile 或镜像:

    如果你没有远程主机的登录访问权限,请使用Docker“卷”来存放你的源代码。更新.devcontainer/devcontainer.json如下(替换远程工作区如果有需要,使用唯一卷名):

    "工作区挂载": "源=远程工作区,目标=/workspac,类型=卷"
    "工作区文件夹": "/workspac",
    

    如果你登录访问权限,你可以使用远程文件系统绑定挂载:

    "工作区挂载": "源=/远程机器上的绝对路径,目标=/工作区,类型=绑定,一致性=缓存"
    "工作区文件夹": "/工作区",
    

    工作区挂载 属性支持与 Docker CLI 相同的值--挂载 标志 如果你有其他的情况。

    Docker Compose

    如果你没有远程主机的登录权限,请更新(或延长)你的docker-compose.yml. 更换 你的服务名称在这里使用指定的值“服务”物业在devcontainer.json和适当远程工作区具有唯一卷名:

    版本'3'
    服务
      your-service-name-here
    
            - remote-workspace:/workspace
        # ...
    
    :
      远程工作区:
    

    如果你登录访问权限,你可以使用远程文件系统绑定挂载:

    版本'3'
    服务
      your-service-name-here
    
          - /绝对路径/在远程机器上:/工作区:缓存
        # ...
    

    查看 Docker Compose 文档 如果你需要支持不同的场景。

  4. 运行 开发容器:在容器中重新打开 命令,从命令面板 (F1) 或 开发容器:重建容器

  5. 如果你使用的是卷而不是挂载卷,请使用⌃⇧`(Windows, Linux Ctrl+Shift+`在容器内打开终端。你可以运行克隆仓库 从这里拉取你的源代码并使用 文件 > 打开... / 打开文件夹... 来打开克隆的仓库。

下次您想连接到同一个容器时,运行 Dev Containers: 在容器中打开文件夹... 并在 VS Code Windows中选择相同的本地文件夹。

可选:将远程源代码本地化

如果你将源代码存储在远程主机的文件系统而不是Docker卷中,有几种方法可以在本地访问这些文件:

  1. 使用SSHFS挂载远程文件系统.
  2. 使用 从远程主机同步文件到你的本地机器rsync输入:.
  3. 使用安装 如果您使用 Docker Machine,请使用命令。

使用 SSHFS 或 Docker Machine 的挂载命令是更方便的选择,且不需要任何文件同步。然而,性能会比通过 VS Code 操作慢得多,因此它们最适合用于单个文件编辑和上传/下载内容。如果你需要使用一次读写多个文件的应用程序(例如本地源代码控制工具),rsync 是更好的选择。