使用 Docker 在 M1 Mac 上搭建 Oceanbase 开发环境

引言

因为 Oceanbase 代码规模较大,并且需要 Linux 环境,所以通常需要在大规格开发机上进行远程开发,对普通个人开发者有一定门槛。本文分享一种利用 Docker 在 M1 芯片 MacBook Pro 笔记本电脑上搭建 observer 本地开发环境的方法,原则上该方法也适用于其他 Mac 电脑和 Windows 电脑,仅需支持 Docker 即可,欢迎各位开发者尝试并反馈意见。

Step by Step 搭建开发环境

首先我们先一步一步来搭建开发环境,之后根据操作步骤编写 Dockerfile 并构建镜像,再使用 vscode 连接容器进行开发。

克隆代码

首先建立文件夹并从 GitHub 拉取代码,存储位置可以按需选择

mkdir -p ~/ob_ce_dev
cd ~/ob_ce_dev
git clone https://github.com/oceanbase/oceanbase.git

安装 Docker

在 Docker 官网下载并安装 Docker Desktop: https://www.docker.com/products/docker-desktop/
我所使用的 Docker Desktop 版本是 4.16.2

调整 Docker 资源限制

因为编译和运行 observer 都比较吃资源,需要在 Docker Desktop 设置中将资源限制提升到至少 4 CPU、8G 内存。在我的实际使用中,CPU 并不是瓶颈,内存才是,因此在条件允许的情况下尽量增大内存。

拉取操作系统镜像

在这里选用经典的 CentOS 7 作为基础镜像,启动 Docker Desktop 后,在命令行输入 docker pull centos:centos7 拉取镜像。

启动容器

使用命令 docker run -id -v ~/ob_ce_dev/oceanbase:/oceanbase -p 2222:22 --name ob_dev centos:centos7 启动我们的开发容器,-v选项将克隆的 observer 代码挂载到容器的/oceanbase目录,-p将容器的22端口映射到本机的2222端口,方便使用 vscode 连接。

安装依赖

安装 observer 的编译依赖和 openssh

# 进入容器
docker exec -it ob_dev /bin/bash
# 编译依赖
yum install -y git wget rpm* cpio make glibc-devel glibc-headers binutils m4
# obd.sh 依赖
yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo
yum install -y libtool libaio obclient
# openssh
yum install -y openssh-*
ssh-keygen -A
# run sshd
/sbin/sshd
# 设置 root 密码
echo "my_password" | passwd root --stdin

使用 vscode 连接开发容器

在 vscode 中 安装 Remote - SSH 插件后,点击左下角><图标,选择 Connect to Host..., Add New SSH Host..., 输入ssh root@localhost:2222,按回车保存。之后再点击左下角><图标,选择 Connect to Host...,此时选择刚才添加的 localhost 选项,输入 root 密码(本文中使用的是 my_password,可以根据实际情况更改),vscode 会自动打开新的窗口,在新的窗口就可以在容器内进行开发。
vscode连接容器
左下角为该图标即表示已经成功连接到容器。按 cmd + o并输入/oceanbase在 vscode 中打开代码目录,可以看到如下内容:


这样就可以使用 vscode 进行开发。可以根据自己的开发习惯配置 vscode 进行开发,由于每个人习惯不同,本文不再赘述。

编译 observer

在已经连接到开发容器的 vscode 中打开终端,输入./build.sh debug --init以 debug 模式初始化编译目录,之后cd build_debug进入编译目录。
一般 Docker 分配到的内存有限,直接运行 make -j 会因为内存不足被 Kill,因此编译时建议多尝试几次并发数,直到编译可以正常进行。本人在编译时记录到的内存使用峰值为约 5.5G,因此编译并发数建议设置为内存/5或内存/6,例如 Docker 分配到 16G 内存时可以考虑 make -j 3make -j 2,如果没有问题再尝试增大并发数,需要多尝试几次确定。如果只分配 8G 内存,只能使用 make 串行编译,在 M1 Pro 芯片上一边看剧一边编译大致需要 50 分钟(别问我是怎么知道的)。

本地部署 observer 进行测试

编译成功之后cd /oceanbase/tools/deploy进入部署工具目录,首先使用./obd.sh prepare拷贝编译好的二进制文件并生成默认配置。再使用./obd.sh deploy -c single.yaml进行单机部署。部署成功后使用./obd.sh sys连接到数据库进行操作。这部分内容还可以参考 Deploy_CN · oceanbase/oceanbase Wiki · GitHub

整合成 Dockerfile

如果上述过程都没有问题,为了避免每次 Docker 重启后环境丢失,我们可以打包好 Docker 镜像以供后续使用。如果只想保存当前容器,可以使用docker commit ob_dev打包当前容器镜像。也可以编写 Dockerfile 供二次使用。这里提供一个简单的 Dockerfile 版本。该版本仅供本地开发测试使用,建议使用环境变量ROOT_PASS配置复杂密码(默认为my_password)。推荐修改 Dockerfile 配置无密码登陆更加方便,方法可以参考其他资料,在此不再赘述。

FROM centos:centos7
RUN yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo
RUN yum install -y git wget rpm* cpio make glibc-devel glibc-headers binutils m4 libtool libaio obclient openssh-*
RUN ssh-keygen -A
RUN echo "${ROOT_PASS:-my_password}" | passwd root --stdin

# for sshd
EXPOSE 22
# for observer
EXPOSE 10000 10001

CMD ["/sbin/sshd", "-D"]

保存为 Dockerfile 后使用 docker build . -t ob_dev 构建名为 ob_dev 的镜像。

启动容器

如果有之前的容器需要先使用docker stop ob_dev停止。之后使用docker run -d -v ~/ob_ce_dev/oceanbase:/oceanbase -p 2222:22 -p 10000:10000 --name ob_dev ob_dev启动开发容器。之后再使用 vscode 连接。如果连接失败可能是因为更换容器导致 host 指纹更改,使用rm ~/.ssh/known_hosts重置已知指纹后重试即可。

之后每次重启 Docker 服务或宿主机,只需要重新运行容器即可。

总结

本文提供了一种利用 Docker 在 M1 芯片 Mac 上搭建 Oceanbase 开发环境的方法,理论上该方法也适用于其他支持 Docker 的系统,包含 macOS 和 Windows,如果出现问题可以回贴交流。该方法需要为 Docker 至少分配 4 CPU 和 8G 内存,分配的内存越多在编译时可以容许更大的并发度。

现在搭建好开发环境后就可以修改 observer 源码进行开发了,得益于 unity 编译和增量编译,再次编译的速度会大幅提升。

Happy Hacking!

1 个赞

悄悄告诉你,我在研发环境都用4G的observer来跑,也就是说你给个6G甚至5G的docker都能玩。

记得改小system_memory,否则租户可能建不出来。