作为一名DevOps人员,我日常会和多种数据库、各个数据库的各种版本打交道。为了应对繁杂的数据库版本和复杂的部署环境,Docker成为我日常工作中不可缺少的一份工具,它在环境管理、版本管理、快速部署等各方面具备独一无二的优势。
YashanDB个人版发布后我也很好奇地尝试了一下,但很遗憾的是官方本次并没有放出官方Docker,所以我制作了一个简单的YashanDB个人版Docker版本,在这里记录与分享。
一、基础镜像的选择
根据官网的指导,服务器的最小配置是Centos 7.6,CPU支持x86和ARM两种,本次我选择的机器是X86的机器,基础镜像选择centos:7.9.2009
二、安装包分析
准备好基础编译,先把拿到的YashanDB个人版的包上传到服务器上,解压看看里面的结构
[root@localhost install]# ls -l
total 171312
drwxrwxr-x. 6 yashan yashan 70 Nov 9 18:16 admin
drwxrwxr-x. 2 yashan yashan 188 Nov 9 18:16 bin
drwxrwxr-x. 2 yashan yashan 152 Nov 9 18:16 conf
drwxrwxr-x. 5 yashan yashan 60 Nov 9 18:16 ext
-rw-rw-r--. 1 yashan yashan 11632 Nov 9 18:16 gitmoduleversion.dat
drwxrwxr-x. 2 yashan yashan 65 Nov 9 18:16 include
drwxrwxr-x. 3 yashan yashan 17 Nov 9 18:16 java
drwxrwxr-x. 2 yashan yashan 4096 Nov 9 18:16 lib
-rw-r-----. 1 yashan yashan 14989 Nov 9 18:16 LICENSE
drwxrwxr-x. 3 yashan yashan 21 Nov 9 18:16 plug-in
drwxrwxr-x. 2 yashan yashan 170 Nov 9 18:16 scripts
-rw-r--r--. 1 root root 175386922 Nov 29 14:14 yashandb-personal-23.1.1.100-linux-x86\_64.tar.gz
可以看见这个包里有些对于制作镜像比较重要的东西,比如bin下面是一些工具,还有个scripts文件夹,里面藏了一些看起来像是安装脚本的东西。
[root@localhost scripts]# pwd
/root/docker-build/yashan/install/scripts
[root@localhost scripts]# ls -l
total 32
-rwxrwxr-x. 1 yashan yashan 3296 Nov 9 18:16 createResourceCgroup.sh
-rwxrwxr-x. 1 yashan yashan 2934 Nov 9 18:16 initDB.sh
-rwxrwxr-x. 1 yashan yashan 2104 Nov 9 18:16 initStandby.sh
-rw-rw-r--. 1 yashan yashan 411 Nov 9 18:16 install.ini
-rwxrwxr-x. 1 yashan yashan 1412 Nov 9 18:16 install.sh
-rwxrwxr-x. 1 yashan yashan 1157 Nov 9 18:16 startup.sh
-rwxrwxr-x. 1 yashan yashan 1157 Nov 9 18:16 stop.sh
-rwxrwxr-x. 1 yashan yashan 667 Nov 9 18:16 yascheckStart.sh
三、yasboot安装方法制作镜像(失败)
大概看了下包里的东西,接着就该准备着手制作镜像了,先打开官网看下安装部署的文档。
先跟着官方提供的23.1版本的安装手册,简单写一个Dockerfile试试看
[8/8] RUN cd install && ./bin/yasboot package se gen --cluster yashandb -u yashan -p 123456 --ip 127.0.0.1 --port 22 --install-path /home/yashan/yasdb_home --data-path /home/yashan/yasdb_data --begin-port 1688 && ./bin/yasboot package install -t hosts.toml -i yashandb-personal-23.1.1.100-linux-x86_64.tar.gz && ./bin/yasboot cluster deploy -t yashandb.toml:
0.286 127.0.0.1
0.286 ip:127.0.0.1 scan failed, 主机扫描失败:dial tcp 127.0.0.1:22: connect: connection refused
0.286 hostid | group | node_type | node_name | listen_addr | replication_addr | data_path
0.286 --------------------------------------------------------------------------------------------------------
0.286 host0001 | dbg1 | db | 1-1 | 127.0.0.1:1688 | 127.0.0.1:1689 | /home/yashan/yasdb_data
0.286 ----------+-------+-----------+-----------+----------------+------------------+-------------------------
0.287
0.287 Generate config success
0.303 127.0.0.1
0.303 ip:127.0.0.1 scan failed, 主机扫描失败:dial tcp 127.0.0.1:22: connect: connection refused
0.303 config check failed
果不其然报错了,仔细研究下这个报错。
YashanDB使用yasboot进行安装时,需要使用到主机的ssh能力,访问指定ip的22端口,并使用给出的服务器用户名、密码进行登录。
但是Centos的镜像本身是不带ssh能力的,如果需要在镜像中使用ssh,需要额外进行ssh服务的配置,并在容器运行时开发端口才行。
并且此处官方文档也提到,需要将yasboot命令的--ip
参数后面的值更换成安装服务端主机所在IP地址,但是docker中的ip地址是自动分配的,未来docker的时候也需要它能够自动适应各种ip地址,不能将ip固定死。
这可糟了,难道没有办法进行镜像制作了吗?
还记得上一节看到的那个疑似包含着各种安装脚本的scripts文件夹吗?23.1版本的安装文档并没有一处书写到这些脚本是在什么时候使用的,在镜像制作的时候,可以直接借用脚本吗?
四、藏在历史版本里的脚本安装方式
打开官网,在文档中找一下这个文件夹有没有在哪里使用过,很有意思的是会发现官方在22.2版本曾经提供过一个名为脚本安装的安装部署方法,不过在23.1版本内没有提到,不过死马当活马医,只要安装包里还有那些脚本,咱就先跑起来试试看!
五、Dockerfile编写
主要的流程是根据22.2的脚本安装步骤
关于instanll.ini里的参数,我制作镜像时并没有进行调整,均采用默认配置。
FROM centos:7.9.2009
#基础镜像 centos:7.9.2009
MAINTAINER "JulieGarfield"
RUN useradd -m -s /bin/bash yashan
RUN echo 'yashan:123456' | chpasswd
#创建Yashan用户
USER yashan
WORKDIR /home/yashan
#设置yashan用户为登入容器的默认用户,且后续动作使用yashan用户进行操作
#不过这里亲测直接用root用户也可以正常安装和使用数据库,操作用户的这四行实质上不是必须的
RUN mkdir install
ADD yashandb-personal-23.1.1.100-linux-x86\_64.tar.gz install
#上传安装包
RUN cd install/scripts && ./install.sh && ./initDB.sh
#根据官方文档进行数据库的安装和初始化工作。 #此处install.ini的参数均保持默认,如果要调整参数,需要在这一步之前调整好,可以提前编写好一份install.ini载入进来或者在Dockerfile里编写替换命令
RUN source ~/.bashrc && cd yashandb/yasdb\_data/instance && mv yasdb.pwd yasdb.pwd.bak && echo "yasdb\_123" | yaspwd file=yasdb.pwd
#修改密码,因为需要使用yaspwd这个工具,所以需要载入环境变量,如果需要自定义密码,记得在这里编辑修改
到这里镜像已经基本完成了,根据官网的引导,此时应该能连接上数据库,所以先完成镜像的制作,拉起容器试试看。
但是实际上,这里镜像拉起来后无法正常进入数据库,一查发现并没有任何的yashan进程,那么合理怀疑是镜像制作后数据库实例需要手动启动。
也就是说需要补充一个数据库实例的启动命令作为镜像的入口命令。
继续官网查资料,可以看到官网在数据库22.2版本和23.1版本提供了两个实例启停的操作指导。
其中23.1版本是使用yasboot进行实例启停,但本次制作镜像并没有使用任何和yasboot相关的东西,所以主要参考的是22.2版本中的实例启停方法,即使用yasdb open这个命令来启动实例。
在刚刚Dockerfile的最后添加一个CMD source ~/.bashrc && yasdb open
,完成镜像Dockerfile,重新制作镜像。
这里需要source的原因也是因为yasdb这个命令需要依赖yashan相关的环境变量,否则启动容器时会报错。
六、启动容器并使用
这里需要注意的是看到docker logs中有明确的实例启动字样,就说明数据库实例已经正常拉起,可以使用了,现在进入容器看一下。
可以看到实例状态是open,说明YashanDB已经正常运行。
也可以使用官方提供的DBeaver连接到容器中的数据库进行操作:
需要注意的是我在启动容器时,把1688端口映射到了主机上的1692端口,所以这里DBeaver要从主机的1692端口去连接数据库。可以看到测试连接成功,数据库版本为23.1.1.100。
七、小结
到这里,YashanDB个人版的镜像制作就完成了,有需要的同学可以根据上面的流程自己制作一次yashanDB的镜像,想必可以对yashanDB有更深的了解。
不过本次有一个遗留下来的问题,那就是在镜像制作过程中使用yasboot安装数据库。23.1版本文档中没有展示脚本部署的方式,而是以yasboot安装方法为主要推荐的安装方式,暂不清楚YashanDB官方做出这种调整是否是因为脚本安装会出现某些问题(虽然我目前使用起来并没有发现和yasboot安装的数据库有什么区别),有兴趣的小伙伴也可以一起来探索。