在容器内发展

Visual Studio Code 开发容器扩展允许你将容器作为功能齐全的开发环境使用。它允许你打开容器内(或挂载到)容器中的任何文件夹,并充分利用 Visual Studio Code 的完整功能。项目中的devcontainer.json文件告诉 VS Code 如何访问(或创建)一个定义清晰的工具和运行时栈的开发容器。该容器可用于运行应用程序,或用于处理代码库所需的独立工具、库或运行时。

Workspace 文件可以从本地文件系统挂载,或复制或克隆到容器中。扩展在容器内安装并运行,他们可以完全访问工具、平台和文件系统。这意味着你只需连接到不同的容器,就能无缝切换整个开发环境。

容器架构

这使得VS Code能够提供本地质量的开发体验,包括完整的IntelliSense(补全)、代码导航和调试,无论你的工具(或代码)位于何处

开发容器扩展支持两种主要运行模式:

  • 你可以用容器作为全职开发环境
  • 你可以连接在运行中的容器上检查。

注意:开发容器扩展支持开放的开发容器规范,允许任何工具中的任何人配置一致的开发环境。你可以在我们的开发容器常见问题解答和规范官网了解更多 containers.dev

入门

注意:你可以在入门版的开发容器教程中学习如何快速使用开发容器。

系统需求

本地/远程主机:

你可以用 Docker 搭配 Dev Containers 扩展,有几种方式,包括:

  • 本地安装了Docker。
  • 安装在远程环境中的 Docker
  • 其他符合 Docker 标准的 CLI 安装,本地或远程安装。

你可以在替代Docker选项文档中了解更多。

以下是一些在本地或远程主机上配置 Docker 的具体方法:

  • Windows:Windows 10 Pro/Enterprise 上的 Docker Desktop 2.0+。Windows 10 Home(2004+)需要 Docker Desktop 2.3+ 和 WSL 2 后端。(Docker Toolbox不被支持。不支持Windows容器镜像。)
  • macOS:Docker Desktop 2.0+。
  • LinuxDocker CE/EE 18.06+ 和 Docker Compose 1.21+。(Ubuntu snap 包不被支持 。)
  • 远程主机:需要1GB内存,但建议至少2GB内存和2核CPU。

容器

  • x86_64 / ARMv7l (AArch32) / ARMv8l (AArch64) Debian 9+,Ubuntu 16.04+,CentOS / RHEL 7+
  • x86_64 Alpine Linux 3.9+

其他格利比克如果有Linux的先决条件,基于Linux容器的容器可能可行。

安装

要开始,请按照以下步骤作:

  1. 为你的作系统安装和配置Docker,使用以下路径之一或替代Docker选项,比如远程主机上的Docker或符合Docker标准的CLI。

    Windows / macOS

    1. 安装Windows/Mac版Docker Desktop

    2. 如果你在Windows上使用WSL 2,要确保WSL 2后端已启用:右键点击Docker任务栏项,选择设置。检查:使用基于WSL 2的引擎,并确认你的分发版在资源>WSL集成中已启用。

    3. 不使用 WSL 2 后端时,右键点击 Docker 任务栏项,选择设置,并更新资源>文件共享,使用源代码所在的任意地点。请参阅故障排除的技巧和窍门。

    Linux

    1. 请按照你发行版的官方 Docker CE/EE 安装说明作。如果你用的是 Docker Compose,也要按照 Docker Compose 的说明作。

    2. 添加你的用户到Docker通过使用终端来运行:sudo usermod -aG docker $USER

    3. 请登出再登录,以便您的更改生效。

  2. 安装Visual Studio CodeVisual Studio Code Insiders

  3. 安装开发容器扩展。如果你计划在 VS Code 中使用其他远程扩展,可以选择安装远程开发扩展包

使用Git?

以下是两个建议:

  • 如果你在Windows本地和容器中使用同一个仓库,务必设置一致的行尾。详情请参见技巧和窍门。
  • 如果你用Git凭证管理器克隆,你的容器应该已经能访问你的凭证了!如果你使用SSH密钥,也可以选择共享它们。详情请参见“与你的容器共享Git凭证”。

