ubuntu搭建docker以运行miniob及通过vscode实现drop table
由于在数据库系统miniob实验过程中遇到了很多问题,秉持着分享的心态梳理一下整个实验过程,也许对其他人也有帮助?我本人使用的是windows主机,打算使用虚拟机运行miniob,当然也可以使用WSL,本文只讨论在vmware里通过docker运行miniob及如何修改源码的情况(我就是这样的)。
可参考ubuntu安装docker&docker下载miniob_虚拟机配置miniob-CSDN博客
一.环境资源配置
1.安装cmake
Ubuntu的默认仓库里可能有CMake,不过版本可能不是最新的。一种是通过apt安装稳定版,另一种是如果需要最新版本的话,从官网下载二进制包或者从源码编译。
用apt安装的话,只需要更新软件包列表,然后安装cmake。安装完成后,验证版本,用cmake --version。这样就能确认是否安装成功。
如果已通过apt安装了旧版 CMake,可以通过sudo apt remove cmake卸载旧版本。
更新软件包:sudo apt update
安装cmake:sudo apt install cmake
验证版本:cmake --version
实验要求的cmake版本在3.10以上:
2.安装gcc
Clang在某些情况下表现和gcc不一致,这里我使用的是gcc。
过程和安装cmake相似。
同样通过gcc --version验证版本,实验建议在8.3版本以上:
3.安装docker
网上有很多安装的方法,你也可以试问ds。
卸载低版本docker(如果有的话):
sudo apt-get remove docker docker-engine docker.io containerd runc
安装依赖工具:
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release
添加docker官方GPG密钥:
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
将Docker的稳定版仓库添加到APT源:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
安装docker引擎:
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
运行docker:
sudo systemctl start docker
验证安装:
sudo docker run hello-world
成功安装的话会出现Hello from Docker!
PS:如果出现类似含有daemon的报错导致安装失败,可以使用镜像加速:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.nju.edu.cn",
"https://hub.littlediary.cn",
"https://hub.xdark.top",
"https://dockerpull.org",
"https://hub.crdz.gq",
"https://docker.1panel.live",
"https://docker.unsee.tech"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
之前尝试了使用阿里云,腾讯云和华中科大的镜像,结果还是不行,但是上面的镜像亲测可用(因为有很多镜像,但之前我只尝试了这三个)。
4.构建miniob
进入docker后下载镜像,镜像全称为oceanbase/miniob,之后修改源码会用到:
sudo docker run -d --name miniob --privileged oceanbase/miniob
安装成功后进入容器:
5.克隆源码
git clone https://github.com/oceanbase/miniob.git
克隆失败可能是因为网速问题,多次尝试后应该能成功(我就是重复尝试了几次),也可能是因为项目过大。
6.编译build.sh
首先进入miniob,build.sh位于/root/miniob目录下:
cd miniob
bash build.sh init
bash build.sh
等待一段时间(对源码进行编译),直到100%表示成功:
从miniob目录进入build目录,并运行miniob
cd build
./bin/observer -f ../etc/observer.ini -P cli
注意大小写,我第一次因为P打成p苦恼了好久(确信),可以直接ctrl shif v粘贴到虚拟机里
二.检查SELECT语句的正确性
创建test表:
插入元组并select:
三.实现DROP TABLE
因为要自己修改源码来实现删除表的功能,所以在哪里修改和如何修改是一个问题,可以直接在容器内通过vim修改,但似乎这种方法不是长久性的,而且操作界面确实不太美观。
于是想到通过windows主机上的vscode对虚拟机里克隆的源码进行修改。当然ubuntu是可以直接安装vscode的。
1.复制源码到虚拟机
直接对miniob内的源码进行修改很不方便,可以将其源码复制到虚拟机的文件夹内,通过修改虚拟机复制来的c++文件来修改容器内的源码(需要挂载)。
我从官网克隆来的源码(环境配置第五步),路径为/root/miniob,但是这里的路径并不是虚拟机的路径,是保存在docker容器内的。Docker容器与宿主机的文件系统隔离。当在容器内看到/root/miniob目录时,它仅存在于容器内部,而宿主机的 /root/miniob
并不存在。
虚拟机内新建文件夹:
mkdir -p ~/miniob-host
从容器复制代码到宿主机:
docker cp miniob:/root/miniob/ ~/miniob-host/
//即~/miniob-host目录下复制了容器内的root/miniob目录
打开miniob-host后只有一个复制来的miniob目录,需要将miniob下的所有子目录(如图)移动到miniob-host目录下,也就是减少一层路径。否则挂载后进入容器需要进行两次cd miniob,之后详解。退出容器后可以通过如下命令安全地将子文件提升到父目录层级,同时删除冗余的中间目录:
cd /home/USERNAME //你的用户名
mv miniob-host/* ./
mv miniob-host/.* ./
/root/miniob是克隆到容器内的文件夹,源码都保存在这个目录下,miniob-host是你在虚拟机内新建的文件夹,用于存放从/root/miniob复制来的源码
PS:如果miniob-host文件夹右上角有锁的标志,是只读模式,没有修改的权利(默认属于root用户),于是vscode无法保存。
修改权限:# 宿主机执行
sudo chown -R USERNAME:USERNAME /home/USERNAME/miniob-host
若还是没有修改权限,试试将USERNAME:USERNAME更改为uid:gid
2.挂载
挂载可以通过修改复制到/miniob-host里的源码来同步更新容器内即/root/miniob里的源码,挂载后,容器内即/root/miniob的文件都会被/miniob-host的文件覆盖,同时保持同步更新。由此可以很好理解上一步为什么要减少miniob-host目录下miniob这一层路径,如果不减少该层路径并进行挂载,cd miniob后其实相当于是进入miniob-host,需要再cd miniob即未减少的那一层路径。
停止容器(如果已start):sudo docker stop miniob
删除旧容器,不影响镜像:sudo docker rm miniob
挂载:
sudo docker run -it --name miniob -v ~/miniob-host:/root/miniob oceanbase/miniob:latest
挂载完后ctrl P Q退出。可以看到,挂载是将虚拟机miniob-host下的文件全部(-v的含义)覆盖容器内的/root/miniob目录。
挂载成功执行下列语句应有输出:
docker inspect miniob | grep Mounts -A 10
输出类似"Mounts": [
{
"Source": "/home/USERNAME/miniob-host",
"Destination": "/miniob",
...
}
]
oceanbase/miniob是你下载的镜像名称,可以通过sudo docker images查看镜像名称。
3.vscode ssh
如果你是在虚拟机里安装的vscode,可以不用ssh(secure shell)远程连接。
如果你是在windows主机安装的vscode,那ssh是用于连接你的主机和虚拟机的,连接后vscode就可以修改虚拟机里的代码如/miniob-host下的源码,同时因为已经挂载过了,虚拟机内源码的修改也会直接同步到容器内,以后每次在vscode修改完并保存后都可以通过容器内cd miniob 然后bash build.sh进行编译。
vscode搜索ssh插件,安装完点击左下角蓝色图标即可进入:
连接到主机:
输入你的虚拟机用户名和虚拟机地址 USERNAME@ip的格式:
查询虚拟机ip:
ip a
一般位于类似ens33 inet后,如此处虚拟机地址192.168.244.128
可以看到连接成功了:
打开文件即可打开虚拟机内的文件并进行修改,如打开dp.cpp增加drop_table:
drop table功能可以参照create table,我主要对db.cpp,stmt.cpp,command_executor.cpp,table.cpp进行了修改,并且新建了drop_table_executor.cpp及drop_table_stmt.cpp。注意相应的头文件也需要修改或创建。