云原生使用dockercommit的方式制作opengauss镜像(代码片段)

Gauss松鼠会 Gauss松鼠会     2022-12-01     161

关键词:

前面一期介绍了使用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: 一款高性能、高安全、高可靠的企业级开源关系型数据库。

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

云原生使用dockerfile制作opengauss镜像(代码片段)

目录环境准备docker安装&配置生成openGauss3.0.0镜像验证容器镜像容器镜像是一个不可变的只读文件,基于相同镜像文件创建启动的容器,都将获得完全相同的Docker容器。容器是镜像的实例,具有生命周期。之前几期... 查看详情

docker--dockercommit构建docker镜像(代码片段)

...己的镜像,那么我们可以通过2种方式来实现方式一:  Dockercommit方式二:  DockerFile一.dockercommit 命令介绍如果我们在已经运行的容器上作了一些调整和修改,或者新添加了一个新的功能,那么,我们就可以把这个运行的容... 查看详情

dockercommit制作镜像(代码片段)

使用dockercommit命令制作tomcat镜像。#1.通过ftp工具将jdk安装文件上传到linu宿主机中jdk-8u161-linux-x64.tar.gzapache-tomcat-7.0.47.tar.gz#2.拉取一个基础镜像dockerpullcentos#3.运行容器,并进入容器dockerrun-it--namecentoscentos/bin/bash#将jdk 查看详情

云原生之kubernetes实战使用yum方式部署kubernetes集群

【云原生之kubernetes实战】使用yum方式部署kubernetes集群一、环境规划1.节点IP规划2.本次k8s部署介绍二、环境检查1.检查docker状态2.检查节点系统版本3.检查防火墙状态三、安装前环境配置工作1.关闭swap2.开启内核对流量转发3.关闭sel... 查看详情

docker笔记三docker镜像制作

Docker笔记三Docker镜像制作1.Docker镜像制作方法:dockercommit保存当前container的状态到镜像,生成image。dockerbuild利用dockerfile自动化生成image。2.制作方法dockercommit方式#启动镜像名称为centos的一个容器(container) [[email protected]&... 查看详情

docker笔记三docker镜像制作

Docker笔记三Docker镜像制作1.Docker镜像制作方法:dockercommit保存当前container的状态到镜像,生成image。dockerbuild利用dockerfile自动化生成image。2.制作方法dockercommit方式#启动镜像名称为centos的一个容器(container) [[email protected]&... 查看详情

下一代企业it架构:云原生架构

目录引言什么是云原生架构云原生架构设计原则 服务化原则弹性伸缩原则可观测原则总结引言随着数字化进程不断在各行各业广泛而深入发展,无论是大公司还是小公司都面临着数字化进程带来的挑战和机遇。而在数字化... 查看详情

下一代企业it架构:云原生架构

目录引言什么是云原生架构云原生架构设计原则 服务化原则弹性伸缩原则可观测原则总结引言随着数字化进程不断在各行各业广泛而深入发展,无论是大公司还是小公司都面临着数字化进程带来的挑战和机遇。而在数字化... 查看详情

docker镜像构建(代码片段)

...建议。通常镜像的制作有两种方式:使用现有的容器使用dockercommit生成镜像使用Dockerfile进行镜像构建   采用dockercommit生成的镜像实际上是容器内的文件系统进行修改在进行提交,而运行的容器实际上是在镜像的文件系... 查看详情

大话云原生微服务篇-五星级酒店的服务方式

《大话云原生》系列文章期望用最通俗、简单的语言说明云原生生态系统内的组成及应用关系。此专栏的前两篇文章《【大话云原生】煮饺子与docker、kubernetes之间的关系》《【大话云原生】负载均衡篇-小饭馆的流量变大了》欢... 查看详情

云原生是什么?云原生最近又火了

云原生最近又火了前言一、云原生是什么?二、云原生的核心三、云原生的正确打开方式四、云原生的优势前言    最近云原生特别的火,所以就特地了解了一下。本文主要记录云原生是什么,云原生的核心,... 查看详情

云原生核心技术之——容器

导言:作为一个从青少年时代已经步入“中年”的Linux后端服务开发工程师,很多年前深受应用部署方式的困扰,但自打携团队用上了容器技术后,拯救了无数中青年工程师的心情和爱情时间,不信自己看……一、应用部署方式... 查看详情

必选云原生数据库的原因

...c;点击进入:https://click.aliyun.com/m/1000370368/前言随着云原生的高速发展,打破了企业传统的部署方式,以及开发主线和运维方式。可以说云原生的诞生以及发展,促使了企业的技术变革和进步。作为云原生领域的数... 查看详情

云原生devops:集成harbor(代码片段)

@TOC一、Harbor介绍前面在部署项目时,我们主要采用Jenkins推送jar包到指定服务器,再通过脚本命令让目标服务器对当前jar进行部署,这种方式在项目较多时,每个目标服务器都需要将jar包制作成自定义镜像再通过docker进行启动,... 查看详情

云原生-dockerdocker镜像制作上传dockerfile命令解析(代码片段)

场景在实际业务场景中,需要制作多个不同版本进行镜像使用,如maven版本、JDK、openJDK不同使用等,所以需要做多个针对不同版本做不同的镜像。这里记录一下之前devops用的openJDK版本、某些部门需要用orcleJDK、特此需... 查看详情

云原生技术容器编排学习(第四集)(代码片段)

1、简述操作k8s集群可以分为两种方式:使用kubectl命令行工具;通过Dashboard页面可视化操作。Dashboard在k8s上是以插件的方式安装,集群出现问题时可能无法正常显示,还需要使用kubectl命令行工具来排查问题,... 查看详情

使用dockerfile构建docker镜像

...进入容器安装所需要的文件,配置,变量等,完成后使用dockercommit提交成为一个新的镜像,第二种则是通过编写dockerfile文件,进行镜像制作,使用docker build命令进行镜像的构建。第一种方式可以看到镜像的生成过程,但是不... 查看详情

对于云原生数据系统的思考

在设计云原生数据系统时,并没有特定的托管基础设施、编程语言或者设计模式。构建云原生系统有多种多样的方式。让我们来看一看云原生架构应该牢记的设计原则,以及一个优秀的云原生平台具备哪些特征。一、云... 查看详情