选择快速入门

这份文档包含3个快速入门——我们建议从最适合你工作流程和兴趣的那个开始:

  1. 想在快速样本仓库里试试开发容器吗?看看快速入门1:尝试开发容器
  2. 想给你已有的本地克隆项目添加开发容器吗?看看快速入门2:打开容器中的现有文件夹
  3. 想使用仓库的孤立副本,比如审查PR或调查分支机构而不影响本地工作?看看快速入门3:在隔离的容器卷中开一个git仓库或PR

快速入门:试试开发容器

最简单的入门方式是尝试使用样品显影容器。Containers 教程将带你如何设置 Docker 和 Dev Containers 扩展,并让你选择示例:

从列表中选择一个样本

注意:如果你已经安装了VS Code和Docker,可以在开发容器中使用Open。你可以在创建开发容器指南中了解更多,以及如何将其添加到你的仓库。

快速开始:打开一个容器中的现有文件夹

这个快速入门介绍了如何为现有项目搭建开发容器,作为你全职开发环境,使用文件系统中的现有源代码。请按照以下步骤作:

  1. 启动 VS Code,运行 Dev Containers:在 Command Palette 中的 Folder......命令(F1)或快速作状态栏项目,然后选择你想设置容器的项目文件夹。

    提示:如果你想在打开文件夹前编辑容器的内容或设置,可以运行开发容器:添加开发容器配置文件......

    快速作 状态栏项

  2. 现在为你的开发容器选一个起始点。你可以从可筛选的列表中选择基础开发容器模板,或者使用已有的 DockerfileDocker Compose 文件(如果你选择的文件夹中有的话)。

    注:使用 Alpine Linux 容器时,某些扩展可能无法使用,原因包括格利比克扩展内部原生代码中的依赖关系。

    选择节点开发容器模板

    列表将根据你打开的文件夹内容自动排序。

    你可能可以通过额外功能自定义开发容器,详情请见下文

    展示的开发容器模板来自我们的第一方和社区索引,这是开发容器规范的一部分。我们在开发容器/模板仓库中托管一套模板作为规范的一部分。你可以浏览SRC查看该仓库文件夹以查看每个模板的内容。

    你也可以选择使用开发容器CLI发布和分发自己的开发容器模板。

  3. 选定容器起始点后,VS Code 会将开发容器配置文件添加到你的项目中 (.devcontainer/devcontainer.json).

  4. VS Code 窗口会重新加载并开始构建开发容器。进度通知会提供状态更新。你只需要在第一次打开开发容器时搭建它;在第一次成功构建后打开文件夹会快得多。

    开发容器进度通知

  5. 构建完成后,VS Code 会自动连接到容器。

你现在可以在VS Code中与项目交互,就像在本地打开项目一样。从现在开始,当你打开项目文件夹时,VS Code 会自动拾取并重用你的开发容器配置。

提示:想使用远程Docker主机?请参阅关于在容器中远程SSH主机上打开文件夹的部分。

虽然用这种方法将本地文件系统绑定挂载到容器中很方便,但在 Windows 和 macOS 上确实存在一定的性能负担。你可以采用一些技术来提升磁盘性能,或者你可以用隔离的容器卷在容器中打开仓库

在 Windows 的容器中打开一个 WSL 2 文件夹

如果你正在使用 Windows Subsystem for Linux v2(WSL 2),并且启用了 Docker Desktop 的 WSL 2 后端,你可以使用存储在 WSL 中的源代码!

启用WSL 2引擎后,你可以选择:

  • 使用已打开的 WSL 扩展文件夹中的 Dev Containers: Reopen in Container 命令。
  • 选择开发容器:在命令面板(F1)中打开容器文件夹......并使用本地选择WSL文件夹\\wsl$共享(Windows端)。

其余快速入门内容是按现状生效的!你可以在WSL扩展的文档中了解更多。

在一个容器中的远程SSH主机上打开一个文件夹

如果你使用的是Linux或macOS的SSH主机,可以同时使用Remote - SSH和Dev Containers扩展。你甚至不需要本地安装 Docker 客户端。

