尝试以扩展 VS Code 中的代理模式!

开发容器教程

本教程将引导您使用 开发容器 扩展在 Docker 容器中运行 Visual Studio Code。您无需具备 Docker 相关知识即可完成本教程。

在 Docker 容器运行 VS Code 有许多好处,但在本演练中,我们将重点介绍如何使用 Docker 容器设置一个与本地环境分离的开发环境。

先决条件

您需要安装 Visual Studio Code

安装 Docker

需要 Docker 来创建和管理您的容器。

Docker Desktop

下载并安装 Docker Desktop,或选择 其他 Docker 选项,例如远程主机上的 Docker 或兼容 Docker 的 CLI。

启动 Docker

运行 Docker Desktop 应用程序以启动 Docker。如果您在活动托盘中看到 Docker 鲸鱼图标,则表示它正在运行。

Docker 可能需要几分钟才能启动。如果鲸鱼图标正在动画显示,则它可能仍在启动过程中。您可以单击该图标以查看状态。

Docker status

检查 Docker

Docker 运行后,您可以通过打开一个终端窗口并输入命令来确认一切正常

docker --version
# Docker version 18.09.2, build 6247962

安装扩展

开发容器扩展允许您在 Docker 容器中运行 Visual Studio Code。

安装开发容器扩展

Dev Containers extension

检查安装

安装开发容器扩展后,您将在最左侧看到一个新的状态栏项。

Remote Status bar item

远程状态栏项可以快速显示 VS Code 正在哪个上下文中运行(本地或远程),单击该项将调出开发容器命令。

Dev Containers commands

获取示例

要创建一个 Docker 容器,我们将打开一个包含 Node.js 项目的 GitHub 仓库。

打开命令面板 (F1) 运行命令 开发容器:尝试开发容器示例... 并从列表中选择 Node 示例。

Select a sample from the list

注意:还有其他开发容器示例,如 vscode-remote-try-pythonvscode-remote-try-java,但本教程将使用 vscode-remote-try-node

等待容器构建

窗口将重新加载,但由于容器尚不存在,VS Code 将创建一个容器并将示例仓库克隆到一个隔离的容器卷中。这可能需要一些时间,进度通知将提供状态更新。幸运的是,下次打开文件夹时,由于容器已存在,因此不需要此步骤。

Dev Container Progress Notification

容器构建完成后,VS Code 会自动连接到它,并将项目文件夹从本地文件系统映射到容器中。

检查容器

一旦容器运行并连接,您应该会在状态栏的左下方看到远程上下文发生变化

Building image

检查您的环境

在容器中开发的一个好处是,您可以使用应用程序所需的特定版本依赖项,而不会影响本地开发环境。

本教程的特定容器安装了 Node.js v18,您可以通过打开新终端 终端 > 新终端 (⌃⇧` (Windows, Linux Ctrl+Shift+`)) 并输入来检查

node --version; npm --version

这应该显示以下版本

Node.js version check

运行应用程序

我们现在可以按 F5,这将在容器内运行应用程序。一旦进程启动,导航到 https://:3000,您应该会看到简单的 Node.js 服务器正在运行!

Running the application

结束容器连接

您可以通过 文件 > 关闭远程连接 来结束容器中的会话并返回到本地运行 VS Code。

工作原理

下一节将更详细地描述开发容器扩展如何设置和配置您的容器。

开发容器扩展使用 .devcontainer 文件夹中的文件,即 devcontainer.json,以及可选的 Dockerfiledocker-compose.yml 来创建您的开发容器。

在我们刚刚探索的示例中,项目有一个包含 devcontainer.json.devcontainer 文件夹。devcontainer.json 使用镜像 mcr.microsoft.com/devcontainers/javascript-node:0-18。您可以在 devcontainers/images 仓库中更详细地探索此镜像。

首先,您的镜像根据提供的 Dockerfile 或镜像名称构建,在本例中为 mcr.microsoft.com/devcontainers/javascript-node:0-18。然后使用 devcontainer.json 中的一些设置创建并启动容器。最后,根据 devcontainer.json 中的设置再次安装和配置您的 Visual Studio Code 环境。例如,本示例中的开发容器安装了 streetsidesoftware.code-spell-checker 扩展。

注意:基于基础镜像中的内容,容器中将自动添加额外的配置。例如,我们上面看到了 streetsidesoftware.code-spell-checker 扩展,容器还将包含 "dbaeumer.vscode-eslint",因为这是 mcr.microsoft.com/devcontainers/typescript-node 的一部分。这在通过 devcontainer.json 预构建时会自动发生,您可以在预构建部分中阅读更多相关内容。

完成所有这些操作后,您的本地 Visual Studio Code 副本将连接到在新开发容器中运行的 Visual Studio Code 服务器。

Architecture

devcontainer.json

devcontainer.json 基本上是一个配置文件,它决定了您的开发容器如何构建和启动。

//devcontainer.json
{
  "name": "Node.js",

  // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
  "image": "mcr.microsoft.com/devcontainers/javascript-node:0-18",

  // Features to add to the dev container. More info: https://containers.dev/features.
  // "features": {},

  "customizations": {
    "vscode": {
      "settings": {},
      "extensions": ["streetsidesoftware.code-spell-checker"]
    }
  },

  // "forwardPorts": [3000],

  "portsAttributes": {
    "3000": {
      "label": "Hello Remote World",
      "onAutoForward": "notify"
    }
  },

  "postCreateCommand": "yarn install"

  // "remoteUser": "root"
}

上面的示例是从我们在教程中使用的 vscode-remote-try-node 仓库中提取的。

选项 描述
镜像 VS Code 应该用于创建开发容器的容器注册表(Docker HubGitHub 容器注册表Azure 容器注册表)中的镜像名称。
Dockerfile 除了引用 image,您还可以使用 dockerfile 属性,它是您要用作镜像的 Dockerfile 的相对路径。
功能 要添加的开发容器功能 ID 及其相关选项的对象。
自定义 配置特定于工具的属性,例如 VS Code 的 settingsextensions 属性。
设置 将默认的 settings.json 值添加到特定于容器/机器的设置文件,例如 "terminal.integrated.defaultProfile.linux": "bash"
扩展 一个扩展 ID 数组,指定在创建容器时应在容器内部安装的扩展。
转发端口 使容器内部的端口列表在本地可用。
端口属性 为特定转发端口设置默认属性。
postCreateCommand 容器创建后要运行的命令字符串或命令参数列表。
远程用户 覆盖 VS Code 在容器中(以及子进程)运行的用户。默认为 containerUser

您可以查看 devcontainer.json 选项的完整列表

恭喜

恭喜,你已成功完成本教程!

以上是对开发容器可能实现的功能的简要概述。作为下一步,我们建议您了解如何在容器中打开计算机上的现有文件夹在隔离容器中打开 GitHub 仓库或 PR

查看其他远程开发扩展。

或者通过安装远程开发扩展包获取所有这些扩展。

故障排除

验证 Docker 上下文

如果您没有使用全新的 Docker 安装,并且 开发容器:尝试开发容器示例... 示例在当前上下文中遇到问题,您应该检查您的 Docker 上下文。全新安装将有一个“default”上下文,您可以将其设置回当前上下文。

# Displays the list of contexts, '*' denotes the current context
docker context list

# Switches the list to the 'default' context
docker context use default