NEMU_PA0 - 世界诞生的前夜: 开发环境配置 + 基于WSL使用Docker打包linux环境

请注意你的学术诚信!
本博客只提供个人思路的参考和一些想法, 并非能够抄袭的答案
1.本人水平有限,实现的PA可能有可怕的bug
2.本人思路可能有误,需要各位自行判别
写在前面:我为何要用Docker?
一般我在寝室我会用我的笔记本,但是到工作室的时候我会倾向于我的台式机。这就有个问题,我在我笔记本电脑上对linux的配置,等下我到我的台式机上又要重新配置一遍...
于是我选择了Docker
如何使用Docker?
我的目标主要是想要知道如何从我笔记本电脑上得到一个可以转移到其他主机上立刻使用,且配置完成与我笔记本电脑一致的linux?
相关教程
-
这两个博客解决了我的疑问
实现
在WSL下使用Docker建立Linux并运行
首先我们写一个Dockerfile文件用来等下用来建立镜像用的

然后使用命令
docker build -t mirrorName .
. 表示根据当前文件夹下的Dockerfile进行建立镜像
然后使用
docker run --name containerName -it mirrorName bash
表示根据镜像mirrorName 创建名为containerName的容器,并打开个终端,启用bash
在 docker run -it my-awesome-linux bash 命令中,-it 是两个选项的组合,其作用如下:
-i:这个选项告诉 Docker 在容器中保持标准输入 (stdin) 打开,即使没有附加一个终端 (TTY)。-t:这个选项分配一个伪终端 (TTY) 并绑定到容器的标准输入 (stdin)。这样做使得你可以与容器中的 shell 进行交互,就好像你在本地系统上操作一样。
综合起来,-it 选项的作用是在 Docker 容器中创建一个交互式会话,允许用户与容器内的 shell 或其他命令进行交互。
然后我们可以使用
exit
退出容器的bash,这个时候这个容器会相应的停止
docker start containerName
docker exec -it containerName bash
然后我们又可以进入容器的bash进行操作了
在vscode中操作Dokcer linux
[参考博客](VsCode轻松使用docker容器-Remote Containers)

问题是Remote - Container这个插件查找不到,但是好像变成了如下插件:

然后我们在Docker客户端/命令行中启动我们的容器,然后应该能够看到




然后就ok了~
在vscode中如何操作wsl

然后操作同理上述了
问题
但是当我将Docker下linux容器关闭后,我在其中用apt install安装的软件还是mkdir等创建的文件等都会消失
- 解决方法一:
全部用Dockerfile记录 - 解决方法二:
使用docker commit
但是在这篇博客中写到危害利用 commit 理解镜像构成

所以我还是用Dockerfile全部记录下吧...
但是只使用Dockerfile还是有问题:
比如我要配置一些文件,如配置vim,我要将一大堆文字写进配置文件中,这个时候我将这些操作写进Dockerfile感觉非常麻烦
解决:让Docker Linux容器挂载目录到WSL下的文件夹
这只能解决mkdir等创建的文件等都会消失的问题,但是不能解决配置文件的问题
挂载目录可以使得Docker的Linux容器产生的文件保存在WSL下,而随着容器消失而消失
即WSL某一个文件夹可以映射到Docker的Linux容器的某一个文件夹,当WSL文件夹中的内容改变,Docker的Linux容器的某一个文件夹也会改变,反过来同理
参考博客:wsl docker 挂目录
假设我想要让我WSL下的/home/cilinmengye/nemu挂载到Docker的Linux容器的/app下
docker run -v /home/cilinmengye/nemu:/app --name nemu -it ubuntu22.04 bash
-
-v /home/cilinmengye/nemu:/app,让我WSL下的/home/cilinmengye/nemu挂载到Docker的Linux容器的/app下 -
--name nemu指定我的Linux容器名字为nemu -
-it ubuntu22.04 bash, 运行镜像ubuntu22.04, 并且打开终端 以bash的方式
然后进入Docker的Linux容器可以发现/app文件,其中有WSL中/home/cilinmengye/nemu的内容

结局
我还是不打算用WSL+Docker的方式运行实验要的Linux环境了,因为我发现这完全让我的操作变得更复杂了
而且Docker Linux容器和WSL 的终端没有虚拟机上用的舒服
而且我的容量也不够我用了

Docker 和 WSL是真的占内存...
我还是记录下我们配置操作,然后每次在我的虚拟机上更新下吧
非更改源代码,配置命令记录
/*
* PA0: Installing Tools
*/
# 加入新源
bash -c 'echo "deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse" >> /etc/apt/sources.list'
sudo -i
# 更新源
apt-get update
# 下载工具
apt-get install build-essential # build-essential packages, include binary utilities, gcc, make, and so on
apt-get install man # on-line reference manual
apt-get install gcc-doc # on-line reference manual for gcc
apt-get install gdb # GNU debugger
apt-get install git # revision control system
apt-get install libreadline-dev # a library used later
apt-get install libsdl2-dev # a library used later
apt-get install llvm llvm-dev # llvm project, which contains libraries used later
/*
* PA0: Getting Source Code for PAs
*/
git clone -b 2023 git@github.com:NJU-ProjectN/ics-pa.git ics2023
# 将当前branch改名为master
git branch -m master
bash init.sh nemu
bash init.sh abstract-machine
# 重启下环境配置文件
source ~/.bashrc
git checkout -b pa0
vim Makefile # 然后改下其中的学号,姓名
cd nemu/
# 要先安装这两个软件
sudo apt install bison
sudo apt install flex
make menuconfig
make
make run
# 好,接下来上传到我的github上
git remote add ssh_nemu git@github.com:cilinmengye/NEMU.git
#当前我在pa0分支下
git push ssh_nemu
git push ssh_nemu master


结果与讲义一致
git学习
没想到这次讲义中又给了新的git可视化网站让我们来学:Visualizing Git Concepts with D3
通过可视化来让我们了解git是如何工作的
我们可以常常看到HEAD这个单词

其实HEAD表示了这个图中所在'路径'中最新的一个节点
'路径'表示了修改
即每一次git commit都是在可视化中都是创建节点,每一个节点代表一次修改记录
我们git checkout可以跳转节点
git branch可以在节点上打上标签(tag),而这个标签就是我们平时说的分支(branch)
git reset可以让HEAD转移到前面的节点,后面的节点失效
git merge可以创建出新节点,这个新节点连接了两条不同的'路径',即让修改进行合并
...

浙公网安备 33010602011771号