本篇文章在以下环境中进行:Windows11 + Docker Desktop(Docker版本26.0.0,使用了WSL2)+ x86_64。
由于是x86_64架构的CPU,所以我下面下载的所有东西都是和x64_64相关的,这是从容器的运行效率上面的考量。
部署的是单机的OpenGuass。
OpenGauss镜像准备
因为一些众所周知的原因,使用Docker下载OpenGauss的镜像是有点困难的,这可能需要你自己配置一下镜像源。
如果实在无法从Docker中拉取下来镜像或者说害怕从Docker仓库中拉下来的镜像并不纯净,那么我们就需要自己构建一个OpenGauss的镜像。
构建OpenGauss的镜像,按照OpenGauss自己的文档说,需要准备两个东西:OpenGauss的软件包、CentOS7.6或者OpenEuler。
这里我选择使用OpenGauss3.0.0+OpenEuler20.03来构建
(1)下载OpenEuler20.03的镜像压缩包:
可以到repo.huaweicloud.com/openeuler/openEuler-20.03-LTS/docker_img/x86_64/中下载OpenEuler20.03,
你可以下载下面的sha256sum来对下载的镜像包进行完整性校验,这里我并不是搭建企业级的生产环境,因此没那么多讲究,有这个需求可以做一下。
注意,不要自行将其更改成OpenEuler22.03的镜像,一定得是OpenEuler20.03后面我会说明这样做的原因。
OpenEuler22.03并非不能够使用,由于它比OpenEuler20.03少了一些东西,需要自行安装,因此需要修改dockerfile,这里为了简单起见用空间换时间了。
(2)构建OpenEuler20.03的Docker镜像:
$ docker load -i openEuler-docker.x86_64.tar.xz
Loaded image: openeuler-20.03-lts:latest
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
opengauss 5.0.0 7e70473f33a4 14 hours ago 929MB
registry.fit2cloud.com/halo/halo 2.20 9c82e02262b9 5 days ago 427MB
postgres latest 810c36706d00 4 weeks ago 435MB
mysql 8.4.0 f3df03e3cfc9 7 months ago 585MB
redis 7.2.4 9509c4dd19fb 8 months ago 116MB
openjdk 17 5f94f53bbced 3 years ago 471MB
ubuntu 22.04 9d28ccdc1fc7 3 years ago 76.3MB
openeuler-20.03-lts latest eeb84ae20ad2 4 years ago 469MB
可以看见openeuler-20.03-lts:lates镜像确实构建完成了。
(3)下载OpenGauss3.0.0软件包:
openGauss下载档案 | 下载 | openGauss社区在这个连接下能够下载:
这里有三个版本,我这里选择极简版。这里经过我的实验,发现OpenGauss企业版和OpenGauss极简版的区别是:OpenGauss企业版的软件包解压之后会包含极简版的软件包,并且多出来一个CM软件包和OM软件包。我这里也只是猜测,感兴趣的可以使用SHA256去校验一下。
这里我用不上CM和OM,因此只下载极简版的软件包。
(4)克隆OpenGauss在Gitee上的项目:
我们需要使用该项目中有关docker的一些东西,因此拉取该项目,并且是拉取5.0.0分支。实际上拉取哪个分支影响不大,都可以自己做出修改来使用,因为OpenGauss提供的构建镜像的脚本灵活度实际上非常低,不能够达到给定操作系统镜像和OpenGauss软件包直接生成OpenGauss镜像的程度,要精细化构建还得是自己会Docker镜像的构建方式,然后对它所提供的Dockerfile进行修改,这无疑是加大了构建OpenGauss镜像的难度。
吐槽:我认为这是不利于OpenGauss的广泛使用的,但如果OpenGauss主要客户群体是企业端(国家有要求),正式的工作人员应该都在忙业务,没有时间来关注这些构建不方便或者个人构建OpenGauss镜像出现的各种问题,但对于我这个学校要求要使用OpenGauss的学生来说,你这个东西可太折磨人了,你既要推广这个软件却把入门的门槛搞那么高。
总之,使用如下命令拉取OpenGauss 5.0.0的分支:
git clone -b 5.0.0 https://gitee.com/opengauss/openGauss-server.git
项目有点大,你可能需要等待一段时间。
(4)进入OpenGauss项目的docker/dockerfiles/5.0.0目录下,将下载好的OpenGauss3.0.0的软件包拷贝到该目录下:
(5)使用代码编辑器修改,dockerfile_arm中的内容:
将这三个地方的openGauss-5.0.0-openEuler-64bit.tar.bz2修改成刚才复制到5.0.0目录下的OpenGauss3.0.0的软件包的文件名openGauss-3.0.0-openEuler-64bit.tar.bz2。
(6)改变docker/dockerfile/5.0.0/entrypoint.sh的换行格式:
Windows下的换行格式CRLF在Linux下运行会出现问题,因此你需要将其的格式做出改变,这里我提供以下两种改变其换行格式的方案:
使用VSCode,直接在右下角改变其编码格式:
第二种方法是使用GitBash中的Vim编辑器:
- vim entrypoint.sh打开文件。
- 运行命令:set ff=unix改变换行格式。
(7)构建OpenGauss3.0.0镜像:
在docker/dockerfiles/5.0.0目录下运行构建命令:
docker build -f dockerfile_arm -t opengauss:3.0.0 .
吐槽:虽然官方说可以使用docker/dockerfiles/buildDockerImage.sh脚本来构建镜像,但是那是在你使用它的dockerfile中指定的软件包,并且基础镜像也要相同的情况下才能构建成功。并且这个脚本还有很弱鸡的一点,它会自动按照你的CPU架构来为你选择Dockerfile,这也就意味着,如果你是x86_64架构的CPU,那么它就会“智能”、“方便”地为你决定dockerfile而忽略你所给定的openGauss软件包。
既不能给我们选择基础镜像的权力,有不给我们指定OpenGauss软件包的权力,达到了自我感觉的“方便”。
(8)运行OpenGauss:
docker run -d --name opengauss-1 --privileged -e "GS_PASSWORD=Aa1@#456&*" -e "GS_USERNAME=aderversa" -p 5432:5432 opengauss:3.0.0
不出意外的话,我们等下就可以使用opengauss数据库了。GS_PASSWORD是必须要指定的,这一点和PostgreSQL容器是一样的,但是OpenGauss有更加严格的密码格式要求。
如果你使用的是OpenGauss5.0.0以上版本的软件包,那么本步骤很大概率会启动失败。
这里使用以下命令进入容器中查看OpenGauss的运行状况:
$ docker exec -it opengauss-1
# 已进入到容器中,root
$ su omm
# 以omm的身份来运行接下来的命令
$ gsql
# 进入到gsql工具中,\l查看所有数据库
$ \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+-------+----------+------------+------------+-------------------
omm | omm | UTF8 | en_US.utf8 | en_US.utf8 |
postgres | omm | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | omm | UTF8 | en_US.utf8 | en_US.utf8 | =c/omm +
| | | | | omm=CTc/omm
template1 | omm | UTF8 | en_US.utf8 | en_US.utf8 | =c/omm +
| | | | | omm=CTc/omm
(4 rows)
$ create database gaussdb;
(9)连接OpenGauss数据库
这里我们可以在宿主机中连接该数据库了,这里使用Beekeeper-Studio工具来连接数据库,读者可自行选择DataGrip,Navicat等工具来完成该任务。
OpenGauss是基于“世界上最先进的开源数据库-PostgreSQL”来开发的,因此这里连接的类型就选择Postgres。
如果启动成功的话,那么连接到数据库是必然的。注意:默认的omm和root是不支持远程连接的,需要在创建容器时指定GS_USERNAME,才能够用GS_USERNAME指定的用户来远程连接数据库,这里应该是防止远程连接的用户做出未授权行为。
选择OpenGauss3.0.0+OpenEuler20.03的原因
这里我一开始选择了OpenGauss6.0.0 + OpenEuler22.03来构建OpenGauss的镜像,但在经过实验之后,我最终选择了OpenGauss3.0.0 + OpenEuler20.03来构建OpenGauss镜像。接下来我就来描述一下我在构建过程中遇到的问题:
(1)OpenEuler22.03的镜像缺少find命令。
repo.huaweicloud.com/openeuler/openEuler-22.03-LTS/docker_img/x86_64/在这个链接下有OpenEuler22.03的Docker镜像。
如果链接失效,那么你可以去OpenEuler官网去查找该镜像
如果使用该镜像作为操作系统来构建OpenGauss的镜像,那么在运行OpenGauss容器的时候,Docker为你运行entrypoint.sh的时候会报错,
猜测这是由于OpenEuler22.03镜像发布时,阉割掉了一些东西导致出现这样的问题,你对比OpenEuler20.03和OpenEuler22.03的空间大小就可以很明显地发现问题,前者的包大小为100多M,而后者为40多M。
事后诸葛亮:这可以通过在dockerfile_arm中添加命令yum install -y findutils来解决。不过我当时被整红温了所以没想到。
但具体添加完该命令之后,按照上面的步骤构建OpenGauss镜像会出现什么问题我还没有进行实验。
补充之后,能够使用:
- 操作系统:openeuler20.03或者openeuler22.03,后者需要在构建opengauss镜像时安装finduitls。但是选择22.03就要做好里面没有某些可执行程序的准备。
- OpenGauss版本:3.0.0,3.0.5,按照这个逻辑推测5.0.0版本以下的大概率都能使用。
(2)OpenGauss5.0.0及其以上的版本由于未知原因导致无法正常启动。
OpenGauss5.0.0及其以上的版本构建的镜像,无法启动,并且查看了日志之后提示的错误信息也看不出来出现了什么问题(反正我是看不出来)。可能OpenGauss的开发人员可以看得出来是什么意思。但作为一个产品,我觉得你得给我提示一下。还有就是,不影响启动的东西能不能不要显示出来,一大堆的日志我都不知道哪个才是重点,这一点不管是3.0.0还是5.0.0还是6.0.0都是一样的,提示一大顿,但是有用的没几个,必须要到容器里面自行运行entrypoint.sh,并查看错误日志才能找到有用信息。
我在OpenGauss的Issue上找到了个和我一样情况的问题,但他的问题是编译之后无法启动。开发者给出的答案是:可能是你的环境不支持mot,在编译openGauss-server时到build\script\utils\make_compile.sh下去掉--enable-mot。
我这里是不想要编译直接运行的方案,那不就等于宣判死刑了吗?我不想编译啊,也不想该你原本软件包的什么参数之类的,太麻烦了不搞,不如用3.0.0。