前言

自从学习了 Docker,我就无处发挥自己的才华了,突然想起之前学习 MIT6.S081 课程的时分环境树立完后就一向在吃灰,再加上我突然联想到之前树立的 code-server(点这儿),所以我突然有了个斗胆的想法,树立一个 Docker 的 MIT6.S081 试验环境,而且选用 code-server 的形式,达成一个开箱即用的作用,甚至能够挂到云服务器(阿里云学生机)上,完成随时随地运用 code-server 进行试验,有创意的时分随时掏出 IPAD 或许手机就能够试验搞起,真实是太香了,而且今后其他 CSLab 也能够选用相似的方案,那么下面咱们就开端吧。

没有了解过 Docker 的小伙伴我给出以下几个链接供咱们学习和参阅

  • Docker 从入门到实践文档(非常翔实)
  • 油管视频列表(科学上网)
  • Dockerfile 参阅文档
    • Dockerfie 官方文档:docs.docker.com/engine/refe…
    • Dockerfile 最佳实践文档:docs.docker.com/develop/dev…
    • Docker 官方镜像 Dockerfile:github.com/docker-libr…

如何按需正确食用本文

  • 仅仅想直接运用我树立好的环境的童鞋请直接移步到运用篇,运用 Docker 能够直接pull我的Regisry(环境比较大,国外服务器很慢,后边我会说其他处理方案),然后直接进行 MIT6.S081 的试验
  • 想学习 Docker 树立环境的童鞋能够慢慢看环境树立过程

作用演示

一个玩转国外CSLab的通用环境搭建方案(附我的搭建好的MIT6.S081环境)

环境树立过程

经过不断的测验,我觉得这种方案能够作为做国外 CSLab 的通用方案,只要写好相应的Dockerfile就能够了,code-server 和其他一些常见的比如镜像源的设置、运用的 linux 发行版等等是通用的,这些保留,然后剩下的部分就专心于在Dockerfile中树立相应国外 CSLab 的环境就能够了,基于此思路,咱们进行下面的树立过程。(下面一步步按照我的思路来走,之后你想树立自己的其他试验环境,就按照这样思路向下进行就能够了)

1 – 首要准备好各种树立环境的东西

  • 首要我是 Windows 体系,所以下载了Docker Desktop

  • 简略配一些国内的Docker Registry镜像源(点开设置中Docker Engine就行了)

一个玩转国外CSLab的通用环境搭建方案(附我的搭建好的MIT6.S081环境)

{
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://xzahxrmt.mirror.aliyuncs.com"
  ],
  "insecure-registries": [],
  "debug": false,
  "experimental": false,
  "features": {
    "buildkit": true
  }
}
  • windows原生的指令行终端太拉了,所以下载他们新出的Windows Terminal,姿态好看了不少,还能开多个Tab标签,还能定制化样式,的确好用(附上youtube上的美化教程)

    一个玩转国外CSLab的通用环境搭建方案(附我的搭建好的MIT6.S081环境)

2 – 然后进行 MIT6.S081 环境树立的调研和实践

  • 首要肯定是官网的环境树立阐明书是第一位要看的:pdos.csail.mit.edu/6.828/2020/…
  • 成果发现树立问题许多,我运用的是ubuntu20.04LTS,官方教程对应 ubuntu 的部分树立起来一大堆问题。
  • 然后我就开端互联网冲浪寻觅其他人分享的环境树立的教程,自己先简略开个Docker测验每个教程的环境树立是否有用,最终结合多家教程和自己的思考,拿到了正确的环境装备办法,并写了对应的Dockerfile,详细内容如下(没一步操作我都写好注释了,能够先看完上面的 Docker 从入门到实践中的Dockerfile部分然后再看这儿进行了解):
FROM ubuntu:20.04
ARG arch_name=amd64
# 前几步因为针对本试验依靠不全的原因问题百出,所以放弃了,仍是ubuntu20.04官方镜像源对于MIT6.S081所需依靠最全面
# 1.备份源列表
# RUN cp /etc/apt/sources.list /etc/apt/sources.backup.list
# 2.把本目录下的sources.list中的镜像源添加到Docker中,下载速度起飞
# COPY sources.list /etc/apt/sources.list
# 3.更新源
# RUN apt-get update
# 创立一个mit6s081的用户和其home目录
RUN useradd -m mit6s081 && \
    echo "root ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
    echo "mit6s081 ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
# 设置一些环境变量
ENV TZ=Asia/Shanghai \
    LANG=en_US.utf8 \
    LANGUAGE=en_US.UTF-8 \
    LC_ALL=en_US.UTF-8 \
    DEBIAN_FRONTEND=noninteractive