具体做法:

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

其余的开发容器快速入门功能按现状应用。你可以在Remote - SSH扩展的文档中了解更多。如果你不满足需求,也可以查看“在远程Docker主机上开发”的文章,了解其他选项。

在容器中的远程隧道主机上打开一个文件夹

你可以同时使用远程隧道扩展和开发容器扩展,在远程主机上的容器中打开一个文件夹。你甚至不需要本地安装 Docker 客户端。这类似于上述SSH主机场景,但采用远程隧道。

具体做法:

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

其余的开发容器快速入门功能按现状应用。你可以在其文档中了解更多关于远程-隧道扩展的信息。如果你不满足需求,也可以查看“在远程Docker主机上开发”的文章,了解其他选项。

在容器中打开一个已有的工作区

你也可以按照类似的流程,在单个容器中打开一个 VS Code 多根工作区,前提是工作区只有引用文件夹子文件夹的相对路径.code-workspace文件(或者文件夹本身)已经在里面了。

你可以选择:

  • 使用开发容器:在容器中打开工作区......命令。
  • 使用文件>打开工作区......一旦你打开包含.code-workspace把文件放进容器里。

连接后,你可能想添加.devcontainer文件夹切换到工作区,这样如果内容还没显示,你可以轻松编辑。

另外请注意,虽然你不能在同一VS Code窗口中为同一工作区使用多个容器,但你可以从不同窗口同时使用多个Docker Compose管理的容器

快速入门:在隔离的容器卷中打开一个Git仓库或GitHub PR

虽然你可以在容器中打开本地克隆的仓库,但你可能想使用一个独立的仓库副本进行PR审查,或者调查其他分支,而不会影响你的工作。

仓库容器使用隔离的本地 Docker 卷,而不是绑定到本地文件系统。除了不污染你的文件树外,本地卷还能提升Windows和macOS的性能。(有关如何在其他场景中使用此类卷的更多信息,请参见“高级配置改进磁盘性能”条目。)

例如,按照以下步骤打开仓库容器中的“try”仓库之一:

  1. 启动 VS Code,并在 Container Volume 中从 Command Palette(F1)运行 Dev Containers: Clone Repository。

  2. 进来Microsoft/VSodE-Remote-try-Node(或其他“尝试”仓库)、输入框中出现的 Git URI、GitHub 分支 URL 或 GitHub PR URL,按回车键。

    输入框里有一个仓库名

    提示:如果你选择了私有仓库,可能需要设置凭证管理器,或者把你的SSH密钥添加到你的SSH代理中。请参见“与你的容器共享Git凭证”。

  3. 如果你的仓库没有.devcontainer/devcontainer.json在文件中,你会被要求从可筛选的列表或现有的 DockerfileDocker Compose 文件(如果存在的话)中选择起始点。

    注:使用 Alpine Linux 容器时,某些扩展可能无法使用,原因包括格利比克扩展内部原生代码中的依赖关系。

    选择节点开发容器模板

    列表将根据你打开的文件夹内容自动排序。展示的开发容器模板来自我们的第一方和社区索引,这是开发容器规范的一部分。我们在开发容器/模板仓库中托管一套模板作为规范的一部分。你可以浏览SRC查看该仓库文件夹以查看每个模板的内容。

  4. VS Code 窗口(实例)会重新加载,克隆源代码,然后开始构建开发容器。进度通知会提供状态更新。

    开发容器进度通知

    如果你在第2步粘贴了GitHub拉取请求的URL,PR会自动被借出,GitHub Pull Request扩展也会安装到容器中。该扩展还提供了额外的PR相关功能,如PR浏览器、内联与PR评论互动以及状态栏可视化。

    状态栏中的永久居民状态

  5. 构建完成后,VS Code 会自动连接到容器。你现在可以在这个独立环境中使用仓库的源代码,就像你在本地克隆代码一样。

