云原生使用Docker部署openGauss

Posted Gauss松鼠会

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生使用Docker部署openGauss相关的知识,希望对你有一定的参考价值。

Docker是一个开源的应用容器引擎,让开发者可以把应用及依赖包打包到一个可移植的容器中,然后发布到流行的Linux或Windows机器或虚拟机上。openGauss是一款高性能、高安全、高可靠、高智能的企业级开源关系型数据库。openGauss 3.0.0 发布后,云和恩墨制作了docker版本。基于此, 我们可以不需要使用原始安装包和一系列安装配置,可以直接运行docker镜像的版本。本文主要介绍通过Docker安装openGauss 3.0.0,方便DevOps用户的安装、配置和环境设置。

目录

1.安装Docker

2. 配置Docker

3 拉取openGauss镜像

4. 开启实例

5. Q&A


1.安装Docker

1.首先准备一台x86_64已安装了CentOS 7.6的服务器。我用的还是上次centos安装时找小伙伴申请的华为云ECS服务器,不过卸载掉了已安装的openGauss。
2.(可选)配置yum源。yum是centos下更新、管理软件的命令,yum源是yum命令去哪里取安装包的地图,yum命令查询yum源也就是repo文件上配置的地址去取相应的rpm包进行安装。
常见的yum源:华为云、网易、阿里云等。我使用的是华为云的镜像 https://mirrors.huaweicloud.com/home ,需要先注册。然后按照图片指示和网站描述的步骤和命令进行操作,注意换一下CentOS的版本。执行wget 获取repo的时候,如果执行失败, 可以尝试把https 换成http。

 

 如果你可以直接执行 yum search zlib-devel 而没有报错的话就说明无需额外配置,可以直接下一步了。
有些公司内无法连接公网的需要自己配置相应的公司内部的yum源。
3.然后下载需要的安装包。

yum install -y yum-utils

等待下载完成。

 4.设置镜像的仓库 。这里我还是使用的是华为云的镜像,然后按照图片指示和网站描述的步骤和命令进行操作,注意根据OS切换页签到Fedora/CentOS/RHEL这里。 PS: 这个也可以是其他网站的源,网上有很多,这里我就不再赘述。

 这里第2步执行wget 获取repo的时候,如果执行失败, 可以尝试把https 换成http。

执行 sudo yum install docker-ce 的时候要根据提示输入y ,等到提示Complete ! 就安装好了。

5.启动Docker,状态为active(running)就OK。

systemctl enable docker 
systemctl start docker 
systemctl status docker

2. 配置Docker


1.设置docker加速。由于国内直接访问docker hub网速很慢,拉取镜像的时间很长。通常我们使用镜像加速或者从国内的一些平台镜像仓库上拉取。
创建 /etc/docker/daemon.json 新增内容 。

cd  /etc/docker/ 
vi daemon.json

配置几条国内的加速地址。我这分别是Docker中国区的、网易的和中国科技大学的。

 
 
        "registry-mirrors": [  
            "https://registry.docker-cn.com", 
            "http://hub-mirror.c.163.com", 
                "https://docker.mirrors.ustc.edu.cn"] 
 

2.重启docker。

systemctl  daemon-reload 
service docker restart

3.执行 docker info 命令查看最后是否有新加的registry-mirrors部分。

4.拉取hello world验证下,如图所示表示成功。

docker pull hello-world


3 拉取openGauss镜像

openGauss 3.0.0 有企业版和轻量版。轻量版定位是在软硬件资源受限场景下仍可使用openGauss,但是保留了企业版大部分的特性,轻量版通过参数默认关闭的特性:Ustore、Asp、增量检查点、双写、列存、段页式存储等,还有些不支持的特性如ORC文件访问、Kerberos安全校验、AI、全密态数据库、CM、OM。工具也进行了精简,保留了用户常用的gsql、gs_ctl、gs_guc、gs_dump、gs_restore等工具,和安装部署、升级的工具liteom。但是对于个人或者实验环境也足够了。
前两部稍微繁琐一丢丢,但是配置好了一劳永逸,可以随意拉镜像了。openGauss镜像这里我们用的云和恩墨的镜像。

 

