教育中的开发容器:教师指南
2020年7月27日,作者:Brigit Murtaugh,@BrigitMurtaugh
我们听到许多教育工作者反映,学期的前几天或几周可能会因为为学生配置正确的环境而浪费掉。即便如此,学生最终可能仍然会面临开发体验质量低下或作业评分不足的问题:
"为我的学生设置通常需要五个课时。有不同版本的Python需要处理。有很多复杂性。遗憾的是,这种复杂性需要花费大量的时间和金钱来解决。" -[美国社区学院教授 CS 101]
"我更喜欢一个专门为Python安装设置的VS Code版本..." -[文理学院助理教授]
使用Visual Studio Code的开发容器可以作为一种极好的教育工具,确保学生拥有一个一致的编码环境。它们负责设置,以便学生和教师可以快速跳过配置,转而专注于真正重要的事情:学习和编写出色的代码!
开发容器
那么,什么是开发容器?容器是一种软件,它打包了代码以及代码运行所需的所有依赖项,包括运行时、工具、库和设置。容器最初是为了在一致的环境中部署和管理应用程序,并更高效地利用硬件而创建的。后来,它们演变为帮助提供一致的构建环境,最近更是用于开发环境。这就是开发容器名称的由来。
当你创建一个容器时,它的初始内容来自所谓的“镜像”。镜像可以被视为一个预装了操作系统和其他工具的小型磁盘驱动器。你使用Dockerfile描述镜像中的内容,一旦你运行镜像,它就会变成一个容器。
开发容器提供了一个与您的计算机分离的编码环境。例如,如果您下载了特定版本的依赖项,该版本将是容器独有的。在下图中,请注意容器如何包含应用程序及其必要的依赖项,使计算机(主机操作系统和基础设施)保持自由和清洁,没有任何依赖项:
作为讲师,您可以为作业创建特定的镜像。每个学生将获得完全相同版本的依赖项,例如相同版本的Python或C++编译器,无论他们的操作系统或计算机上已安装的任何其他文件如何。
VS Code 中的开发容器
Visual Studio Code 的 Dev Containers 扩展允许您使用容器作为主要的编码环境。在课堂上,教师可以使用 现有的开发容器,或者创建自己的容器,并与班级共享。每个学生都可以在 VS Code 中打开容器,并自动获得开发应用程序所需的工具和运行时环境。学生在编码时还可以访问 VS Code 的完整功能集,包括 IntelliSense 和调试功能。
Dev Containers 扩展仅适用于基于 Linux 的容器,因此尽管学生们的计算机上可能运行着不同的操作系统,但他们的编码环境将保持一致。
我们已经看到教师们在课堂上成功使用Dev Containers。你可以查看使用DevContainers标准化学生开发环境:经验报告,了解更多关于三位研究人员在加州大学圣地亚哥分校课程中使用dev容器的经验。
这篇文章将作为指导,帮助教师们在课堂上实施开发容器,以创建一个更顺畅、更一致的环境供学生使用。
要亲眼见证开发容器的实际应用以及学生如何在短短5分钟内开始使用,请查看我们的学生介绍视频。
教师指南
使用传统的设置方法,学生在设置他们的环境时可能会遇到各种各样的问题。一些例子包括他们独特的操作系统的差异、项目文件的存储位置,或者他们安装的运行时或工具的小差异。教师需要精通所有这些细微差别,以便能够帮助学生解决这些问题。
一个常见的问题是管理工具的不同版本。以Python为例:有Python 2和Python 3,以及不同的次要版本。拥有多个Python版本,以及多个配套工具(如linters),可能会让人感到困惑并导致错误。
为了节省大量时间和避免混淆,我们可以使用开发容器来为我们的班级创建一个标准化的Python开发环境。学生们都将获得相同版本的Python,避免了安装新版本或卸载旧版本的需要,并且每个运行相同容器和源代码的人都会得到完全相同的结果。
先决条件
- 安装 Visual Studio Code。
- 安装 Docker Desktop。
- Docker 是构建和共享容器的行业标准。我们推荐使用 Docker Desktop Stable 2.3.0.3,因为这是 Docker Desktop 的最新且性能最佳的版本。
- 最近引入了Windows Home 上的 Docker Desktop 支持。它需要 Windows 10 版本 2004 并启用 Windows Subsystem for Linux 2 (WSL 2) 后端。按照WSL 2 安装指南启用 WSL 2。
- 对于不想配置 WSL 2 后端的学生,可以在 Windows 10 Pro、Enterprise 或 Education(版本 16299 或更高版本)上使用Docker Desktop for Windows,并且必须启用 Hyper-V 和 Containers Windows 功能。
让我们首先启动VS Code,我们可以通过在命令提示符或终端中输入code
来完成(或者只需在您的计算机上选择VS Code):
一旦VS Code启动,请确保您已安装Dev Containers扩展:
当我们安装任何远程扩展时,绿色的远程指示器会添加到状态栏的左下角:
您可以点击它以打开命令面板并验证是否列出了Dev Containers命令:
访问您的类的容器
让我们通过一个示例开发容器来帮助学生获得一致的编码环境。在我们的教室中,我们可以创建一个单一的GitHub仓库来存储共享相同技术栈的练习。例如,所有的Python作业都可以使用相同的容器,并存储在同一个仓库中。
我们有一个示例 vscode-course-sample GitHub 仓库,其中包含一个 Python 开发容器和两个 Python 入门作业。让我们在 VS Code 中打开它。
您可以选择左下角的远程指示器,或使用命令面板,以调出开发容器命令。
让我们调用在容器卷中克隆仓库...
我们需要输入存储我们容器的GitHub仓库的URL,在我们的例子中是microsoft/vscode-course-sample:
你可以创建一个唯一的卷。 卷是容器中存储文件的地方:
既然我们已经选择了我们的容器仓库,VS Code 重新加载以构建镜像并启动容器:
一旦容器构建并运行,我们的文件就会被加载,我们就可以开始在Python环境中编码了!
点击资源管理器中的sort.py
以打开它,然后按F5(或右上角的绿色运行图标)来运行它:
我们的Python代码成功运行,而无需在本地计算机上设置Python。
我们还可以使用VS Code的所有功能,例如设置断点来暂停我们的程序并帮助我们调试。让我们在对单词列表进行排序时设置一个断点。
我们可以使用F5来运行我们的程序。注意,程序一旦遇到断点就会停止:
为您的类创建容器
既然我们已经看到了一个容器的精彩示例,现在让我们使用Dev Containers扩展来设置我们的第一个容器。让我们从一个“Hello World” Python应用程序开始:
我们将选择Dev Containers: Add Dev Container Configuration Files…来开始设置开发容器所需的文件:
容器配置文件是创建和定制开发容器所需的。显示的容器定义列表是根据您的应用程序内容进行过滤的,在我们的案例中是一个Python文件。让我们选择Python 3:
Dev Containers 扩展会自动添加一个 .devcontainer
文件夹,并在其中包含两个配置文件:devcontainer.json
和一个 Dockerfile。让我们更详细地看一下这两个文件。
devcontainer.json
devcontainer.json
描述了 VS Code 应该如何启动我们的容器以及连接后应该做什么。这个文件可以位于 .devcontainer/devcontainer.json
下,或者直接作为 devcontainer.json
存储在项目的根目录中。
这里是一个简单的devcontainer.json
示例。它拉取了一个预配置的Node镜像,自动为端口3000设置端口转发,并在容器创建时安装eslint扩展:
这里有一个稍微更详细的devcontainer.json
示例,适用于我们的Python项目。它通过dockerfile
属性引用了一个Dockerfile,而不是直接使用镜像。它还自动安装了Python扩展,并在容器创建后建立了一组特定于容器的设置,例如代码检查:
devcontainer.json
是一个很好的机会,可以创建一个定制的编码环境,以满足学生的特定需求。您可以指定一些变量,为每个班级或作业创建独特的环境。
我们建议在教育用途的devcontainer.json
中开始使用的变量是:
Property | Type | Description |
---|---|---|
image |
string | The name of an image in a container registry (i.e. DockerHub) that VS Code should use to create the dev container. |
dockerFile |
string | The location of a Dockerfile that defines the contents of the container. The path is relative to the devcontainer.json file. You can find a number of sample Dockerfiles for different runtimes in the vscode-dev-containers repository. |
name |
string | A display name for the container. |
extensions |
array | An array of extension IDs that specify the extensions that should be installed inside the container when it is created. Defaults to [] . |
settings |
object | Adds default settings.json values into a container/machine specific settings file. |
在这个文件中设置一些变量从长远来看会节省你的课堂时间。例如,你可以使用extensions
变量来确保所有学生自动安装相同的扩展集。设置路径也可能具有挑战性或导致学生电脑上的问题,但通过settings
变量指定路径信息,你将节省课堂时间,并确保他们的电脑路径变量在此过程中不受损害。
在devcontainer.json 参考中有所有可包含在此配置文件中的可用属性的表格。
Dockerfile
Docker可以通过读取Dockerfile中的指令自动构建镜像。这个文件至少会使用FROM
指定一个基础镜像,并且可以包含命令行指令。
以下是我们的Python应用程序中的Dockerfile的样子:
打开容器
一旦我们的容器配置文件被添加,我们收到了一个通知,说我们的文件夹现在有一个devcontainer.json
文件。让我们选择在容器中重新打开:
VS Code 的新实例启动,我们的镜像正在构建,我们的应用程序正在开发容器中启动:
一旦我们的容器构建完成,我们就拥有了所有相同的文件,但现在左下角的指示器显示为“Dev Container: Python 3”,表示我们正在容器内部。我们可以轻松地运行我们的代码,无论本地机器上安装的是哪个版本的Python(如果有的话)!
创建和分享作业
现在你已经有了一个开发容器,你可以将其上传到一个仓库中,以便你的学生可以访问它来完成他们的作业。你可以在README
中包含作业说明,以及作业所需的任何基础或模板代码,还有一个.devcontainer
文件夹,以便他们都能有一致的开发体验。所有这些文件都可以作为一个单一的仓库上传。
确保你已经安装了Git。你可以在VS Code中从你的容器项目初始化一个新的Git仓库。或者,你可以在命令行中使用git init
从你的项目目录中初始化。
下一步是将您的本地仓库连接到浏览器中的GitHub上的新仓库:
然后,我们将把本地的Git仓库(我们电脑上的容器项目)连接到远程仓库(我们在浏览器中创建的GitHub仓库):
您可能会被提示登录GitHub。一旦您登录,您的文件就可以添加到您的远程Git仓库中:
现在,当我在浏览器中刷新GitHub时,我可以查看我的文件!
有关如何将您的仓库上传到GitHub的更多信息,请查看此将现有项目添加到GitHub的指南。
访问作业
要了解学生如何从GitHub访问开发容器并轻松开始编程,请查看我们的5分钟快速视频。
反馈与更多资源
为了帮助您使用容器设置VS Code,我们在VS Code的远程开发文档中提供了详细的文章。如果您对我们的团队有任何问题或反馈,请随时在VS Code的远程开发GitHub仓库上提出问题,或者在Twitter上@code给我们发推文。
编程快乐!
Brigit Murtaugh, VS Code 项目经理 @BrigitMurtaugh