在远程Docker主机上开发
有时您可能希望使用Dev Containers扩展在远程服务器上的容器中进行开发。Docker不支持将您的本地文件系统挂载(绑定)到远程开发容器中,因此Visual Studio Code的默认devcontainer.json 行为将无法使用您的本地源代码。虽然这是默认行为,但在本节中,我们将涵盖连接到远程主机,以便您可以 使用 Remote - SSH 扩展 在容器中打开远程主机上的文件夹,附加到任何正在运行的容器,或使用 本地 devcontainer.json将文件作为配置、创建和连接到远程开发容器的套接字使用。
使用远程 - SSH 扩展进行连接
如果您正在使用 Linux 或 macOS SSH 主机,您可以将 Remote - SSH 和 Dev Containers 扩展一起使用。您甚至不需要在本地安装 Docker 客户端。要实现这一点:
- 按照安装和SSH主机设置步骤进行Remote - SSH扩展的设置。
- 可选: 设置 SSH 密钥认证 到服务器,这样你就不需要多次输入密码。
- 安装Docker在你的SSH主机上。你不需要在本地安装Docker。
- 按照快速入门指南,使用Remote - SSH扩展连接到主机并打开一个文件夹。
- 使用 开发容器:在容器中重新打开 命令从命令面板 (F1, ⇧⌘P (Windows, Linux Ctrl+Shift+P))。
其余的 Dev Containers 快速入门可以直接应用。您可以在其文档中了解更多关于 Remote - SSH 扩展的信息。
使用远程 - 隧道扩展进行连接
您可以将Remote - Tunnels和Dev Containers扩展一起使用,以在远程主机上的容器内打开文件夹。您甚至不需要在本地安装Docker客户端。这类似于上面的SSH主机场景,但使用的是Remote - Tunnels。要实现这一点:
- 按照入门说明进行Remote - Tunnels扩展。
- 安装Docker在你的隧道主机上。你不需要在本地安装Docker。
- 按照步骤使用Remote - Tunnels扩展连接到隧道主机并打开一个文件夹。
- 使用 开发容器:在容器中重新打开 命令从命令面板 (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,你可以在终端中设置环境变量。设置步骤如下:
- 关闭所有实例的 VS Code。
- 确保 VS Code 在您的操作系统中
路径输入:. - 设置环境变量(例如
DOCKER_HOST在终端 / Commands提示符中执行。 - 类型
代码在同一个终端/Commands提示符中启动VS Code并设置变量。
使用Docker Contexts连接
Docker Contexts 允许您与不同的主机进行交互 - 您可以为每个主机设置上下文,并在它们之间进行切换。
你创造了新的上下文docker context create当前上下文可以使用使用Docker上下文 <上下文>输入:.
该容器工具扩展包含在容器.环境设置环境变量的环境DOCKER_HOST或DOCKER上下文可以设置并由 Dev Containers 扩展认可。
注意: 上述设置只有在安装了Container Tools扩展时才可见。没有Container Tools扩展时,Dev Containers将使用当前上下文。
将现有的或预定义的devcontainer.json转换
将现有或预定义的本地转换devcontainer.json将一个远程的,按照以下步骤进行:
-
打开一个本地文件夹在VS Code中(不是远程的),在其中转换文件。
-
如果您没有选择一个文件夹
devcontainer.json在其中,您可以通过在命令面板中运行 Dev Containers: 添加容器配置文件... 来选择预定义的一个 (F1)。 -
根据您的情况,按照以下步骤操作
.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 文档
卷如果你需要支持不同的场景。 -
运行 开发容器:在容器中重新打开 命令,从命令面板 (F1) 或 开发容器:重建容器。
-
如果你使用的是卷而不是挂载卷,请使用⌃⇧`(Windows, Linux Ctrl+Shift+`)在容器内打开终端。你可以运行
克隆仓库从这里拉取你的源代码并使用 文件 > 打开... / 打开文件夹... 来打开克隆的仓库。
下次您想连接到同一个容器时,运行 Dev Containers: 在容器中打开文件夹... 并在 VS Code Windows中选择相同的本地文件夹。
可选:将远程源代码本地化
如果你将源代码存储在远程主机的文件系统而不是Docker卷中,有几种方法可以在本地访问这些文件:
- 使用SSHFS挂载远程文件系统.
- 使用 从远程主机同步文件到你的本地机器
rsync输入:. - 使用
安装如果您使用 Docker Machine,请使用命令。
使用 SSHFS 或 Docker Machine 的挂载命令是更方便的选择,且不需要任何文件同步。然而,性能会比通过 VS Code 操作慢得多,因此它们最适合用于单个文件编辑和上传/下载内容。如果你需要使用一次读写多个文件的应用程序(例如本地源代码控制工具),rsync 是更好的选择。