# MIT6.S081 Lab所用依靠
# 1.装置RISC-V穿插编译东西和一些其他的常用东西
RUN apt-get update && \
    apt-get install -y sudo locales git wget vim build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu libpixman-1-dev gcc-riscv64-unknown-elf libglib2.0-dev pkg-config
# 2.装置QEMU和装备QEMU
RUN wget https://download.qemu.org/qemu-5.1.0.tar.xz
RUN tar xf qemu-5.1.0.tar.xz
RUN cd qemu-5.1.0 && \
    ./configure --disable-kvm --disable-werror --prefix=/usr/local --target-list=riscv64-softmmu && \
    make && \
    make install
# 下载code-server并装置
RUN apt-get install -y aria2 && \
    aria2c https://github.com.cnpmjs.org/cdr/code-server/releases/download/v3.12.0/code-server_3.12.0_${arch_name}.deb && \
    dpkg -i code-server_3.12.0_${arch_name}.deb
# 切换用户mit6s081
USER mit6s081
# 下载一些code-server的插件
RUN mkdir /home/mit6s081/extensions
# 1.Markdown Extension
RUN code-server --install-extension yzhang.markdown-all-in-one
# 2.Cpp Extension
ADD cpptools-linux.vsix /home/mit6s081/extensions
RUN code-server --install-extension /home/mit6s081/extensions/cpptools-linux.vsix
# 3.Material Theme Extension
RUN code-server --install-extension equinusocio.vsc-material-theme
# 切换回Root用户,具有最高权限
USER root
RUN apt-get update
# 露出8848端口,用于code-server本地运转的端口
EXPOSE 8848
# 设置code-server暗码
ENV PASSWORD=mit6s081
USER mit6s081
CMD [ "code-server", "--bind-addr", "0.0.0.0:8848", "--auth", "password" ]
  • 写好Dockerfile之后,直接docker build -t <镜像名>:<版别号/标签> .就构建好镜像了,注意后边那个.可不能省掉,详细原因看这儿

之所以创立了两个用户也是为了咱们在运用环境的时分专心于运用当时环境,而不给咱们root用户修改环境的权限,所以假如你遇到了运用apt-get update等指令时给出denied的报错正是阐明晰这点。

当然假如你想自己添加一些功用,也能够本地运用指令docker exec -u root -it <Container名字> /bin/bash进入你创立的container中,然后你能够自定义这个Container的环境,然后commit到镜像上,假如功用不错进步试验幸福感的话,欢迎知乎私信或许 Github 上提 Issue。

3 – 一些环境树立中遇到的坑

  1. 被挑选时区的环节卡住
Please select the geographic area in which you live. Subsequent configuration
questions will narrow this down by presenting a list of cities, representing
the time zones in which they are located.
  1. Africa      4. Australia  7. Atlantic  10. Pacific  13. Etc
  2. America     5. Arctic     8. Europe    11. SystemV
  3. Antarctica  6. Asia       9. Indian    12. US
Geographic area:

能够经过装备环境变量,来跳过这个过程

ENV DEBIAN_FRONTEND=noninteractive
  1. RUN 的运用不当,导致环境树立过程中一向犯错

主要是开始不了解 Dockerfile,顺着指令阐明书就开端莽了,后来才发现RUN指令每次履行会在当时image之上的新的一层中履行后边的指令并提交成果,这样就导致前后有相关的指令履行总是报错(原因便是他们本就应该是一条流程下来的,现在拆分红不同层了当然会犯错),所以我才学会用 &&\(反斜杠)将单个 RUN 指令延续到下一行。

比如下面这几行例子:

RUN cd qemu-5.1.0 && \
    ./configure --disable-kvm --disable-werror --prefix=/usr/local --target-list=riscv64-softmmu && \
    make && \
    make install

假如不必&&\相关各行的话,比如第一行cd到那个qemu-5.1.0目录了,下一行**./configure履行的时分在新的一层了,就一定会报错不存在./configure**(因为这个configure装备qemu的可履行文件就在qemu-5.1.0目录下)

运用篇

1 – 办法一:DockerHub

首要 pull 下来我的 Docker 镜像

  • 因为 DockerHub 用的是国外的服务器,所以很慢很慢,可是就一行指令,比较容易
  • 镜像地址在这儿:hub.docker.com/repository/…
  • 最新版别的 pull 镜像的指令如下:
docker pull calvinhaynes412/mit6.s081:v1.3.1

然后去 Github 上 Fork 我上传的 MIT6.S081 原版纯净的试验环境

这样你就能自己 git 办理自己的试验代码了,其实我便是把官方的 git 库房自己上传了,主要是因为 MIT pdos 官方没有放出来这个 2020 试验的源代码不方便 Fork 之后直接自己运用,所以我转载了官方的 2020 试验源代码,是方便咱们直接 Fork 下来自己做试验,而且我加了一个 MIT 的开源答应协议。

  • 项目地址:github.com/CalvinHayne…
  • Fork 完之后 clone 到你本地的一个文件夹里边(要点,之后创立DockerContainer的时分需要运用)