从3.0.0版本开始(包括3.0.0版本)

  • 容器使用Lite版安装包,基础镜像的大小进一步降低到100MB以下;
  • 默认启动后的空载内存占用小于200MB;
  • 在容器内部的操作系统级别添加vi,ps等基础命令。

因为3.0.0是最新版本,所以latest就是3.0.0。这里,直接用的指定版本。

docker pull enmotech/opengauss:3.0.0

 执行docker images查看下我们的已有镜像,enmotech/opengauss:3.0.0 也在此列。

4. 开启实例


1.镜像拉取后就可以一条命令启动实例。GS_PASSWORD=Enmo@123 可以修改成自己熟悉的密码。

docker run --name opengauss --privileged=true -d -e GS_PASSWORD=Enmo@123 enmotech/opengauss:3.0.0

GS_PASSWORD:设置openGauss数据库的超级用户omm以及测试用户gaussdb的密码。如果要从容器外部(其它主机或者其它容器)连接则必须要输入密码。
GS_NODENAME:数据库节点名称,默认为gaussdb。
GS_USERNAME:数据库连接用户名,默认为gaussdb。
GS_PORT:数据库端口,默认为5432。

除了GS_PASSWORD外都可以使用默认值。若要设定非默认值,和GS_PASSWORD一样使用 -e 设定。

 2.进入容器,测试连接

[root@pekphisprb70593 dockerfiles]# docker ps 
--获取CONTAINER ID 
[root@pekphisprb70593 dockerfiles]# docker exec -it 1d54ee4a5f40 /bin/bash 
--把这个命令里的 1d54ee4a5f40 修改为实际的ID

 3.然后就和在普通服务器一样操作了。openGauss镜像配置了本地信任机制,因此在容器内连接数据库无需密码。

root@1d54ee4a5f40:/# su - omm 
omm@1d54ee4a5f40:~$ gsql

 使用docker安装确实简单又快捷。

5. Q&A


1.Q:docker 启动实例的时候报错“docker: Error response from daemon: Conflict. The container name "/opengauss" is already in use by container”,但是docker ps又查不到,而且也连不上 ?
A:先执行docker ps -a 查看所有进程,看到处于Exited  状态。之前已经启动过opengauss这个名字的实例了,再次执行的话就会报冲突。至于查不到,原因很可能是启动后重启了docker。



解决办法有两个,一是创建实例的时候修改实例名,如opengaussNew;二是删除原来的opengauss实例,然后重新启动实例。

docker rm 实际的CONTAINER ID

 2.Q:如果不需要了,要怎么卸载?
A:如果不需要了,就可以不需要卸载啊后处理,直接通过删除容器的方式删除数据库。

−删除容器

docker ps -a 
docker rm 实际的CONTAINER ID

−删除镜像

docker rmi -f 镜像ID

openGauss: 一款高性能、高安全、高可靠的企业级开源关系型数据库。

🍒如果您觉得博主的文章还不错或者有帮助的话,请关注一下博主,如果三连点赞评论收藏就更好啦!谢谢各位大佬给予的支持!

云原生使用Docker commit的方式制作openGauss镜像

前面一期介绍了使用Dockerfile制作openGauss镜像,这种方式是根据打包脚本全新生成一个镜像,属于无中生有。本篇介绍使用docker commit的方式制作openGauss镜像,这种方法是根据已有的镜像加上自己的定制,生成新的专属镜像,使得数据作为镜像的一部分保存下来。

文章目录

操作步骤

使用docker commit的方式制作openGauss镜像,整个过程主要分为三步:
1.运行容器
2.修改容器
3.将容器保存为新的镜像

比如前期已经build的opengauss 3.0.0 镜像。先使用该镜像创建启动了新的容器,然后进行容器修改,创建表test和插入了数据。

create table test(id int,name varchar (20));
insert into test values (123,'mutouren');

现在容器/opt 创建一个空文件dockertest

最后利用已有的容器就可以制作一个新的镜像,预期新镜像会包含已有的表test和创建的文件dockertest。

docker container commit -m “add new file and table” -a “xxx”
dc910aeaac18 opengauss:test

