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

Posted Gauss松鼠会

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生使用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 commit的方式制作openGauss镜像的主要内容,如果未能解决你的问题,请参考以下文章

云原生使用Dockerfile制作openGauss镜像

云原生使用Docker部署openGauss

云原生之使用Docker部署Affine知识库工具

云原生之Docker实战安装docker镜像分析工具Dive

云端干货|如何使用Docker制作镜像

docker--docker commit构建docker镜像