教育领域的开发容器:教师指南
2020 年 7 月 27 日,Brigit Murtaugh 撰写,@BrigitMurtaugh
我们从许多教育工作者那里听说,学期的头几天或几周可能会花费在为学生配置正确的环境上。即便如此,学生们最终可能仍然会面临低质量的开发体验或对其作业评分不足的问题。
“为我的学生设置环境通常需要五个课时。需要处理各种版本的 Python。有很多复杂性。遗憾的是,解决这些复杂性需要花费大量的时间和金钱。” -[美国社区大学 CS 101 教授]
“我更喜欢专门为 Python 安装设置的 VS Code 版本...” -[文理学院助理教授]
在教育领域,使用 Visual Studio Code 的开发容器可以成为一种极好的工具,确保学生拥有一致的编码环境。它们负责设置工作,这样学生和教师就可以快速跳过配置环节,转而专注于真正重要的事情:学习和编写出色的代码!
开发容器
那么,什么是开发容器?容器是一种软件片段,它将代码以及代码运行所需的所有依赖项(包括运行时、工具、库和设置)打包在一起。容器最初是作为一种在一致环境中部署和管理应用程序并更有效地利用硬件的方式而创建的。后来,它们发展到帮助提供一致的构建环境,最近则用于提供开发环境。Dev Container(开发容器)这个名称就来源于此。
当你创建一个容器时,它的初始内容来自于所谓的“镜像”。镜像可以被视为一个迷你磁盘驱动器,其中预装了操作系统和其他工具。你使用 Dockerfile 来描述镜像中包含的内容,一旦你运行镜像,它就变成一个容器。
开发容器提供了一个与你的计算机隔离的编码环境。例如,如果你下载了某个特定版本的依赖项,该版本将仅存在于该容器中。在下图中,请注意容器如何包含应用程序及其必要的依赖项,使计算机(主机操作系统和基础设施)免受任何依赖项的影响,保持干净。
作为一名教师,你可以为作业创建一个特定的镜像。每个学生都将获得完全相同版本的依赖项,例如相同版本的 Python 或 C++ 编译器,无论他们的操作系统或计算机上已经安装了哪些其他文件。
在 VS Code 中使用开发容器
Visual Studio Code 的 Dev Containers 扩展允许你使用容器作为主要的编码环境。在课堂上,教师可以使用现有的开发容器,或者创建自己的开发容器,并与班级共享。每个学生都可以在 VS Code 中打开容器,并自动拥有开发应用程序所需的工具和运行时。在编码时,学生还将可以使用 VS Code 的全部功能,包括 IntelliSense 和调试。
Dev Containers 扩展只适用于基于 Linux 的容器,因此尽管学生可能在他们的计算机上有不同的操作系统,编码环境将在所有学生之间保持一致。
我们已经看到有教师成功地在课堂上使用了 Dev Containers。你可以查阅使用 DevContainers 标准化学生开发环境:经验报告,了解更多关于三位研究人员在加州大学圣地亚哥分校课程中使用开发容器的经验。
本文将作为希望在课堂中实施开发容器以创建更顺畅、更一致的学生环境的教师的指南。
要亲眼看看开发容器的实际应用以及学生如何在短短 5 分钟内入门,请观看我们的入门学生视频。
教师指南
使用传统的设置方法,学生在设置环境时可能会遇到各种各样的问题。一些例子包括他们独特的操作系统差异、项目文件的存储位置,或者他们安装的运行时或工具的细微差异。教师需要精通所有这些细节,才能帮助学生解决这些问题。
一个常见问题是管理工具的不同版本。以 Python 为例:有 Python 2 和 Python 3,还有不同的次要版本。拥有多个版本的 Python,以及多个配套工具(如 linter),可能会令人困惑并导致错误。
为了节省大量时间和避免混淆,我们可以使用开发容器为整个班级创建一个标准化的 Python 开发环境。所有学生都将获得相同版本的 Python,避免安装新版本或卸载旧版本的需要,并且运行相同容器和源代码的每个人都将获得完全相同的结果。
前提条件
- 安装 Visual Studio Code。
- 安装 Docker Desktop。
- Docker 是构建和共享容器的行业标准。我们推荐 Docker Desktop Stable 2.3.0.3,它是 Docker Desktop 最新且性能最佳的版本。
- Windows 家庭版新增了 Docker Desktop 支持。它要求 Windows 10 版本 2004 并启用适用于 Linux 2 的 Windows 子系统 (WSL 2) 后端。请按照 WSL 2 安装指南启用 WSL 2。
- 对于不愿意配置 WSL 2 后端的学生,Windows 10 专业版、企业版或教育版(Build 16299 或更高版本)可以选择使用 Docker Desktop for Windows,并且必须启用 Hyper-V 和容器 Windows 功能。
让我们从启动 VS Code 开始,可以通过在命令提示符或终端中输入 code
来启动(或者直接在计算机上选择 VS Code)
VS Code 启动后,请确保已安装 Dev Containers 扩展
当我们安装任何 Remote 扩展时,状态栏左下角会添加一个绿色的 Remote 指示器
你可以点击它打开命令面板,并验证 Dev Containers 命令是否已列出
访问课程容器
让我们通过一个开发容器示例来帮助学生获得一致的编码环境。在我们的课堂上,我们可以创建一个单独的 GitHub 仓库来存储共享相同技术栈的练习。例如,所有 Python 作业都可以使用同一个容器并存储在同一个仓库中。
我们有一个示例 vscode-course-sample GitHub 仓库,其中包含一个 Python 开发容器和两个 Python 入门作业。让我们在 VS Code 中打开它。
你可以点击左下角的 Remote 指示器,或者使用命令面板,来调出 Dev Containers 命令。
让我们调用在容器卷中克隆仓库...
我们需要输入存储容器的 GitHub 仓库的 URL,在本例中是 microsoft/vscode-course-sample
你可以创建一个唯一的卷。卷是我们容器中存储文件的地方
现在我们已经选择了容器仓库,VS Code 会重新加载以构建镜像并启动容器
容器构建并运行后,我们的文件就会加载,我们就可以在 Python 环境中开始编码了!
在资源管理器中点击 sort.py
打开它,然后按 F5(或右上角的绿色运行图标)来运行它
我们的 Python 代码成功运行,而无需在本地计算机上设置 Python。
我们还可以使用 VS Code 的所有优点,例如设置断点来暂停程序并帮助我们调试。让我们在对单词列表进行排序时设置一个断点。
我们可以按 F5 运行程序。注意程序在碰到断点时会停止
为你的课程创建容器
现在我们已经看到了一个很棒的容器示例,让我们自己使用 Dev Containers 扩展设置第一个容器。让我们从一个“Hello World”Python 应用程序开始
我们将选择Dev Containers: 添加开发容器配置文件...开始设置开发容器所需的文件
容器配置文件是创建和定制开发容器所需的。容器定义列表是根据你的应用程序内容过滤的,在本例中是一个 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 扩展。
这是我们的 Python 项目中一个稍微复杂一点的 devcontainer.json
的示例。它使用 dockerfile
属性引用一个 Dockerfile,而不是直接引用镜像。它还会自动安装 Python 扩展,并在容器创建后建立一组容器特定的设置,例如代码检查。
devcontainer.json
是一个很好的机会来创建定制的编码环境,以满足学生的特定需求。你可以指定一些变量,为每个课程或作业创建独特的环境。
我们建议在教育领域的 devcontainer.json
中开始使用的变量有:
属性 | 类型 | 描述 |
---|---|---|
image |
字符串 | VS Code 应于创建开发容器的容器注册表(即 DockerHub)中镜像的名称。 |
dockerFile |
字符串 | 定义容器内容的 Dockerfile 的位置。路径相对于 devcontainer.json 文件。你可以在 vscode-dev-containers 仓库中找到许多不同运行时的 Dockerfile 示例。 |
name |
字符串 | 容器的显示名称。 |
extensions |
数组 | 扩展 ID 的数组,指定在创建容器时应在容器内部安装的扩展。默认为 [] 。 |
settings |
对象 | 将默认的 settings.json 值添加到容器/机器特定的设置文件中。 |
在此文件中设置少量变量从长远来看会节省课程时间。例如,你可以使用 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 仓库中提交 issue 或在 Twitter 上 @code 我们。
编程愉快!
Brigit Murtaugh,VS Code 项目经理 @BrigitMurtaugh