参数说明:

  • -m: 提交的描述信息
  • -a: 指定镜像作者
  • dc910aeaac18:容器 ID , 注意不是镜像的ID
  • opengauss:test : 指定要创建的目标镜像名

下面来看下使用新镜像是否把修改点都同步了。

上图可以看到 新建的文件dockertest存在,但是之前新建的表test does not exist? 为什么数据不在呢?
因为openGauss的data目录在 /var/lib/opengauss下,commit命令打包时没有包含数据变化,所以不在了。那问题应该怎么解决呢?目前想到有3个办法,要是有其他大佬知道其他更简单试用的方法请留言或者私我~

解决办法

  1. 如果确实有好多SQL需要执行,那就保存个SQL文件,启动新容器时,从宿主机拷贝到容器里执行。这样 即使更换宿主机也无所畏惧。
[root@pekphisprb70593 etc]# touch a.sql 
[root@pekphisprb70593 etc]# vi a.sql 

–把要执行的sql拷贝进去

create table test2(id int,name varchar (20)); 
insert into test2 values (123,'mutouren'); 

:wq保存
在宿主机上执行命令,将宿主机/etc/a.sql 拷贝到opengausstest容器的/opt目录下。注意这里即使容器有启动也可以正常拷贝。

docker cp /etc/a.sql opengausstest:/opt 

–进入容器执行sql文件

docker exec -it opengausstest /bin/bash 
gsql -d postgres -p 5432 -f /opt/a.sql 

–验证下

su - omm 
gsql -d postgres -p 5432

缺点么,操作麻烦了一丢丢,但是万一SQL执行时间较长的话就比较恼火。

2.使用前面讲的容器数据卷的方法。使用旧镜像启动容器的时候,就将容器的数据库data目录挂载到linux宿主机目录上。这样,制作出的新镜像在原来的宿主机上启动时,依旧指定原来的宿主机挂载的data 目录,也能实现宿主机上的数据持久化和容器间的数据共享。例如 下面的 -v /enmotech/opengauss:/var/lib/opengauss ,将容器的/var/lib/opengauss 挂载到宿主机的/enmotech/opengauss目录下。

docker run --name opengauss --privileged=true -d -e
GS_PASSWORD=Enmo@123 -v /enmotech/opengauss:/var/lib/opengauss -p
15432:5432 enmotech/opengauss:3.0.0

但是,这样的话如果更换宿主机或者宿主机重装系统或损坏就不能满足要求了。
3.将容器的数据目录先拷贝到其他目录,然后commit。新镜像启动时使用新的数据目录。
既然已经知道“openGauss的data目录在 /var/lib/opengauss下,commit命令打包时没有包含数据变化”导致,那我们就考虑换个数据目录存储。具体操作如下:
–先创建备份目录

mkdir /data2

–将容器的数据目录先拷贝到备份目录,注意属性不要变

 cp /var/lib/opengauss/data/* /data2/ -rfp

–保存新镜像为enmotech/opengauss:test

docker container commit -m "add new table test2" -a "xxx" 74784877f3c4  enmotech/opengauss:test

–使用新镜像启动时,指定PGDATA为新的数据存取路径

docker run --name opengauss_test --privileged=true -d -e GS_PASSWORD=Gauss@123 -e PGDATA=/data2 enmotech/opengauss:test

这种方法验证也是OK的。
【小结】本篇介绍了使用Docker commit的方式制作openGauss镜像以及如何解决数据丢失问题的方法。

openGauss: 一款高性能、高安全、高可靠的企业级开源关系型数据库。

🍒如果您觉得博主的文章还不错或者有帮助的话,请关注一下博主,如果三连点赞评论收藏就更好啦!谢谢各位大佬给予的支持!

以上是关于云原生使用Docker部署openGauss的主要内容,如果未能解决你的问题,请参考以下文章

云原生之Docker实战使用docker部署webssh工具

云原生之Docker实战使用Docker部署部署DoClever开源接口管理平台

云原生之Docker实战使用docker部署Ghost个人博客系统

云原生之使用docker部署qbittorrent

云原生之Docker实战使用Docker部署jpress开源网站

云原生之Docker实战使用Docker部署NodeBB社区平台