注意,如果容器因Docker构建错误等原因无法打开,你可以在进入“恢复容器”的对话框中选择“在恢复容器中重新打开”,该对话框允许你编辑Docker文件或其他内容。这会在最小容器中打开带有克隆仓库的 Docker 卷,并显示创建日志。修复完成后,使用“容器中的重新打开”重新尝试。

提示:想使用远程Docker主机?请参阅关于在容器中远程SSH主机上打开文件夹的部分。

信任你的工作空间

Visual Studio Code 非常重视安全,致力于帮助您安全地浏览和编辑代码,无论代码源或原作者为何。Workspace Trust 功能让你决定项目文件夹是否允许或限制自动代码执行。

开发容器扩展已采用 Workspace Trust。根据你打开和作源代码的方式,你会在不同阶段被提示决定是否信任你正在编辑或执行的代码。

在容器中重新打开文件夹

现有项目搭建开发容器需要信任本地(或WSL)文件夹。在窗口重新加载前,你会被要求信任本地(或WSL)文件夹。

但这种流程有几个例外:

  1. 点击最近的条目时,
  2. 如果还没有信任,使用“在容器中打开文件夹”命令会在窗口重新加载后请求信任。

连接到现有容器

你连接到现有容器时,需要确认连接意味着你信任该容器。这只有一次被证实。

连接容器时的工作区信任提示

卷中的克隆仓库

容器卷中克隆仓库时,会要求你确认克隆仓库意味着你信任该仓库。这只有一次被证实。

在容器卷中克隆时的工作区信任提示

检查体积

检查卷开始于限制模式,你可以信任容器内的文件夹。

远程运行的 Docker 守护进程

这意味着信任运行的 Docker 守护进程所依赖的机器。没有额外的确认提示(只有上述本地/WSL案件的提示)。

创建一个devcontainer.json文件

VS Code 的容器配置存储在 devcontainer.json 文件中。这个文件类似于launch.json用于调试配置的文件,但用于启动(或附加)你的开发容器。你也可以指定容器运行后安装的扩展,或者设置创建后命令来准备环境。开发容器配置位于以下.devcontainer/devcontainer.json或存储为.devcontainer.json在你的项目根节点里的文件(注意点缀)。

选择开发容器:添加开发容器配置文件......命令面板中的命令(F1)会将所需文件添加到你的项目中,作为起点,你可以根据需要进一步自定义。该命令允许你根据文件夹内容从列表中选择预定义的容器配置,重用现有的 Docker 文件,或重用现有的 Docker Compose 文件。

选择节点开发容器模板

你也可以手动创建devcontainer.json,并以任何镜像、Dockerfile或一组Docker Compose文件作为起点。这里有一个使用预构建开发容器镜像的简单示例:

{
  "image": "mcr.microsoft.com/devcontainers/typescript-node",
  "forwardPorts": [3000],
  "customizations": {
    // Configure properties specific to VS Code.
    "vscode": {
      // Add the IDs of extensions you want installed when the container is created.
      "extensions": ["streetsidesoftware.code-spell-checker"]
    }
  }
}

注:额外的配置会根据基础镜像中的内容添加到容器中。例如,我们添加streetsidesoftware.code-拼写检查器上方扩展,容器还将包括“dbaeumer.vscode-eslint”作为这是mcr.microsoft.com/devcontainers/typescript-node.预装时会自动发生devcontainer.json你可以在预装部分阅读更多相关内容。

了解更多关于创作的信息devcontainer.json文件,参见创建开发容器

开发容器功能

开发容器“功能”是自成一体、可共享的安装代码和开发容器配置单元。这个名字源于这样一个想法:引用其中一个功能可以让你快速轻松地在开发容器中添加更多工具、运行时或库“功能”,供你或你的合作者使用。

当你使用开发容器:添加开发容器配置文件时,会给你一个脚本列表,用于自定义现有的开发容器配置,比如安装 Git 或 Azure CLI:

开发容器功能列表下拉菜单

当你在容器中重建并重新打开时,你选择的功能将会在你的devcontainer.json:

"features": {
    "ghcr.io/devcontainers/features/github-cli:1": {
        "version": "latest"
    }
}

编辑“特色”财产在devcontainer.json直接:

修改 Terraform 功能时的 Intellisense