想在这儿顺便介绍一下我自己学习此 Lab 收拾笔记和试验处理方案的一个库房,供咱们学习参阅,假如有协助的话希望给我点一个 STAR

  • GitHub 项目地址:github.com/CalvinHayne…

  • 码云版别:gitee.com/CalvinHayne…

在项目中涉及了每个试验(假如我能坚持做完的话,我信任我能够)的试验处理代码、试验笔记、课堂笔记、课堂小操练、一些学习操作体系优质的资料等等。

创立一个 Container

  • 点击RUN

一个玩转国外CSLab的通用环境搭建方案(附我的搭建好的MIT6.S081环境)

  • 装备Container

一个玩转国外CSLab的通用环境搭建方案(附我的搭建好的MIT6.S081环境)

这儿的Volumes装备你能够了解为将Host Path中的文件目录挂载在此Container中,挂载在Container的详细方位便是这儿装备的Container Path(这儿就直接装备成我图中写的途径,因为我已经在.gdbinit设置过了,假如你修改为其他方位的话,就修改/home/mit6s081/.gdbinit中的内容为add-auto-load-safe-path <你设置的Container Path>/.gdbinit

Volumes 简略了解便是主机目录挂载到容器上

2 – 办法二:阿里云镜像库房

  • 因为 DockerHub 服务器在国外,真实难以忍受它的速度,有一天偶尔发现,阿里云竟然有容器镜像服务,NICE!冲!!!
  • 这个速度几乎飞快,实测大约不到一分钟就 pull 下来了
  • 先在 Docker Engine 中参加阿里云的 Docker 镜像,前面的 Docker Engine 设置中的"https://xzahxrmt.mirror.aliyuncs.com"便是阿里云的镜像加速器
  • 运转指令:
docker pull registry.cn-beijing.aliyuncs.com/calvin_haynes/mit6.s081:release-v1.0.0
  • 之后创立一个 Container的办法和上述共同

3 – 开端做试验吧!

假如你也是装备的8848端口,那么直接点击 http://localhost:8848/**(暗码是==mit6s081==哦**),就能够进入在线的`Vscode`进行愉快(狗头保命)的`MIT6.S081`试验了!!

完好的指令行运用教程(服务器端和本地 Linux 体系用户看这儿)

  1. 装置 docker
  2. 装备阿里云镜像加速器(以下指令针对 ubuntu
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xzahxrmt.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
  1. pull 镜像(最新版别,之后版别更新的告诉我会在评论区阐明,记得偶尔来看看)
docker pull registry.cn-beijing.aliyuncs.com/calvin_haynes/mit6.s081:release-v1.3.1
  1. clone 试验源代码(我还会慢慢在这个项目中添加我学习过程中的笔记和试验代码等资料,假如对你有协助的话,希望帮我点个STAR)
git clone https://github.com/CalvinHaynes/MIT6.S081-2020-labs <放试验文件的任何你想要放的方位>
  1. 创立 Container(-u 0:0是为了保证Container中的root用户和本机的root用户权限共同,不过其实不建议用root权限,所以假如本机和Container的其他非root用户有相同的uid的话最好 -u uid:uid
docker run -p 8848:8848 --name=mit6.s081 -u 0:0 -v "<刚才clone的项目的方位>:<设置一个Container中的方位映射到前面的clone的项目的方位>" registry.cn-beijing.aliyuncs.com/calvin_haynes/mit6.s081:release-v1.3.1
  1. 本地用户浏览器拜访 http://localhost:8848/ 暗码: mit6s081.
  2. 服务器端用户浏览器拜访http://<服务器公网 ip>:8848/ 暗码: mit6s081.

结语

这虽然仅仅一个 MIT6.S081 的 Docker 环境树立教程,可是同时也是今后树立其他试验环境的思路,假如学会了这一套思路和手法,那么今后后树立任何环境都是唾手可得的!!

关于MIT6.S081的试验解析和课程笔记未来都会逐渐在我的项目中更新,欢迎咱们关注这个项目,关于此Docker,还有许多能够优化的当地,我会同步更新DockerfileDocker阿里云镜像/官方镜像,敬请期待。


感谢您看到最后,假如本文对您有所协助的话,还希望给我一个一键三连(狗头保命),假如对于我和我的文章感兴趣的话,欢迎点一个关注,您会收到我回答和文章的更新告诉,也欢迎参加我树立的技术沟通群 QQ:725133797 讨论沟通。

最后附上我的个人博客站:blog.calvinhaynes.top/,欢迎拜访和沟通