开发容器:配置容器功能命令允许你更新现有配置。

VS Code UI 中引用的功能现在来自一个中央索引,你也可以为其贡献。请参阅开发容器规范网站获取当前列表,并学习如何发布和分发功能

“始终安装”功能

类似于你可以设置扩展总是安装在开发容器中,你可以使用

dev.containers.defaultFeatures
  • 在VS代码中打开
  • 在VS Code Insiders中开放
用户设置以设置你一直想安装的功能:

"dev.containers.defaultFeatures": {
    "ghcr.io/devcontainers/features/github-cli:1": {}
},

创建您自己的专栏

创建和发布自己的开发容器功能也很简单。已发布的功能可以作为OCI工件存储和共享,来自任何支持的公共或私有容器注册表。你可以在 containers.dev 上查看当前已发表的专题列表。

功能是文件夹中至少包含devcontainer-feature.json以及install.sh入门脚本:

+-- feature
|    +-- devcontainer-feature.json
|    +-- install.sh
|    +-- (other files)

查看功能/入门仓库,了解如何使用开发容器CLI发布自己的公开或私有功能。

功能、规格与分发

功能是开源开发容器规范的关键组成部分。你可以查看更多关于功能工作原理及其分发的信息。

预构建开发容器镜像

我们建议用所需的工具预先构建图片,而不是每次在开发容器中打开项目时都创建和构建容器镜像。使用预构建镜像可以加快容器启动速度,配置更简单,并允许你锁定特定版本的工具,以提升供应链安全性,避免潜在的故障。你可以通过使用DevOps或持续集成(CI)服务(如GitHub Actions)来调度构建,实现镜像预构建的自动化。

更好的是——预构建的镜像可以包含开发容器元数据,这样当你引用镜像时,设置会自动被拉取。

我们建议使用Dev Container CLI(或其他支持的规范工具如GitHub Action)来预构建你的镜像,因为它与开发容器扩展的最新功能保持同步——包括开发容器功能。构建好镜像后,你可以将其推送到容器注册表(比如 Azure 容器注册表GitHub 容器注册表Docker Hub),并直接引用它。

你可以在 devcontainers/ci 仓库中使用 GitHub Action,帮助你在工作流程中重用开发容器。

想了解更多,请访问开发容器CLI关于预构建镜像的文章

继承元数据

你可以通过图片标签在预构建的镜像中包含开发容器配置和功能元数据。这使得图像自包含,因为这些设置在被引用图像时会自动获取——无论是直接引用,还是在来自在被引用的 Dockerfile 或 Docker Compose 文件中。这有助于防止开发容器配置和镜像内容不同步,并通过简单的镜像引用将同一配置的更新推送到多个仓库。

当你使用开发容器CLI(或其他支持工具的规范,如GitHub ActionAzure DevOps任务)预构建时,这个元数据标签会自动添加,并包含以下设置devcontainer.json以及任何引用的开发容器功能。

这让你可以拥有一个更复杂的独立方案 devcontainer.json你可以先预先构建你的映像,然后在一个或多个仓库中构建一个极其简化的图像。图片内容将与以下简化版合并devcontainer.json在你创建容器时的内容(关于合并逻辑的信息请参见规范)。但最简单的做法是,你可以直接在devcontainer.json设置生效时:

{
  "image": "mcr.microsoft.com/devcontainers/go:1"
}

请注意,你也可以选择手动在图片标签中添加元数据。即使你没有使用开发容器的CLI构建,这些属性也会被拾取(即使使用了,CLI也能更新)。例如,考虑这个 Dockerfile 片段:

LABEL devcontainer.metadata='[{ \
  "capAdd": [ "SYS_PTRACE" ], \
  "remoteUser": "devcontainer", \
  "postCreateCommand": "yarn install" \
}]'

检查体积

偶尔你可能会遇到使用一个名为 Docker 的卷的情况,想要检查或修改它。你可以用 VS Code 处理这些内容,无需创建或修改devcontainer.json通过选择开发容器:在命令调色板(F1)中探索开发容器中的卷......来实现文件。

你也可以在远程探索器中检查你的体积。确保你在下拉菜单中选中了容器,这样你会看到开发卷(Dev Volumes)部分。你可以右键点击卷查看其创建信息,比如创建卷的时间、克隆到里面的仓库以及挂载点。你也可以在开发容器里探索。

在远程资源管理器中右键点击开发卷

如果你安装了 Container Tools 扩展,可以在 Container ExplorerVolumes 部分右键点击某个卷,选择“在开发容器中探索”。

在开发容器中探索,在容器工具的上下文菜单中

管理扩展

VS Code 在两个地方运行扩展:本地在 UI/客户端,或者在容器里。影响VS Code界面的扩展,如主题和片段,是本地安装的,但大多数扩展会放在特定的容器中。这让你只需在容器中安装特定任务所需的扩展,只需连接到新容器即可无缝切换整个工具链。

如果你从扩展视图安装扩展,它会自动安装到正确的位置。你可以根据分类分组判断扩展安装的位置。会有一个本地-安装类别,还有一个是针对你的容器的。

工作区扩展类别

局部扩展类别

注:如果您是扩展作者,且扩展无法正常工作或安装在错误位置,详情请参见支持远程开发

真正需要远程运行的本地扩展会在本地 - 已安装类别中显示为禁用。选择安装,在远程主机上安装扩展。

禁用带安装按钮的扩展

你也可以进入扩展视图,使用“本地已安装”标题栏右侧的云按钮,选择“在开发容器中安装本地扩展”{Name},安装所有本地安装的扩展。它会显示一个下拉菜单,你可以选择在容器中安装哪些本地安装的扩展。

安装所有扩展

不过,有些扩展可能需要你在容器中安装额外的软件。如果遇到问题,请查阅扩展文档获取详细信息。

向devcontainer.json添加扩展

虽然你可以手动编辑devcontainer.json文件以添加扩展名ID列表,也可以在扩展页面中右键点击任意扩展名,选择添加到devcontainer.json

添加到devcontainer.json菜单

选择退出延期

如果基础镜像或功能配置了你不希望安装在开发容器中的扩展,你可以选择退出,方法是用减号列出该扩展。例如:

{
  "image": "mcr.microsoft.com/devcontainers/typescript-node:1-20-bookworm",
  "customizations": {
    "vscode": {
      "extensions": ["-dbaeumer.vscode-eslint"]
    }
  }
}

“始终安装”扩展

如果你希望任何容器里都有安装的扩展,可以更新

dev.containers.defaultExtensions
  • 在VS代码中打开
  • 在VS Code Insiders中开放
用户设置。例如,如果你想安装 GitLensResource Monitor 扩展,可以指定它们的扩展 ID: 如下:

"dev.containers.defaultExtensions": [
    "eamodio.gitlens",
    "mutantdino.resourcemonitor"
]

高级:强制扩展在本地或远程运行

扩展通常设计和测试为本地运行或远程运行,而非两者兼有。不过,如果扩展支持它,你可以强制它在你的某个特定位置运行settings.json档案。

例如,下面的设置将强制容器工具扩展在本地运行,远程运行 - SSH: 编辑配置文件扩展名,而不是它们的默认扩展:

"remote.extensionKind": {
    "ms-azuretools.vscode-containers": [ "ui" ],
    "ms-vscode-remote.remote-ssh-edit": [ "workspace" ]
}

一个值为“ui”代替“工作空间”会强制扩展在本地UI/客户端运行。通常,除非扩展文档另有说明,否则这只应用于测试,因为这可能会破坏扩展。详情请参见推荐分机地点部分。

转发或发布端口

容器是独立的环境,所以如果你想访问容器内的服务器、服务或其他资源,你需要将端口“转发”或“发布”给你的主机。你可以配置容器始终暴露这些端口,或者暂时转发它们。

总是转发端口

你可以指定一个你在连接或打开容器文件夹时想转发的端口列表,方法是使用前向端口财产devcontainer.json.

"forwardPorts": [3000, 3001]

只需重新加载/重新打开窗口,当VS Code连接到容器时,该设置就会被应用。

临时转发端口

如果你需要访问一个你没添加的端口devcontainer.json或者发布在你的 Docker Compose 文件中,你可以通过命令面板(F1)中的“转发端口”命令,暂时转发一个新端口,持续会话结束。

前向端口输入

选择端口后,会有通知告诉你应该用哪个本地host端口访问容器中的端口。例如,如果你转发了一个在端口3000监听的HTTP服务器,通知可能会告诉你它被映射到localhost的端口4123。然后你可以用以下方式连接到这个远程 HTTP 服务器http://localhost:4123.

如果你之后需要访问,也可以在远程探索器的转发端口部分找到同样的信息。

如果你想让VS Code记住你转发过的任何端口,可以在设置编辑器中查看远程:恢复转发端口⌘,(Windows,Linux Ctrl+,)或设置“remote.restoreForwardedPorts”: truesettings.json.

恢复转发端口设置

发布移植版

Docker 有“发布”端口的概念,是在容器创建时进行。发布的端口表现非常类似于你提供给本地网络的端口。如果你的申请只接受来自以下人员的电话本地主持它会像本地机器拒绝网络调用一样,拒绝来自已发布端口的连接。而转发端口实际上看起来像本地主持应用。每种情况都能在不同情况下发挥作用。

要发布移植版,你可以:

  1. 使用appPort属性:如果你引用了图片或 Dockerfiledevcontainer.json,你可以使用应用移植该属性用于向主机发布端口。

    "appPort": [ 3000, "8921:5000" ]
    
  2. 使用Docker Compose端口映射:端口映射可以轻松添加到你docker-compose.yml文件以发布额外的移植。

    ports:
    - "3000"
    - "8921:5000"
    

每种情况下,你需要重建容器才能让设定生效。你可以通过连接容器时,在命令面板(F1)中运行“开发容器:重建容器”命令来实现。

开设终端

用 VS Code 在容器中打开终端很简单。一旦你打开了容器中的某个文件夹,你在VS Code中打开的任何终端窗口终端>新终端)都会自动在容器中运行,而不是本地运行。

你也可以使用代码在同一终端窗口中执行命令行作,如在容器中打开新文件或文件夹。类型代码——帮助了解命令行有哪些选项。

使用代码CLI的应用

容器中的调试

一旦你打开容器中的文件夹,就可以像本地运行应用一样使用 VS Code 的调试器。例如,如果你在 中选择一个启动配置launch.json并开始调试(F5),应用程序会从远程主机开始,并将调试器附加到主机上。

有关配置 VS Code 调试功能的详细信息,请参见调试文档.vscode/launch.json.

容器特定设置

当你连接到开发容器时,VS Code 的本地用户设置也会被重用。虽然这样可以保持用户体验的一致性,但你可能需要在本地机器和每个容器之间调整部分设置。幸运的是,一旦连接到容器,你也可以通过命令面板中的“偏好设置”F1)命令,或在设置编辑器中选择“远程”标签来设置容器特定设置。这些设置会覆盖你连接容器时本地设置。

容器专用设置标签页

默认容器特定设置

你可以在devcontainer.json使用背景设定财产。这些值会在容器创建后自动放入容器内的专用设置文件中。

例如,将此加到.devcontainer/devcontainer.json将为 Java 设定主路径:

// Configure tool-specific properties.
"customizations": {
    // Configure properties specific to VS Code.
    "vscode": {
        "settings": {
            "java.home": "/docker-java-home"
        }
    }
}

既然这只是建立默认设置,容器创建后你仍然可以根据需要更改设置。

管理容器

默认情况下,开发容器扩展会自动启动devcontainer.json当你打开文件夹时。关闭VS Code后,扩展会自动关闭你连接的容器。你可以通过添加添加来改变这种行为“shutdownAction”:“无”devcontainer.json.

虽然你可以用命令行管理容器,也可以使用远程资源管理器。要停止一个容器,请从下拉菜单中选择“容器”(如果存在),右键点击正在运行的容器,然后选择“停止容器”。你还可以启动退出的容器、移除容器和删除最近的文件夹。在详情视图中,你可以转发端口,并在浏览器中打开已转发的端口。

容器浏览器截图

如果你想清理图片或批量删除容器,请参见“清理未使用的容器和图片”,了解不同的选项。

使用点文件仓库进行个性化

点文件是指文件名以点开头的文件(.)通常包含各种应用的配置信息。由于开发容器可以覆盖多种应用类型,存储这些文件会很有用,这样一旦容器上线运行后,你可以轻松复制到容器中。

一种常见的做法是将这些点文件存储在GitHub仓库中,然后使用工具克隆并应用它们。Dev Containers 扩展内置支持在你自己的容器中使用这些文件。如果你是新手,可以看看现有的不同dotfiles bootstrap仓库

使用时,请将你的 dotfiles GitHub 仓库添加到 VS Code 的用户设置(⌘, (Windows, Linux Ctrl+,),如下:

点文件设置

或者说settings.json:

{
  "dotfiles.repository": "your-github-id/your-dotfiles-repo",
  "dotfiles.targetPath": "~/dotfiles",
  "dotfiles.installCommand": "install.sh"
}

从此以后,每当容器创建时,dotfiles 仓库都会被使用。

已知的局限性

开发容器的局限性

  • 支持Windows容器镜像。
  • 多根工作区中的所有根/文件夹都会在同一容器中打开,无论底层是否有配置文件。
  • Linux 非官方的 Ubuntu Docker Snap被支持。请按照你发行版的官方 Docker 安装说明作。
  • Windows 版的 Docker Toolbox 不被支持。
  • 如果你用SSH克隆了一个Git仓库,且你的SSH密钥带有密码短语,VS Code的拉取和同步功能在远程运行时可能会卡住。要么用无密码的SSH密钥,要么用HTTPS克隆,要么直接运行Git 推送从命令行开始绕过这个问题。
  • 本地代理设置不会在容器内重用,这可能导致扩展无法正常工作,除非配置了适当的代理信息(例如全局)HTTP_PROXYHTTPS_PROXY环境变量,并配有相应的代理信息)。
  • 当 ssh 代理运行版本 <= 8.8,而 SSH 客户端(在任何平台)运行版本 >= 8.9 时,Windows上的 OpenSSH 版本之间存在不兼容。解决方法是将 Windows 上的 OpenSSH 升级到 8.9 或更高版本,使用 Winget 或 Win32-OpenSSH/releases 中的安装程序。(注意ssh-add -l会正常工作,但SSH <SSH服务器>将失败于<ssh-server>:权限被拒绝(公开密钥). 这也会影响使用 SSH 连接仓库的 Git 文件。)

这里有与容器相关的活跃议题列表

Docker 限制

更多信息请参见Windows或Mac版Docker故障排除指南。

容器工具扩展的限制

如果你使用容器工具或Kubernetes扩展,来自WSL、远程隧道或远程SSH窗口,使用容器资源管理器或Kubernetes视图中的“附加Visual Studio代码”右键菜单作,会再次要求从可用容器中选择。

扩展限制

目前,大多数扩展可以在开发容器内无需修改即可运行。不过,在某些情况下,某些功能可能需要更改。如果你遇到扩展问题,请查看这里,了解常见问题和解决方案的总结,您可以在向扩展作者报告问题时提及。

此外,虽然有Alpine支持,但容器内安装的一些扩展可能因以下原因无法使用。格利比克扩展内部原生代码中的依赖。详情请参见“Linux远程开发”条目。

高级容器配置

请参阅高级容器配置文章,了解以下主题:

devcontainer.json参考文献

有一个完整的devcontainer.json参考,你可以查看文件结构,帮助你定制开发容器并控制如何连接到运行中的容器。

问题或反馈

故障排除

无法写入文件(NoPermissions (FileSystemError))

当你在以下配置中运行开发容器时,可能会遇到这个问题:

  • 运行Windows Subsystem for Linux(WSL)后端的Docker Desktop。
  • 增强容器隔离(ECI)启用

查看问题#8278,寻找可能的解决办法。

下一步